  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
' @7 ?; O9 Y; z6 [0 R4 x还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
! }% F( o! S, u0 l4 A/ ]9 Y用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。/ N; O m+ P7 h" J& C. N/ `
3 A6 c- I6 Q& y$ w: a
# r* r! Y9 q1 J2 S
问题
6 a* j5 J: x' }& d0 e
: m6 G0 ~) f/ w1.以下哪个不是合法的电子邮件地址?
# m, m ?' k+ u r' c1 t! \
6 |6 Y$ X- B* q6 T4 U3 zA.john@89w.org
9 O6 b3 q8 j" r eB."John Coggeshall" <someone@89w.org>$ `" _% G- {4 d: k8 C
C.joe @ 89w.org+ e7 M/ V- b& F
D.jean-cóggeshall@89w.org* a0 E( {5 S; j3 B
E.john x6 p) p- a% e2 d
" z8 b' _2 f! t1 ]5 v
& N3 ]9 \+ P- s- ^& O; k2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
% R* g3 k) |* v2 Q. n e! i$ U* X* O3 @8 F8 s5 a! E
A.Windows/Novell不需要第三方软件的支持就能实现该功能* G- l) z. I6 s! j9 p
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- S2 v6 i. F% D
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送; Y/ ~' x" j# S/ y2 X5 z3 R
D.有可能完全相同,这取决于sendmail_path的配置3 A, r* o: _# ^2 q/ ^
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
* m! ~% r1 u3 p9 f- V) a! X
5 B& U7 d, d, ]# [; W4 r
& X/ a/ Z) |5 |4 N3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
" y* o' B: A; [1 B# P% ~" g( `/ V$ ?" g' C# J7 M2 T/ \' x2 d
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数9 C l6 Z3 ?: H" }$ \3 t7 D
B.用PHP代码,通过SMTP直接与MTA连接。" Q2 F8 C+ I2 P- i3 w( u3 i
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。2 ?- k( p3 k% F9 e0 f* W
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。% `$ c+ @* a4 t
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
1 e M" g6 Y6 n& t
; e; j3 [; C/ e4 b" H5 T5 r5 j& e$ E/ v: J4 m5 ^) l j
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
+ c# ? R! H4 b& i7 n% ]+ s! O |' r, x7 D5 _, E
答案:____________
b" O3 B8 v) C) B
* n/ e" `$ ]4 O" x F& l9 j1 `1 I, y- v+ j# [) E
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
4 t$ T; L) T" j. O2 y* ]$ W8 s5 s% i: m
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
1 X, f2 w2 u2 D+ dB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
' [& R/ Q/ }9 q9 I# z! }8 H& CC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID& R8 }5 [" X+ o/ l, E x: B- \
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
! X/ X1 {- G& y% F& l' L/ a' }E.只有一个答案正确( T8 k' A5 X& y
, L, A8 a% x. a4 M! g+ d( o5 G/ [
4 o( D4 i4 [% t; O# i1 E6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?* @2 ?; d( @' L9 I- p( e
|( ?/ \8 u6 {" m
A.从UNIX或Windows/Novell发送邮件时都会用到
6 q- `: j9 f+ x0 l3 `: c) z& }( |B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时: S- }! P4 H2 d l5 R
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
" G# V1 @) h& RD.PHP里用不到这个参数
9 S, a# N8 c2 i) M2 J* U' G
R( X8 }- d; E2 g9 G$ C+ ^, S& C6 T5 ~% M; ]
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
6 p7 m& o4 `* C8 D6 ~" Q: Y& N
# Y+ z4 L. h0 w) e7 xA.只有在发送非普通文本(ASCII)数据时" _! f' g) h. M8 r$ H4 g# z3 n
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
& [- A0 W5 w0 c5 CC.任何时候都可以用它来指出MIME的编码类型
6 w1 W* q; i3 y. m8 Q0 ~D.只能用来指定特殊的编码格式(例如base64)
6 u3 E' s6 V" X- EE.以上都不对
3 w# s9 s$ }! E/ x6 x' M; w R
/ T2 e& g, h2 P3 c( s9 F& q8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)" K! x+ y1 P- B5 E, l
& n8 F; t6 G& m. O0 _
A.分隔符至少要8个字符
5 ?* u) J" U6 c! ^! MB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)- {1 k; f5 r& ~6 x
C.分隔符在MIME邮件中必须是独一无二的; ?" S- r9 [; i" M6 F! u
D.分隔符不能嵌套的其他分隔符中
$ r i- A: I2 fE.用什么做分隔符都无所谓5 O6 B0 Y2 X/ f3 _/ t
6 j* g4 f+ p6 u8 n" }
* e8 y; i/ y0 h. O9 w5 M9.考虑如下E-Mail:/ v) n% o( w3 O2 X! D7 o
: R) [; |! X4 FFrom: John Coggeshall <john@php.net>% ~# F; S; M% t
To: Joe User <joe@example.comt>
5 @9 k1 `7 `0 N1 zSubject: Hello from John!
6 o# F/ b% c; S s# ^! ?5 I. s. HDate: Wed, 20 Dec 2004 20:18:47 -0400
0 ~' x' @5 @4 H& G+ E/ G$ _9 UMessage-ID: <1234@local.machine.example>
$ U" {4 r) R/ }Hello, How are you?9 o: H8 V3 e2 m; I; H, q
6 I1 ?2 I5 u- r5 Y. J在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
6 M; I; l% R1 w* m' k( {: E$ P; V( a" K- N- ]) W
A.MIME-Version! c4 L/ C* i2 E& e
B.Content-Disposition
) t+ W" D9 b1 V8 S' aC.Content-Type0 J: G: N t5 \4 H
D.Content-Transfer-Encoding( Y4 O; C+ L5 R9 @) F& z& j
E.Content-ID4 Z" E; i; f& B* r
. @$ V: ]; T; K" Q' R9 K+ F
' i* y+ q, n' E2 z
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?' m+ {% f& G, e. S( O- }
2 V- [, p/ r. IA.multipart/mixed
# g: N2 R/ A' c: {! }B.multipart/alternative
2 i' [6 U" l2 t* n, UC.multipart/default! i: [ G' r3 \, P4 ]
D.multipart/related+ A1 B/ W1 y/ b$ u ^
E.不可能用content-type实现4 _( Q. g$ D2 o/ T9 c
: t# L9 v; O% i9 }7 o; i! _0 ]- N/ _* |4 A* |0 ?4 p* b
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
. G5 k+ L: Z7 Z* X! H D' W) l4 k( q B7 r/ p) `9 @9 D" F) X
A.安装sendmail服务器
$ z T/ D6 q+ [) \" NB.安装Microsoft Exchange. M: G, Y5 Q" L
C.在你的电脑上安装任何一种邮件服务器
+ |$ T+ O- n6 S) B; kD.改变php.ini的设置' z; N; s4 F2 G/ y G/ T+ L" T
E.写一个连接公共电子邮件服务器的脚本( ?3 v- {3 t3 E* q1 l
# p, l/ w& o3 _' I7 U0 g
4 }3 I1 q! Z2 ~1 Q! W. g12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选) s6 P' x r2 a& R N
( }4 D, \7 v9 b1 ?
A.使用GET方式传值/ o/ m& w9 ^$ E, |
B.用htmlentities()处理电子邮件地址% t* A' a. L) j
C.使用POST方式传值
# o! z+ ^' C, ]! D. L6 xD.用htmlentities()处理邮件正文) O. T4 P3 N9 S K. Q0 X
E.确保填写邮件地址的文本域不能有换行符& Y& ~- D8 w0 u( F, q9 p' S! E
2 E# C/ K/ j- N* |5 }$ O5 _
: c; L3 `( g6 v. p7 v# O13.如何将一个数组作为附件发送,并要能在接收后重新组合?
5 S4 n* H2 G2 ?3 P; d G+ s6 j* `) v
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
) }+ c, N% n# z$ r# ZB.把它存在文件中,并用base64_encode()进行编码
! p0 M' B, M, I3 x& f9 f( uC.用serialize()把它转换成数组
% @3 p4 K# p5 QD.用serialize()把它转换成数组,再用base64_encode()进行编码
7 w1 ?9 r3 `& I1 v% d4 ME.把它存在文件中,再用convert_uuencode()进行编码7 U* [8 k: J# X
' }. }2 S4 t0 k; y8 S0 x
6 [, H& ~+ r. T; \6 H14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?4 O9 O+ I4 i0 E8 z1 }
I- H$ S% e2 QA.堆一个检测脚本出来& [2 n. p. v, X/ q$ u+ T; q, b
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型+ ^7 N5 L( K0 e" ]
C.写一个识别文件MIME类型与内容是否相符的函数
$ L7 U7 Z! e, `3 RD.使用mime_content_type函数, y z _, ~* j q3 V- H% O& P# @
E.把文件上传到外部服务器上8 t Q" v7 v- b/ N" F' Y& c
% P2 g/ U# V2 E% p) P7 r# R
, d2 {7 z& l# D( E15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
' x3 N0 `* z' `! r2 I) S1 U& G, P7 {$ j5 o. X6 m
A.添加一个From头信息
2 E9 @# P* a6 ?B.使用-f参数
: H) h. d# u p" A. wC.添加一个Reply-to的头信息
2 ]1 y, L) x3 V" H/ u0 L0 H' TD.确保运行Apache的用户有修改sendmail设置的权利
4 |5 j$ H9 L6 L7 _9 \6 ]1 ZE.确保Apache在root用户下运行
; @, {) [0 p: S2 _/ d+ q答案速查
3 G; T1 m3 Z' D H1:D, W' N6 \1 {. M% Z4 G {
2:AD- n. S7 r+ T6 ?$ t$ @" B
3:E& b+ c" w% ~5 v u
4:Content-Type:MIME5 {% O" H; J+ w! {% B
5:BC
. n. ?, h! P. m; `' k# @; b6:A5 S2 a% p N+ [# Z3 o
7:C
" n0 M( y( y/ Y6 o; a1 l8:BCE
$ A4 \: u& P# A7 w9:ACD6 v5 l- f; S) q3 G: r
10:B
' q# s V: r$ {* W' h. }. H11:D
/ a" @+ L" v: c( t$ }- ~; l12:CE. t9 Z" G5 W+ ]% `
13:D- m2 R2 ^, q- g6 R
14:D
0 k1 z" S! f& p0 ?) N; E15:ABD1 S1 s4 S2 u! b- S, O7 T+ N! f
6 p/ H, y l/ c1 K3 q# @/ E+ t- v0 _: C9 v! i4 I
; k6 s+ h3 q( H) K/ E8 e( L
答案详解
. V$ F- j+ `* b% }$ |1 }) N5 w; J7 {
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。0 s q" w0 f& E1 t7 L6 O1 s/ }
, }- d% z+ R Y4 g
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。9 t# }1 T) l" Q0 l6 Z2 ]
# y9 F5 W0 ~* k' X2 ~3 f3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
7 v1 Q7 W* i0 e* X, ~- m* Q! C; e1 Z! a
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
. {6 H! F) \& ?! R, ~
2 }8 ^: m( D& t5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。' X6 I% d0 y! y" N( `* [
z7 L% `) v) s, b% n! b6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
/ A( w9 g* b8 a# n* n/ ^+ K$ l
1 Z1 p' J' k/ \* ]# K3 c7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。3 o2 k t1 I* a% T4 c. K, g% |) D; o
' _9 H8 Y# Z' X. M# T) G
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
, f) K, o7 I) { n# ^- L. o+ V; ]9 u4 O8 u
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
. _& Q7 V4 B! a7 {6 U. f8 W: U) z4 G( Q+ [
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
$ `* A: B" H4 v
: d0 o! r6 V" A. r% P11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。; V$ t6 l) }( X% N8 r( `/ R O
! ?! w$ U1 d% H+ f$ w' J5 h0 h
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。8 O# d0 e0 S8 O
& V5 x2 z5 C8 n8 P4 o
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。1 f8 d7 r1 f/ ]3 [, [7 {4 \$ Z
' \# A0 P$ S- i' m2 G3 x
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。( r2 n- `. K; ]$ I2 `( i
; U( d/ K/ l. m6 ]
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|