  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。. u1 Q* @0 ~" r- s/ C
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
0 j( E& k* K Q, s/ D用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
% [) X! k, m; Q, b, e
+ e/ B6 o# Q2 `3 f2 q$ X: o H
1 u- U" U, h. P7 M问题; |2 {# o: H& Z: H' D9 a
: o3 J4 G6 D. T! i: E
1.以下哪个不是合法的电子邮件地址?9 E- j. C+ E. s# M# f6 ?- W8 b/ C
2 ^5 B' {* n- c' t
A.john@89w.org" S9 I: F4 F4 W6 _* ~
B."John Coggeshall" <someone@89w.org>
5 ?9 |9 U a3 ~: U2 u1 z# Z6 o- wC.joe @ 89w.org+ F. W9 C4 g5 [% F, m! P
D.jean-cóggeshall@89w.org3 k+ ^* a& Y* m) l2 @! Z
E.john
! _6 u# j1 M; j! A Z: u- \; y$ d9 A! J& s( a! }5 k5 I3 r3 f
/ n6 t8 e4 _9 l5 J% u2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)5 e& h% j- M: j
6 B- h# D, t7 N; XA.Windows/Novell不需要第三方软件的支持就能实现该功能
) ?6 p+ I) } J1 S7 S! KB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。" N$ [: {) v1 N7 f% D' I2 \4 [6 c
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送( @( \, Q( w6 F7 q. O1 p6 w! i
D.有可能完全相同,这取决于sendmail_path的配置3 L% O; q% t9 E$ W) }0 `9 A
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口1 _/ P8 A. D$ O" D+ V& o
7 B" j3 [4 ^# U8 r- V' P
! [9 l. U W4 I% V2 U7 r) Z$ j
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?- K' i6 T1 ~! ?9 }. K+ U
3 O; w) n) G, A4 a" z1 b, ?$ F
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
2 X8 j" s% H- g S3 G) q: oB.用PHP代码,通过SMTP直接与MTA连接。
4 Z% s) r% ]' _0 _# dC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
: y: H( b! E1 Y& ZD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。$ c- `' u. [ O, K- L( k0 m
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾/ b$ y9 r. f4 M; C
; g3 p% Q' V* {6 g( p* U
! M$ |% C6 \" O* B1 A4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
5 {; o: F% q. T' w- ~. O: d u+ I* q$ k
答案:____________
4 a% @, O4 |$ N; g' t+ P( I9 w
4 n4 h) c+ N& q5 X$ ? ?$ h5 }; C
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
% u0 }: A0 B7 H' j) Z( f" a1 M8 n# }$ }" \) U8 ^! ~# D! q
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示" K9 ]8 s8 O! P7 S; X
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片. l/ o- y s2 W4 k$ v5 Y! ]2 v
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID3 g1 ?4 g* k/ P$ H, ?7 V& w7 S
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名6 n: g; J) n4 c8 h
E.只有一个答案正确; O6 o$ O# D( i/ B6 j
$ y. I' E+ I* ?/ A& _0 w! L. u" C# I
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?9 t9 @7 k: Y* w, d3 r( H
# U4 E# Y# j/ V! W$ E# R
A.从UNIX或Windows/Novell发送邮件时都会用到
# T% s% H5 D3 V: H0 f" g9 iB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
, y M( b" ]8 V0 C, vC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时9 V) }6 Z$ h& s* p& U
D.PHP里用不到这个参数" x' x6 l5 V+ M# A
' _1 b7 B6 @" l& T9 `* o! ?
) j& U$ N- J6 W2 t
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?; c, W0 _) B5 d7 S. P9 ^6 B j: I
& Y6 u" H. H% eA.只有在发送非普通文本(ASCII)数据时- |2 e* H: W& Y2 U8 j/ z
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)& n$ r) N3 l; S/ e) D
C.任何时候都可以用它来指出MIME的编码类型
% J, y; V; r% ?$ \0 |0 }D.只能用来指定特殊的编码格式(例如base64) a5 O. }. T9 S* q$ b; M& S
E.以上都不对3 }) Q0 x0 ~- E
5 q6 z/ y8 o/ o! G* n* L$ F6 n* \8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
4 f. N2 S, X5 X7 x2 w# s' m* {5 r: F b% V% s3 w( C
A.分隔符至少要8个字符; U8 l5 k- s; x3 {
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)9 j, Z' s5 J1 r
C.分隔符在MIME邮件中必须是独一无二的5 e2 s- L- F" D+ A
D.分隔符不能嵌套的其他分隔符中( g" ^- }3 f* {6 m' M/ Z
E.用什么做分隔符都无所谓6 ?+ ^3 d5 h4 j0 [9 U! \( ?7 q8 D, a6 Q8 f
. U+ `# m1 L. S; D; s! `
* O# O7 \1 b3 I) V2 u: i9 D5 o9.考虑如下E-Mail:5 L! A$ J9 H% _. e' `" E
' L) r5 o3 q+ w9 R; J/ a" g) MFrom: John Coggeshall <john@php.net>4 n; J. U# t# k. w6 s
To: Joe User <joe@example.comt>
$ L0 J6 d2 C1 K' I6 ~# {5 YSubject: Hello from John!
! }3 j g6 ]; hDate: Wed, 20 Dec 2004 20:18:47 -0400' e/ [! R5 p4 s2 P! V
Message-ID: <1234@local.machine.example>
4 o) ?- f+ U: [" D) cHello, How are you?
5 j+ h3 @# A0 t) S8 ~) t, O/ H5 Z! T8 ^
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)7 E$ R) O8 v$ s! M1 H( Y" t0 ]
: G: ~8 M# o( ` Z: K3 L9 LA.MIME-Version
6 D5 h1 _! `$ K% E1 L+ x7 sB.Content-Disposition
! L2 Z2 Y) G& cC.Content-Type. \- k" D; X; t. X* T3 s7 |# _
D.Content-Transfer-Encoding
4 e5 t. y. U' z% UE.Content-ID; w, r w# Y6 I3 w
0 M9 }1 w# p1 ^" n A
0 e& ~% A" x( t6 ~- m10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
* M7 w- v) O, y& W8 v6 s7 W
6 W2 s3 Z' o, j# [7 O- sA.multipart/mixed
- b" c* f* j9 Y- P, e: I8 ?B.multipart/alternative- n: Q" A# l& G" O3 w
C.multipart/default- H1 N( Y1 v: G e1 E: @7 D. ~
D.multipart/related
+ w4 g# e) d* T I1 yE.不可能用content-type实现
: d4 S$ V; d" g& R0 ?+ z6 B9 ]/ e5 {( T2 A6 X6 w
+ I8 X/ M% D4 u& l
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么? M' X4 T& T w7 z+ w9 l. L
/ V' h: m6 ?: i& S, iA.安装sendmail服务器# }% Q. \9 j" {! I4 z
B.安装Microsoft Exchange
0 W: L6 I0 n3 fC.在你的电脑上安装任何一种邮件服务器2 G+ o7 ]6 ~8 {/ a
D.改变php.ini的设置
& r6 _2 b$ r9 q L& b7 fE.写一个连接公共电子邮件服务器的脚本# r. t, M+ s8 Y/ v
9 ~2 L K1 `' b0 m+ H- I6 ^; w% D+ \+ F* E }8 g" R( I
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
; d. S# @7 V! i6 M* Z2 \
9 [& M' G1 n0 d Z; KA.使用GET方式传值
! Z* i) u; E6 t) C7 ^B.用htmlentities()处理电子邮件地址
4 o! ^4 O5 v* \9 x' E& q+ @3 RC.使用POST方式传值
( Y! g9 I& N' F4 W1 c- W1 R: \D.用htmlentities()处理邮件正文
% o1 |' m C1 z2 gE.确保填写邮件地址的文本域不能有换行符
) [$ T! u) V+ H& N/ N; i6 _. }$ _8 t% m3 i1 }
! }* v7 h- t. y% {4 ?
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
4 h+ \+ v, S: `1 o* |; b& r8 W! [- Y6 _6 }- t# e
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
6 X) O$ C5 F8 W, ZB.把它存在文件中,并用base64_encode()进行编码
! C, n, `" q2 J: o" b$ q3 BC.用serialize()把它转换成数组) N& Z6 N! Y# u+ S
D.用serialize()把它转换成数组,再用base64_encode()进行编码* Q; h& J, f2 P+ Y
E.把它存在文件中,再用convert_uuencode()进行编码
: E3 J4 i. l }6 V
U, ?3 [2 g e2 U8 z6 H1 }/ k. ]2 ~" {
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
1 C# G: Y+ }+ d4 d' j( m9 x, p; M2 ^. m( v& u P! p
A.堆一个检测脚本出来& x p) {4 E$ @
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型+ f# R/ \6 u1 z+ T; @* e/ J' r
C.写一个识别文件MIME类型与内容是否相符的函数& V* v4 [; K3 B4 ~1 s+ W6 d
D.使用mime_content_type函数
; }0 ]0 _3 U$ u& wE.把文件上传到外部服务器上3 f& B8 {3 b4 E6 h+ k/ J# k9 [6 w
' E$ m! z8 ]1 Q6 a
: f) [& W1 u- G) c0 D5 C2 M# h15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
& l! c: b% s( V4 O# W) z+ [' l! p1 F3 q
A.添加一个From头信息
& h9 R# q8 \( n6 L. C, FB.使用-f参数
1 i# V- H+ {: h' {& j) x: m* ]9 WC.添加一个Reply-to的头信息
0 W( [: W; V+ y4 |0 t3 P/ _5 FD.确保运行Apache的用户有修改sendmail设置的权利% W# G$ R/ M) ?+ b Q3 L7 k* J- h
E.确保Apache在root用户下运行) n. b4 z2 G( Q! `& n
答案速查) J# ]6 [5 K! x D
1:D
: {0 @3 ^; T+ ^2:AD
( E% N2 K0 [+ u; H! H+ _3:E
( F$ X0 Q$ g6 a# E# {" J+ w2 B4:Content-Type:MIME
8 N( m) |8 w4 l, r( E e* Z2 l5:BC2 D5 U& a/ f& t' k
6:A2 L. C4 w6 c6 u$ L2 K
7:C
A& t" z( G+ u& o- R* p i8:BCE
! S' l$ x# g1 k$ ?. f9:ACD
O! r, s, V1 A/ \. o10:B# T' r4 b' \. Z6 N' h9 l
11:D
" l# S {: p9 D" m) h. f! V7 R12:CE" H* X3 o4 m/ p9 g; w
13:D; Z, q8 l5 L0 l, E4 p, h) `
14:D& j& |/ Z* k0 P0 `( o/ h3 [
15:ABD2 M! o0 f, v; w
# d+ L. N; k; F
% A+ T( H$ p* k3 W1 O
+ i5 H" s% x: y7 f1 ~- W% y答案详解. C3 m/ h8 a$ [- @; u
* a" z# S* D$ I" l; N1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
! h, [& \( l. ~7 y/ b
. ~% n/ @& L5 |$ E3 c2 q2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
- K8 R+ ?9 Y1 N7 g$ o9 l+ m& _- q: Z! @, a0 N
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
$ ?# y4 W3 {- f2 [0 ~5 @1 u+ e& I+ F B9 k5 _; L# e
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。3 O* p1 G( v0 P6 H8 }
6 b( a/ d; Q6 z# x7 m
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。7 Y- B6 k1 a' u
2 T8 B5 w% d5 U, O0 R" m- X6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。/ I6 `$ c3 i7 I( j8 Y
6 m$ f& |+ ?7 ^" e m: g7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
2 Y9 u( Q4 h% J$ B2 b) ]: ]! g% d7 B3 x" Z% M
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。 M0 ~3 Y+ G. `8 j
S( k. \/ e' }9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
6 E& ]/ S$ A7 C$ P) }0 }8 b' o( A
' g0 ]6 [9 G" D0 E' b8 s10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
8 b% |; g/ _5 y5 G) M. Q, N& x9 w* b- w0 v5 k
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
( V \7 R' Z* v1 J z9 q; G2 E5 f/ ?* S) s6 ^
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
& _- k" o- }5 R6 a( N
6 J B$ P6 j. c' o4 ?13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。 ], W1 X0 O( [. O! K
5 T' i8 s# `7 x( P K7 G; O1 H6 f/ J( r
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
; C" L' r, T9 g% j: o1 t/ E0 Q' C0 j/ d/ n1 y, M/ {) h
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|