|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。4 ^9 U5 P" |. j; }5 ?! Q+ b6 s
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
d" I0 W- ~" m用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。5 p$ q' d0 _# Y# ~
8 s' K c- d3 w2 Q2 F9 w& V
4 i& `+ Q5 P1 O8 |% B- a问题
. ^( w" ?# Q6 Q* I8 Q( |+ ^ v! P) W! `& F, L
1.以下哪个不是合法的电子邮件地址?
' K# f" o0 i- u. ? D: h! w/ n* p* N: R6 p
A.john@89w.org( e. _6 X+ [8 D" c( l7 e; V
B."John Coggeshall" <someone@89w.org>
2 p: R* p# B/ B4 RC.joe @ 89w.org
7 _+ x) v$ d) h2 K1 VD.jean-cóggeshall@89w.org' T1 T; J+ b7 h4 E4 N. ]! A
E.john6 @/ a; k% T& E! C# t, @
' b' D% K- E& P& Y8 H
. o2 _2 e3 ~) Q$ a2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)$ e' J5 v! \8 S7 i6 j# O
4 Z ~% f! [2 D, ^, }5 k5 cA.Windows/Novell不需要第三方软件的支持就能实现该功能- c# n1 H0 B, s! r( h
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
/ X6 a2 W" I. l+ K: eC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
; |9 }4 K/ M& B: g' i! {4 h: ?/ ~" MD.有可能完全相同,这取决于sendmail_path的配置
( o2 D8 ?6 v1 C* s8 `/ FE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口- L" y2 j' t# L7 `& o6 \4 |
. v+ B* H4 {% y' L; w6 U( d; z! G) `4 o& c+ S6 x
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
3 q. m# K& g5 H3 @1 x0 {: P5 Y8 a5 h% P ?2 b
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数9 w; M% u5 m: v* R) v K
B.用PHP代码,通过SMTP直接与MTA连接。
6 ^6 H) \( H' d; t9 H6 oC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。& ]4 Z' S7 A* Y' F
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
8 ~6 |2 }0 A& h7 e, d8 K% RE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾5 w3 C" S. o/ c: S+ g( m2 X$ W
$ v7 y& X9 \8 G: Q& [: k' H# j3 v0 z$ ]
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?3 x2 A; O$ \$ O0 C8 h
3 q' E5 A0 y1 ?' b; r4 i. k' d答案:____________% {5 h% M: h& v& ^1 t! i
+ _+ B; U6 n0 }2 Y4 h6 d
, N- l5 v) y" L2 _ k: ?5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
! G1 `; a' |! h- ?. { @4 S. p, P, R' x, B
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示2 @- h N/ \/ H* c3 i$ {
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
1 C4 J, y$ p! _( M V- A' F0 f# _C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
: N5 i4 g, O! i' V. ?D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
6 x4 q" f' g' w, [E.只有一个答案正确+ W. ^+ S4 \/ k0 @( I4 n
; C( D' V' l0 z! ~$ h
* Y0 @3 P+ E: j; A% k5 B+ P6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?) `) E `# V3 Z9 w9 X4 t1 u
& d G$ ~' V: g4 {A.从UNIX或Windows/Novell发送邮件时都会用到
$ ~ j- H9 B0 c. v, }# PB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
" M- y0 A: M( Y5 k" Q6 MC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
( X+ w6 a& e6 Q2 Q2 I& \D.PHP里用不到这个参数$ S: }& H2 q) O# O7 ?$ t) i
3 L- X q( B: Q2 E1 x
w1 H$ ~. e0 b8 R( b) t& \7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
8 }$ d: `6 P5 p7 ~) b* `: N3 _7 k; t0 K
A.只有在发送非普通文本(ASCII)数据时
9 V$ v. R0 i5 W1 @1 zB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)4 E4 i+ Z) U$ y/ S
C.任何时候都可以用它来指出MIME的编码类型* f& o8 }2 r/ E
D.只能用来指定特殊的编码格式(例如base64); C. f+ V& S- V+ r
E.以上都不对+ J1 w1 ^% K n8 r7 ]: b+ ~
: X. j# N+ s8 X7 R1 I! n: ]
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
5 E" c; [* ^" m7 K5 R% @3 C
* A9 a% n3 x. S! Q U! ?A.分隔符至少要8个字符
0 ?3 Y, T# ^/ i5 d% k* b5 z; Y# r( [B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)8 W( P1 n) N0 z- A2 K4 j: |+ D
C.分隔符在MIME邮件中必须是独一无二的% q$ E* i$ K0 J3 I5 f
D.分隔符不能嵌套的其他分隔符中
# e6 l3 }* h% E2 sE.用什么做分隔符都无所谓
5 l2 k+ G8 }* c& z, ~/ E6 P0 G0 [
3 K- e2 q6 N7 D! F7 x8 O9 p7 b" f1 o! y5 h; J" I' Q/ X2 m" F- [( u
9.考虑如下E-Mail:0 u& P3 k; c" H1 E% v: [3 m
: [/ l5 o8 O2 m' ]3 n
From: John Coggeshall <john@php.net>) h4 i7 Z: T$ i( E L) S
To: Joe User <joe@example.comt>. j' Z$ V9 q$ J/ Z& u
Subject: Hello from John!
: S; s/ K% h+ {" a+ ^& W0 E6 pDate: Wed, 20 Dec 2004 20:18:47 -0400
+ `" u) O9 M" s8 P& e& S7 Z& @; g& M# TMessage-ID: <1234@local.machine.example>
) r% _: n: t% q4 q5 r9 YHello, How are you?" M% W% V5 h4 W% _5 b& g
1 P$ s$ A x" w1 X3 \
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
% @% f) \- P* N/ e X7 c1 W3 c9 I* y. T. P1 X' M p* u; |
A.MIME-Version
% C8 g8 ?. @; ~$ C ZB.Content-Disposition
1 ]7 x) @1 p/ j$ @ M/ S9 B# GC.Content-Type
2 U: D. f% v: X! DD.Content-Transfer-Encoding4 q8 L0 L: E2 h9 Z" B
E.Content-ID
2 {4 }. V, @( L4 }" i' q/ z7 R& M; o) Y0 v* z
! I+ N8 ]/ d* ?. A3 k6 K* {7 j
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
8 c6 y+ j1 C: \+ j, h# i, s
8 ^8 S$ F* N3 n! vA.multipart/mixed
: e! m+ n+ H; ~B.multipart/alternative: p! B5 x/ U$ U5 k) |
C.multipart/default
: W7 v% y2 Y/ N2 `4 l8 KD.multipart/related' N9 _: R% d" Z. e
E.不可能用content-type实现
4 P; m! r' W- i6 [9 A1 g; R5 J4 r% L) H
. t& Z% T$ ~1 S3 W' k$ s. F, J7 E$ R3 G11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
* }( }- L- K+ x* d- B( [. m$ X+ L/ |3 f% y
A.安装sendmail服务器8 i4 W" r; _) e9 i
B.安装Microsoft Exchange: y9 P- X m; G T3 M1 i. |# B
C.在你的电脑上安装任何一种邮件服务器
+ g/ [! X' K6 l9 i: d1 ] `D.改变php.ini的设置! }0 s5 L: e' Z0 s' m
E.写一个连接公共电子邮件服务器的脚本3 U1 c& `: H6 w9 \" f
4 o( _* }7 D+ K1 m% ]$ |* w& ]" Z& N& n2 g/ J5 q
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选); i" W7 g# ]2 o5 ^4 k `! i
! {) _4 h1 j/ [8 G) N% M }9 n4 RA.使用GET方式传值
0 a* L) O7 s( @B.用htmlentities()处理电子邮件地址
) y9 t, j6 Q: x6 q; m) l& PC.使用POST方式传值
" C1 v4 r4 t/ E9 `D.用htmlentities()处理邮件正文: ]1 |6 A" ^) z+ g) X& |6 J# k
E.确保填写邮件地址的文本域不能有换行符
* l. ]% i" M( V4 W7 N7 }
* z# S. d* w$ }* }5 h9 o, T6 _ e% ?/ }& A# T5 ]
13.如何将一个数组作为附件发送,并要能在接收后重新组合?! V5 q/ d* y# H3 a: C8 S
" S2 a# P8 ^! @5 I, Z3 T9 H
A.用serialize()把它转换成字符串,再用htmlentities()处理一下9 [* q& V6 \/ e# `4 w- l
B.把它存在文件中,并用base64_encode()进行编码
7 o, D2 _ L3 Z" F+ q1 kC.用serialize()把它转换成数组
6 O/ D1 i+ H6 ID.用serialize()把它转换成数组,再用base64_encode()进行编码
/ o1 B( d, Z3 VE.把它存在文件中,再用convert_uuencode()进行编码
6 ~) _9 Y% [8 J) ]- A+ z3 W( K( S/ c6 b% B7 B h
, a5 `% x1 q+ \3 E# J+ U. v
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?/ b9 s$ K( D. ^ |* l# }
8 U' K% \8 t* S# M! F* Z) wA.堆一个检测脚本出来
" c4 l, A; w1 O: h. S! |" W; \B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型. Y: s1 `* C5 D2 P
C.写一个识别文件MIME类型与内容是否相符的函数8 G# X$ C: ]% [! ~5 b+ n( F! `
D.使用mime_content_type函数
$ o$ c0 c+ G1 g$ pE.把文件上传到外部服务器上$ r2 ^4 S$ q9 w2 B3 x8 q! {' A( t
0 w2 J/ `! V7 P& {8 E
% X/ q- w9 q* D7 n4 H15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)9 C% d p0 v* C+ W
9 W- X& `7 L& L' }2 `A.添加一个From头信息
4 r* n* [4 _* i- E2 s7 G) D3 KB.使用-f参数+ Z4 L2 u) E/ K2 A
C.添加一个Reply-to的头信息' K' d% D# e' U
D.确保运行Apache的用户有修改sendmail设置的权利" C" X4 d% z; i" S9 z7 _5 W
E.确保Apache在root用户下运行. e' |9 f- S* e
答案速查! e3 g' J }! a9 P# R$ g E W
1:D) T# u$ x, t w
2:AD
9 B% y1 G) v/ y+ i V G$ G! n! e& J3:E
& y8 L- g, y% R0 R6 m) \4:Content-Type:MIME
0 N2 ?2 |* _+ o* ?% ?' D# b. v `! a n5:BC
/ P; \* }* r Z1 R% t6:A0 E& F# Z0 ?8 L2 J4 f3 m
7:C
) v/ m: w) O# ~* r) }; s* L0 x6 v8:BCE: K9 c. g$ \& I+ u: j
9:ACD: l w6 Q- ]" L! ?1 ?
10:B
9 a5 I0 S* N0 P: m P11:D
7 a. G" H) y5 L5 q12:CE9 Q2 R2 G" o, l' G
13:D
, x8 t3 g% m- [* g& ^. J14:D
! ?' e9 ?2 N d d15:ABD( d4 P ]9 P+ t5 v5 g
8 z( S% X+ y1 E2 q' q$ a! x! c2 v/ Y v+ P
$ [/ D& O. A. K7 p$ w% s
答案详解/ {! @4 B5 w, i* @1 o- B8 b
& q" O4 P) J. {% H+ T. D/ m1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。" m$ @9 I$ k! W& ], ?
1 i9 `1 f9 G* r' N( N
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。1 O2 L% ^: K, H* }
. e7 r1 s" u' b2 n9 N
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
( j0 O, W7 O; W5 b, L1 g5 m D( B' K b, m8 j
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。7 S. n9 U5 i9 z$ |
! w* e+ k' m& a! T$ ]! ]- a
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
" c' `2 U' J! Q; D% a/ m
! ?; D# K, j) U1 N. @* r6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。. k! |1 @: _2 K& D5 V
# J+ Y7 t0 \3 q; o/ ?7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
3 c9 B" R' U& g7 H# X: c) t
6 P- V9 K- Z, f0 i" o. Q6 t8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。& s; i$ h- x! y( ~% d2 _' a8 }
0 |3 a; W8 O( N( ~- w, e# w6 Q
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
; S, U, F3 O3 h) F' _( d
6 |3 L, a# V( N s& C! Y) c10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
7 T' i: D! ?( Y
0 o0 ]! h# p6 S( w! |* y! W2 o8 ^11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。8 M# |5 J: p- [2 R+ v6 \
1 E C; r* G7 K$ m12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。" E, t0 t8 E1 k8 E. @, a6 d/ Y
: X, `8 s$ Z* f4 U( ~6 y$ k9 i13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。6 b* \; P8 |! ~& T
5 i1 f9 u8 r$ s7 t/ x% v/ X14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。# j+ D! ^, ?7 _9 u, }3 i
4 @7 j: p! ~& [/ H3 b! }* v' Y15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|