  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。0 O$ a, h7 s, ^
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。/ H9 I" Y+ Z1 W3 ]6 Z& p# x# S
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
, B4 S) Y+ K% U9 f8 C
6 s4 q; w+ t I% t2 A2 V5 i- }! \1 j; P! W5 A
问题
/ P. O+ [( A g) y# [
6 _/ P5 F" E6 f, r7 X8 @1.以下哪个不是合法的电子邮件地址?
: a( C2 z! q' D+ _% ?; {
: s2 W6 d/ L5 \% o( PA.john@89w.org
" j( v& N/ v7 ?" }B."John Coggeshall" <someone@89w.org>+ Z( ?6 V, W0 _
C.joe @ 89w.org% T) Q! o" }6 l( Y+ Q2 q& y- o
D.jean-cóggeshall@89w.org" S5 Z. S0 ^5 f3 c
E.john
8 t' ]- b% S& Y: |* p* i p! ~* l. M
) I2 P7 c' [! X( V+ S2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选), X/ C: {. K/ ]( z' R
' @" ?- X6 ?$ O8 r) \: kA.Windows/Novell不需要第三方软件的支持就能实现该功能% W L' Z# W9 a# A: \; r8 l6 s
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
: `: h) X$ |* L: S3 dC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
3 K6 q6 o! f9 Q/ OD.有可能完全相同,这取决于sendmail_path的配置% N3 p4 M. S; z D- t6 x
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
( I( ?0 P+ X! |$ M# F
8 d' c0 Z! D$ j8 @6 J. g8 T
. z. @& v8 f9 n8 w3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
* B x1 s, \+ j4 G, [3 H7 T
* v: ^7 A' N6 O; a& e7 gA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数- e$ H2 S5 q/ }
B.用PHP代码,通过SMTP直接与MTA连接。
o6 J3 ]3 W8 r' f* @0 \; X9 p+ JC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。. B/ J4 k8 H \& D( a
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。4 }. C. k N* S4 _
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
7 @. e' F O4 a) y$ Q4 J& \" z, J2 |( Y" R6 H
- N+ S) \9 k" ?- i b4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
" K i. s4 u0 g, W1 i8 C! X0 `- s. h& X+ X: j" U
答案:____________+ a# ?$ \- l: S( m ] `
/ ]! X# E% D$ T }
' [" E- \2 |) c. X# a5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
1 B7 V8 J1 k& ]& z
3 E; ~0 S$ m! |+ ^A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
% Z# q, r6 @$ T M2 c1 c3 V vB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
; Z# q& E4 \ {+ e6 z: tC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
8 k9 w' [! Q' S4 a9 bD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
# `* N* Q2 s, S+ cE.只有一个答案正确6 R8 E9 a1 B! j! X9 n
4 Z i9 h* G X+ E* X
) T+ x* `, X/ Y; a4 s; u7 V6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
- s& S$ @# s% ^. \) s% V
& o' g4 M w z0 u3 r/ MA.从UNIX或Windows/Novell发送邮件时都会用到
# @1 W7 A+ K) V5 R9 b* jB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时' p" F! g2 \# \/ y: e' a' W
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时5 b) f. P& d9 k5 i
D.PHP里用不到这个参数
9 W$ \/ Z! Y: D8 T3 l; Q8 { ]' K+ i3 S9 z2 s- d7 t: P
( Z; G* A( x% c( O: Z- [" h7 m7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
; ?( W1 ^# A3 u: n4 n# E# ?3 `: f! w
A.只有在发送非普通文本(ASCII)数据时
0 p1 G/ G" W7 D( AB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
$ W5 b) a1 L$ o' hC.任何时候都可以用它来指出MIME的编码类型: H* Y8 b) o/ [( Q
D.只能用来指定特殊的编码格式(例如base64)
2 j. O$ I, N7 y2 d& m3 r, \E.以上都不对 @9 H( G) [3 p. A8 w2 j
! U2 D$ a3 F; c3 S4 |
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)0 `3 q* Q/ f7 b4 m- C3 x0 L! p" P
8 t2 \1 c+ D' j5 l' r: a4 K
A.分隔符至少要8个字符
' z4 n4 }: M0 k/ [4 vB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)% P( V& s+ N& x2 q; G+ g; s
C.分隔符在MIME邮件中必须是独一无二的
% s+ [& n' r) n% E5 ~; Y6 P- K' oD.分隔符不能嵌套的其他分隔符中
( B6 R! ?- e" F' x5 dE.用什么做分隔符都无所谓
# _1 C" s$ s4 k
- {" a9 G+ \% r9 T
+ d4 b# u$ C/ o$ U- n0 T9.考虑如下E-Mail:/ L2 V: W, O0 G3 g
% o, |" H6 N J; p {! }8 v; D
From: John Coggeshall <john@php.net>
$ L) b5 w# t* l6 s' jTo: Joe User <joe@example.comt>
& X6 g2 a# e3 L; bSubject: Hello from John!
9 p- Z2 B1 J( }# f0 y- j4 A7 o5 B( |Date: Wed, 20 Dec 2004 20:18:47 -0400
1 y& p) ^1 A" M+ {Message-ID: <1234@local.machine.example>1 E" L+ |; v) r: R: s( Q( B
Hello, How are you?6 w/ R X0 F% l4 o# b4 v
3 E3 x/ I' |2 E0 r( N& D0 d9 c
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)) d/ f, ]1 a+ A6 T9 v ^' C( O: ^
7 g% Z1 f7 V; X) Y! e
A.MIME-Version" g( S: e! X; O: v9 b$ q
B.Content-Disposition
3 T' @9 l! s4 {7 Q+ a, @C.Content-Type
+ Z- x& P# v c! @D.Content-Transfer-Encoding
$ Y6 Q* F: H5 e/ Q* s* fE.Content-ID4 k" [" U5 M" d& \- P, ]0 t, D! F
- x0 A: J. u' J# F$ e r9 U& ^- Q% M: X3 b# t
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
, Y- R" \8 E% b. f* f1 M+ N6 o- k, t, \1 V# t
A.multipart/mixed! ^/ B4 Z! H4 F
B.multipart/alternative
4 y8 j5 `3 r c8 _5 DC.multipart/default
2 r) l( s# x' l7 K1 }6 xD.multipart/related; F, Q0 ~0 b1 C9 J+ a. c5 e* M
E.不可能用content-type实现
$ p( M) J1 d+ @7 R) b3 a% R. H
/ L& D% V# F# P) d3 S
|* }: v9 F/ P/ G) [ ^# v, U11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
9 \1 f0 }6 R {- X0 S Z( ]' P/ R/ i
A.安装sendmail服务器
9 ~& F. m; U5 u, H% TB.安装Microsoft Exchange
$ T3 f, O) q* |C.在你的电脑上安装任何一种邮件服务器0 \6 g0 R0 q3 U2 ~% k
D.改变php.ini的设置
' G3 A2 @6 P. |; ME.写一个连接公共电子邮件服务器的脚本
' f" G; T0 d6 t7 _. j5 q# h2 d. }7 v; C- y" m' [ V" l
" W% O( D3 i; w- g7 ^
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
& G3 ~+ V9 r @1 j+ N4 x+ P) x. x) d, y+ E$ i$ {
A.使用GET方式传值
, J: Z' A4 d( b3 m0 G1 L0 OB.用htmlentities()处理电子邮件地址
# J0 R: y3 o6 Q/ t1 tC.使用POST方式传值9 ]0 D3 u1 C% G
D.用htmlentities()处理邮件正文
5 Z- \; d, S2 u, S* w, X& LE.确保填写邮件地址的文本域不能有换行符
! v# S: _6 p& |2 r
" [/ E. ^' O1 u5 p; G: L$ J5 S' e2 J( u8 p
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
4 i W/ g* u" W+ d) N; |6 m" M! d ~- ]
A.用serialize()把它转换成字符串,再用htmlentities()处理一下1 f% ^. A* ~* F4 h, P3 r
B.把它存在文件中,并用base64_encode()进行编码5 h* G6 R* c$ X
C.用serialize()把它转换成数组
, J" E; S: w" cD.用serialize()把它转换成数组,再用base64_encode()进行编码$ d3 N1 j# f0 e5 R
E.把它存在文件中,再用convert_uuencode()进行编码
' h. J, h0 Y* X$ [
2 Y$ s H& h7 ?* b
: E% S7 e, t# I# ?# I. k0 b14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
) |6 E" I& u2 L1 b$ e( F( G/ n) i; t" Z* s' e
A.堆一个检测脚本出来
$ f, E h! v1 @6 g. \2 v- wB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
0 z) K* H2 P) Y9 X) C9 ~C.写一个识别文件MIME类型与内容是否相符的函数
6 \$ o0 I9 z9 n) E3 F [D.使用mime_content_type函数
B- K t& L, _/ e9 gE.把文件上传到外部服务器上1 L& @( C {$ @+ g8 ]
) s- M; Z: ?. d: X8 H; m8 _( i2 d5 T8 M' L
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
4 h' ~; v$ T+ V K3 t$ ]4 _/ L9 {/ {, N* @
A.添加一个From头信息 v! J9 R4 U# R# s
B.使用-f参数
`: Q3 v# b. k& Y: uC.添加一个Reply-to的头信息
4 h* _& m4 L; C4 CD.确保运行Apache的用户有修改sendmail设置的权利; @( r3 S0 D9 j# T. Q
E.确保Apache在root用户下运行
/ e+ n2 Z: P) p- W3 X: X答案速查
2 A( G. m1 o- Q2 [1:D) Q: Z, U. `/ @
2:AD
* A/ |8 \! H5 @3 s3 Y3:E
' z: b' A9 ^% x/ C; v% l. O4:Content-Type:MIME
) L: y. P! R( b2 F5:BC
: r$ o4 q! n6 u8 {7 ~+ ]6:A- b: X/ P+ T+ p& U7 V3 P
7:C- B2 Y* W' Z3 l2 N4 z6 c8 E5 p
8:BCE
1 F8 \& U0 f& m; Q! C! K0 M9:ACD, R/ [# [- I1 |. V2 a* }% C5 c
10:B1 u7 I2 I$ E, q# {* B
11:D
% R9 x. G; ?) q3 P. W12:CE
& w' f% e d, }" \ U13:D1 M7 q# ]1 i9 f* V: N0 }
14:D9 z! a4 o8 K- L; b- K; n$ k
15:ABD$ V" w: p' I2 B! ^
6 c) K& V f% c; j1 c; Y
: K' C+ ]$ @! s( Q& v7 D/ U0 U
6 a' L4 @0 ?) [. _4 v% u答案详解
0 l% M9 r& P3 m* I7 s M8 [3 P0 o; b6 @ a: }( Y- Y( g9 T s
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
4 @7 e% K- Y5 y6 R7 E: h6 }9 ]! H/ ?9 }
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
' ^ V8 p/ o% R, |$ D
) e/ M( T8 q9 T* x0 D$ c3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。: T1 ?8 m3 y# W% X/ T8 a
8 v- n8 q& a6 U _. r2 I
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
& m# r6 `: g( `5 l9 R6 F0 E7 ]+ A: e/ O ^
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。( o( _' u" y7 D, @
# T; I- s& E: F# W
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
! K# _1 l$ E. T1 d3 k' X, [- G" v. g. c$ K: ]
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。3 e$ O, R6 z( K/ A' q
" a' E/ u7 }( H/ Q% h
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
Q' _+ ~) f, F
- l* }' w* Q0 z9 G9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。# q5 [$ j$ T/ }+ ^6 B+ p6 X2 w( Q# L
3 P- `8 M* t+ g10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。. w+ f+ z. n6 X
+ \, g/ ]0 w& v3 \3 u
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
$ v! L6 J8 g, S$ T$ _
7 ?2 E4 a( ?9 ?0 b12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
; l" K! g; w8 p! y5 ^* |1 o5 V" N" N+ z& I0 [9 W( I. F
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。# W/ d- b. A! L) [
" P8 b9 G( O, i1 ~; c5 n1 b$ D) n0 ?14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。6 Y9 \: e- a! f
2 [& ^- ~# R* ^, P: L4 ]# s15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|