返回列表 发帖

[Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
* [3 y/ r, l& k$ g; L3 N) E" X还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。' L9 t) E1 T% D
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。4 `( K' Y9 i0 M+ D' R6 V& f; y# _, ]5 S

2 n3 z4 b; R1 ~( d3 E, V
( p$ T7 j: d/ @: y  M- `- Q6 }问题
2 @+ L  [* G4 i* E0 A
0 C- I3 C# Q- w; n% J9 P& w- ]% U6 O1.以下哪个不是合法的电子邮件地址?
6 X# i9 [1 Q2 X( F& v
1 ^6 E3 B. K' Q6 c& |" ^A.john@89w.org# H3 K( f9 C% `4 N2 I5 |; ?  c( f! _
B."John Coggeshall" <someone@89w.org>
% _+ t. O" l7 J3 V! z; O1 DC.joe @ 89w.org
8 q- }3 t2 {  m/ f6 x, @D.jean-cóggeshall@89w.org
! F. Z+ N* R  ^0 \  `E.john
5 c9 @$ w; c$ O
; R! r! w. F. w, N5 G1 b. _" j4 P
7 O/ [) g! v. R2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选); \; }0 a; V+ W/ m. o' \

& g& @: I  E# Z; E; P" M# K( j* nA.Windows/Novell不需要第三方软件的支持就能实现该功能0 ~( V& U: b, D5 z
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。$ n8 T- F& r# T' y
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
9 ^' A7 E) c* m. [D.有可能完全相同,这取决于sendmail_path的配置0 E" n" ^+ Y6 g$ _0 p
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口9 R% w, Z; \7 G& b  L# ]7 D+ F

8 S( G/ X" w/ N; r; {( _
& B9 U! b4 b1 s* C( E- \% h( K  N3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?, O. A' B( j7 K( t
. o3 Z) l& `7 ?7 u, G5 K/ N3 e& F
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
% u( B& k2 F7 @1 @2 qB.用PHP代码,通过SMTP直接与MTA连接。
- s4 H+ N+ S6 _C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。2 o# |  j$ u- ^# v1 y
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。) s0 y' V5 S- ]! K. j, K. A3 p
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾8 k( M2 F3 F, @. L2 p0 B' q
% u' p1 ?" S+ P# [6 ~  O

3 u0 ^6 \9 y9 i- r: T4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?6 ~- c) O  y+ k2 L

" n% o. E0 q$ T1 Z: w( u5 h答案:____________
+ B4 v0 G7 Y" M% K( u; k( {. l+ `3 D1 X3 c% u

8 g+ y* t/ H7 k5 U$ B5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
, L2 u" p3 v( s5 D* M( u5 ~0 K5 Y6 x9 y
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示3 l2 k" [# ?' ~
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
) j2 `* G( v+ k: D/ C: mC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
& z9 @4 \. d% f1 g3 Y/ jD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名& V8 D8 }5 g7 r6 G  g7 H4 i
E.只有一个答案正确
6 i" U. E: t, f* j+ w' E: n( s0 S# f3 x& f( \4 W
  l' s8 v; q6 `% y+ R) \
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?: s4 g! N2 x/ H3 R0 u

0 z, b7 @) l% G9 Z# H3 e  OA.从UNIX或Windows/Novell发送邮件时都会用到
8 Q& k& i9 p- U7 f! O* g. r' Q( uB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
8 e  t; p; U; UC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
$ S; Y: W' E2 E. ED.PHP里用不到这个参数: r  a# v" h) R; i* _) S! E, s
% n  z( n8 ]8 i8 ~5 L1 ^
' M+ M9 \* Y: g+ H2 S) {4 x
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
1 \9 W) b" [, b, A6 o4 V
' E# G$ a. p: _! s  k4 i9 tA.只有在发送非普通文本(ASCII)数据时$ U0 T' M7 R+ }1 n5 z  N9 j0 H/ Y( M
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)# K, k4 p* A7 \6 b1 L
C.任何时候都可以用它来指出MIME的编码类型$ H" X* O" h4 Z
D.只能用来指定特殊的编码格式(例如base64)
2 v4 b# @1 s& L. K- c' B% v7 J2 kE.以上都不对: _9 x+ L4 B/ ^. D( h. V' a

; ~) y8 D; Z% U! G8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
6 Z+ W( h6 e4 w4 `2 l% W+ c& N+ J* }+ _: r# l" g/ Z
A.分隔符至少要8个字符
% @/ ^9 {) N0 s) F6 f$ g4 d4 \( XB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
/ Z1 m" ?& s4 z) AC.分隔符在MIME邮件中必须是独一无二的: H% h- N) e2 P$ L3 k) O
D.分隔符不能嵌套的其他分隔符中' w$ A5 p; T1 H3 X
E.用什么做分隔符都无所谓
" \0 |. A0 i9 @/ A$ b) P( W+ @" k# G( A/ w6 Q

' s6 W1 @) P$ T' t8 v/ o+ z9.考虑如下E-Mail:
+ V# O3 B3 N% G. V+ X) Z4 j9 }! {9 Z+ U- b$ |+ K- C4 @3 {4 I8 q
From: John Coggeshall <john@php.net>
/ Z& q4 O, A  g. ^To: Joe User <joe@example.comt>
. b2 z, \9 t" h5 K2 G4 LSubject: Hello from John!
. q: E( t/ e3 A3 dDate: Wed, 20 Dec 2004 20:18:47 -0400
& ^' A) b- L( I# O+ OMessage-ID: <1234@local.machine.example>/ u; O3 P- W; t( T6 m! I! D
Hello, How are you?9 o8 K3 n. @' a* a: A: x
. g# n, @% L7 e* }
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
! C# o: ]+ t9 V6 k& m
6 W5 r  p  J; H5 I% FA.MIME-Version0 M, @1 s: _, f
B.Content-Disposition
" r# X1 R" G, K  LC.Content-Type1 C) F# N4 \4 z" T& G/ l
D.Content-Transfer-Encoding7 [8 z+ C5 I; [6 G1 |  a
E.Content-ID
# ], D( Z- ]* G, n) A4 R) F4 K" N, Z% Y& }( y
* |0 }! b+ k9 A7 X; H. \6 {8 R
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
& T5 s# q# b' ]0 z$ `9 ?) f$ B4 i7 _: a
A.multipart/mixed5 U( q: V* q2 I, B) V, @
B.multipart/alternative
5 Z! l6 o8 P( A/ H# p* sC.multipart/default2 }' X$ P$ O% B2 t- r
D.multipart/related
: e  R+ `/ {3 AE.不可能用content-type实现# Z$ d& g; B' O0 W
0 @, g/ I$ X4 o

( x; Y. y& u' U4 S: \1 }11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?2 Z' K: }" F5 y( Y& E( Y' ~

; ]6 X! f# p3 B( i" j  H8 X2 JA.安装sendmail服务器
, V/ w" z) m- J0 M/ kB.安装Microsoft Exchange- t. b9 L; m% Q' g2 W
C.在你的电脑上安装任何一种邮件服务器
1 B, j# @& B; _& A* v' {D.改变php.ini的设置
. u5 O% F* k2 X5 B& q: [8 Y9 e6 HE.写一个连接公共电子邮件服务器的脚本( |; x9 [% _* P/ r* Q/ t5 A

+ G8 d8 h" b0 @
& G! G" o7 G& G9 U12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)' l7 D! B5 y% `5 t
; ?* Y! q& ?1 N& B8 F; F  H
A.使用GET方式传值
" W( u/ {$ D9 D$ n  R$ q1 nB.用htmlentities()处理电子邮件地址
: _! A  {1 ~! R% \* |& ?C.使用POST方式传值- t$ l) A: e+ w/ i
D.用htmlentities()处理邮件正文
; N" S0 N( t9 L7 D+ CE.确保填写邮件地址的文本域不能有换行符
& R: A) H6 k6 `3 m% ?
7 Q% x' u) z1 y0 M2 E( l
$ m; d3 s/ m% I13.如何将一个数组作为附件发送,并要能在接收后重新组合?( ~( }+ z6 h/ x

2 c" W2 v5 p4 n8 J2 e7 D" lA.用serialize()把它转换成字符串,再用htmlentities()处理一下% _- w, P) f3 f' V0 a% w8 O
B.把它存在文件中,并用base64_encode()进行编码
4 D7 k; `7 p/ wC.用serialize()把它转换成数组
! S: n3 A$ J% f* `4 B. x4 {1 zD.用serialize()把它转换成数组,再用base64_encode()进行编码
! O2 L' y' V0 o4 w' m# a2 k) c' G! FE.把它存在文件中,再用convert_uuencode()进行编码& X3 @; _- W& l" L& v! D) K5 S2 ^
: S& L# v% H5 R
2 r6 k, R7 }) [8 D
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
1 R% t0 @8 r* [% i! r, v
% j/ E  F; {, n: t9 l, r5 }A.堆一个检测脚本出来
: |% t* Q7 O% |. V5 P1 i, I! cB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
! B9 o+ K3 u4 k, sC.写一个识别文件MIME类型与内容是否相符的函数# v# w. e7 E7 {
D.使用mime_content_type函数
; S; C$ v1 c# `E.把文件上传到外部服务器上# R" r0 J- ^) H# G
# z% [3 S. T1 ~: Q0 B3 G

' g% _+ j7 x. C: ?15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)0 I- a" q( G3 A% g4 w8 ^" f

- Z5 j4 k) w2 U( D) e0 d2 }A.添加一个From头信息
$ c. @5 ~8 D& I1 ]7 ^  p, ^: bB.使用-f参数$ ]8 P& S$ s* w) @' ~; ?; D9 V
C.添加一个Reply-to的头信息
/ j7 v/ a" R6 k# m4 aD.确保运行Apache的用户有修改sendmail设置的权利1 p. U9 `6 b3 |2 ~7 X
E.确保Apache在root用户下运行& `+ [) b* |% k+ Y$ N0 N
答案速查+ f- l6 c; T# s
1:D
/ j# Q. `0 v, f: o0 D' y0 L# a2:AD, G2 V  H% r2 E  g! t1 i9 f
3:E
2 O, f1 A) L4 i) Y8 K$ r4:Content-Type:MIME0 [& \' }8 J- J2 D5 R
5:BC
: [. `$ b- u$ r3 v0 T2 u6:A
1 s6 g& }) y. L4 N0 r4 C6 ]7:C6 e) \$ h0 Z+ M* P1 v8 m
8:BCE! D) ^! V" f/ q/ ^- t' O, y  G7 \
9:ACD
& x3 d  N; P) y1 i10:B7 F! L6 X' h) D8 X' }
11:D( F6 N# H7 E2 k- x9 @+ N8 w% t
12:CE
0 o* f! r3 W7 Z7 f6 f13:D
3 M9 ^  L3 i! ^3 ]14:D
, Q) x! S8 U! E& R- z6 V, h: I3 Z15:ABD
. l8 W; d! [) w2 v7 G; U* d4 M6 X6 F* q0 L! T4 A; N5 [
% M& d' W9 V" z& J4 z# p: g; a, g

, s/ s$ Y3 p% t答案详解
, x. ^+ v$ G* S1 n
% K2 c$ T+ I$ t3 s! ?2 r# V1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。- o+ k- W% H. N# \
/ ~$ J) j- A: g- @  [  ^0 J* d. F* m! t
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。5 q& D, q  p- e8 u4 ~
0 B/ t5 j  u# S6 S
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。0 g; F6 T8 ^  l( k* H% P( Y
( I" d% H7 [+ Y' }, ?$ r
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。2 T/ v  ]+ n9 B0 h$ j1 e
& a% P8 D9 T( |# P
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
- r  J$ y6 E, I
7 n3 J! ^+ |" d, ?) x, ?6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。: r* h4 |) A, J5 x
" ]- |: M" A- \- S% c" X
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
$ F& C2 Q( ~( s6 _3 S4 e# P
: J8 p& e( ]" N$ C! y8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
; C7 C# a* m; f9 j
5 D0 G1 T. ^( j  B2 ^  K! a0 b4 H! H9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
* Y- F$ f8 A) }& M2 e) |: d  B( K' L, e
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。9 ]: c1 ~+ h# `3 e5 E9 H6 h* F

* Q+ h$ y5 v9 a7 P* k11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
$ I2 m0 o  q+ t8 @1 @$ _2 U1 v# u/ k
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。% N3 N/ G3 ]; M1 W9 ^/ K/ {
& X) O/ T1 _1 Z
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
& n  [+ _% E+ f2 {; u8 j5 t" m
  X& D$ N, z+ S8 ~0 `4 K14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
  A# w$ E2 U1 q: g7 K: a
# m9 p& l. x% l( Q8 S9 l9 I" E15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

返回列表
【捌玖网络】已经运行: