获得本站免费赞助空间请点这里
返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
- L2 ?4 R. ^. n还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
! o8 s2 ?* C+ M' K* }0 K+ h用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
/ k5 w8 Y' [; J) J' z0 b; J7 f/ Z' U$ X$ [' ?; e; p
% _1 n7 ~% g2 |/ m* W; s0 C, t" j
问题
+ M2 |8 M/ w2 y" Q7 P; f$ P' P6 F. c
1.以下哪个不是合法的电子邮件地址?
" h$ G4 o$ B" @* z: P# b: ]- b$ L4 V+ X+ a# Q$ Z" p
A.john@89w.org/ L5 j- P: _* Z, X- B
B."John Coggeshall" <someone@89w.org>- |& g  J4 O- ^. n5 b
C.joe @ 89w.org
0 x: @: `3 l. }# p: q* jD.jean-cóggeshall@89w.org
# p& s: m# w0 a2 rE.john
4 @9 \  q7 y2 m
* R! w- o& V% j/ u+ T* t% h9 G4 T9 s' Z0 d" m
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)7 y+ W# X# n  u- D# T
5 g, B& d& p( k
A.Windows/Novell不需要第三方软件的支持就能实现该功能0 m* R+ u% P  {( Y: s& ?1 Y" x
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- I9 n$ x# c, _, x: ~6 Y/ T
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送5 Y$ X. t% D2 g1 s) a$ Q3 C+ U
D.有可能完全相同,这取决于sendmail_path的配置, u. C! F7 |' z, E9 v! c
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
6 S9 O* q- l9 Z- l; S# ~
2 E" s; M- x" C9 B
2 O. G$ [! i0 `# @) [3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
+ |3 V9 }4 k# N/ h7 t/ t" U  O9 @) k, l$ ^$ H2 j9 k
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数9 w: T1 {: i' ?& O; l: R8 g" u. N0 X
B.用PHP代码,通过SMTP直接与MTA连接。
- P: P# H+ t- I) H. _  [% ^" b/ ?C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。! S& j: S* v  a5 _
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
9 t3 J" o$ b* ?9 t3 RE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
* H  U, ?0 h- ]  E5 R  d9 K4 ?
- t/ P0 G: k: {. v, ~8 \
: b( x3 B7 ]: O0 c4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
6 j( Z: z  m; [4 i/ J4 k* E( d8 z( S- ?6 y8 C/ _
答案:____________
8 D2 o+ K- f& T
" J/ e: t* D# i2 k* G4 E% @. f, P! T; ^
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)  O" V, g, a* n$ H9 Z

& n  N, m$ E5 y/ z) X) N( H( IA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
& j) r( \+ P# ]2 T* IB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
4 e6 K1 W% i& L! R  d. z3 C7 wC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
! j+ N5 T0 s0 f' t$ ?D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名' y. `# N( y6 d# j) R. J3 W% e
E.只有一个答案正确  T9 E3 l& y1 o' A2 }8 ]7 U
  W- N$ \# u  J1 ]" p3 p- }
: `  h1 P& \9 F2 o
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?4 `/ \, h  w1 A# e% O. `6 v4 _
) u2 t  c' l" K+ |$ |/ D( i
A.从UNIX或Windows/Novell发送邮件时都会用到
3 c/ X0 U4 _! m6 m7 X! fB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时, F9 `* t" ]) u
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
( |5 L7 k" y) j) K$ e7 \D.PHP里用不到这个参数
8 o, b/ j3 Q4 }: ^
2 ]0 ^; o+ j/ [0 M
/ [8 O/ A. f; A" g7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
. c2 \. y' V6 ~4 A9 g% S% K9 \0 B9 g# F! [
A.只有在发送非普通文本(ASCII)数据时
$ T* g! H. i8 l: |( fB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text). U: \( K: Q  N3 W+ f/ D7 e
C.任何时候都可以用它来指出MIME的编码类型
5 I6 W9 |+ |* c3 q1 N- ]' lD.只能用来指定特殊的编码格式(例如base64)
! B0 B) O/ P4 H" n( F* U7 t2 NE.以上都不对
4 m( T6 @" ?# }0 [/ c) m8 |/ ^/ e$ a0 X; i3 V. a7 r  f6 x% q' @
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)3 u3 r1 Y. g9 n- P. `( h4 I
  J9 O$ o4 z( k* w& t
A.分隔符至少要8个字符
! Y0 V1 x) d) e" ~( s: ~; PB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
; R: w+ ^3 v  X/ k/ GC.分隔符在MIME邮件中必须是独一无二的
5 |9 A+ D5 f$ A+ dD.分隔符不能嵌套的其他分隔符中
& ~9 k' n+ A; d/ `E.用什么做分隔符都无所谓
: R" x; i; J( j( p; f
7 M8 y3 @* s4 E6 x. I* ]
) I4 J$ E2 Z3 o; D% v  A9.考虑如下E-Mail:
6 V3 F% a3 B- ]3 x$ r" |* \/ `5 [" @
From: John Coggeshall <john@php.net>! V8 ]" K8 A% s
To: Joe User <joe@example.comt>
5 \2 w4 }+ ~  U% w& i% _) QSubject: Hello from John!
7 c. ~. ~: R* o; E- V3 T3 I/ b: aDate: Wed, 20 Dec 2004 20:18:47 -0400- c$ y9 _" r! R, ^' v1 {, X7 J$ ]
Message-ID: <1234@local.machine.example>- Z, T! V1 i0 F' T4 [* P7 h7 x
Hello, How are you?
. ^* Y; w& {# O4 {! O- I  v' N  A- B; B5 R# `
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
% b% X9 n. f9 f: Q6 E# C9 g! n5 S' f! P" `
A.MIME-Version' V8 B5 T/ r  [2 _0 Y- h- P" N
B.Content-Disposition) y: Z8 e: l: ~0 P% L! v
C.Content-Type1 d* X5 V, r6 S' `% D! z. p
D.Content-Transfer-Encoding; g9 k9 d* J$ {. d% U
E.Content-ID
  R/ u7 W! L$ Z, G* ^; v8 A/ b0 k' G
) G  V4 i+ G* a+ V* q. M5 R) L
8 l( r" n9 z' C/ [9 C- N3 {2 y10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
9 @8 j7 p8 J/ U" N3 O
, B" Z1 D1 Q* S  HA.multipart/mixed
0 c3 j: g6 K2 \: c9 c! Z- jB.multipart/alternative
2 A7 a9 r! F1 }8 `, O+ PC.multipart/default
% I, P2 c+ Y6 }: U% O4 V( XD.multipart/related
8 }3 ^' N" G" dE.不可能用content-type实现& v: K' N4 i: D5 n# L

6 U! N* M, Z, x# B4 }
# p, X. M: g9 y( M( \4 ]- e11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?- X6 d, m0 X7 v  G# H! q
0 Q0 t6 i4 K% M5 s( N! V* u  V
A.安装sendmail服务器$ s; [* h8 H9 C
B.安装Microsoft Exchange
5 J1 l+ G0 s& E; xC.在你的电脑上安装任何一种邮件服务器
+ k, l4 }1 w  T0 t/ C6 G0 m' m+ a$ ?% pD.改变php.ini的设置
9 M  b1 Z5 b: s6 sE.写一个连接公共电子邮件服务器的脚本/ ^; p9 j5 A8 o; k3 X8 z

) K; P6 ~9 O0 A0 {) Q7 J. \3 j; w8 v$ y
6 R( Q. C* l6 v/ f12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)+ k) S" B' A8 g  e/ |

( D+ K+ g  i! _! Q  p, HA.使用GET方式传值
  \1 G& }/ R, S# E/ w2 w+ QB.用htmlentities()处理电子邮件地址
3 B1 R& t" D8 Z% ~' w5 XC.使用POST方式传值, I2 Z0 U# q+ o9 t& U
D.用htmlentities()处理邮件正文
% K& |- x) C. X: j- k# NE.确保填写邮件地址的文本域不能有换行符
3 N0 U, A) {5 N/ ]5 o" b* o6 r3 {8 g- ?' c4 z

8 c) a8 {" h4 k; Z5 l13.如何将一个数组作为附件发送,并要能在接收后重新组合?
5 `/ f) @' I6 s0 F3 z! A+ d5 X3 N: N/ ]/ u8 R
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
* `) A& f& b+ w9 AB.把它存在文件中,并用base64_encode()进行编码
( I0 t1 s' j2 h8 w% [; pC.用serialize()把它转换成数组
) M# G$ l/ V  R& Q4 L  G; f3 MD.用serialize()把它转换成数组,再用base64_encode()进行编码
3 [" D! s& o: t! c' n4 ME.把它存在文件中,再用convert_uuencode()进行编码2 C9 S; S8 J" f1 `- O# L
9 C7 w- u, m+ I6 o/ O0 U+ d
' n8 ]2 `+ ]" X- u
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
- H$ `  z+ K& s/ ~. Y! q. W8 Z) l
A.堆一个检测脚本出来
( A1 N: w! O. XB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
5 |& v/ o8 R9 g" xC.写一个识别文件MIME类型与内容是否相符的函数
* u0 b/ ~" a) q- [; AD.使用mime_content_type函数
. J( N1 h; \2 g: nE.把文件上传到外部服务器上
: d) x' T9 C. o9 m) f7 k2 o
1 R& P% s: r7 g3 E3 N8 A% o% p# R3 D5 K  h
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
- ]8 Q' a& ]' M6 g
* a5 J5 F, {6 |) F3 qA.添加一个From头信息
" J8 v" X' r' b+ JB.使用-f参数
% F. c9 j8 T: Y! O" fC.添加一个Reply-to的头信息
4 c/ x0 J9 X" h3 G& q9 |$ H  b9 Q: @D.确保运行Apache的用户有修改sendmail设置的权利) r- a5 h" N+ T0 c9 j) ~' O
E.确保Apache在root用户下运行
' |+ |, ^8 E2 e; O答案速查
$ d6 [* v1 |7 X& E1 J1:D
6 F7 P2 N$ D' ~6 ?. S5 ^/ F$ o7 g2:AD
8 x2 p; G& @: g2 t3:E
1 N8 K2 F9 E5 @, N+ [4:Content-Type:MIME7 o+ q8 p1 I) P; p+ i! `
5:BC
, H& R& L; P" k1 J6:A
* z" Y0 X! Q+ G7:C5 H& s* t1 B2 z; j0 o9 C9 c4 `
8:BCE% ]0 X9 S- L8 ]4 M& H) x3 ]
9:ACD
! Y( J) @& V2 q  C( k; D6 d10:B+ E. f9 `- p& g3 |7 S# G
11:D2 q# e8 k& b5 B9 a# f
12:CE
$ @6 A6 v! u, E/ T" ^13:D- |* l8 ^- _5 \% i( s
14:D. B% [; M4 z2 Q, }! x0 H( L: \9 `0 S
15:ABD  N7 D2 h$ h! o( i, y) m, ^( u

6 g4 l5 R( e9 d; h' i) ^% @/ w4 o" a8 t
4 D- g6 d+ [( X/ ?
答案详解( O. I3 z, j4 _! Z( V+ n

( T" O% ~3 ^, ?0 M9 K+ L1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。# g0 Y' U% }+ h4 |9 d! C
6 b2 a8 A* ~- ^  S5 r
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。8 ^' T. l/ H& e2 j6 |, s& L
% g* M. l& c5 L  z8 L3 R
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
0 f1 d, s5 d+ M) L- ]3 n/ O8 m2 x5 f9 y2 [- Y+ Y+ w% C
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。' v# w" P7 {) Y4 j1 G
9 h9 d5 Y4 }  w% M& q3 h* f
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 p& z# K8 {" Y) s" q: g4 f8 p
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
5 s7 M8 u3 F5 A# A; g! c
7 K. k$ b8 R2 f, ?* H: G5 ]( v& W7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。) `/ m, x  q' d' \# X6 l) n
: s1 f% J/ |2 {+ m
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
" X; J' {5 [9 ]) Y7 p* K7 M, V# k% v1 x; O. k; @. ~: M
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。% ^+ J7 k( k8 z+ v
- s3 ~3 r# R: p) C
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。/ R4 L* _; B8 t2 @0 s8 G

2 G# P: o' `) k11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
* g5 t; I: P8 l: z2 {
. t) e* a* Q2 }+ w* g' k$ V9 A7 l12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
+ k% u; S2 W1 G/ t+ z8 K
! p- j/ u; X3 @; P+ S. e; H8 l13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
9 z: {+ T5 T8 ?% _/ }! h
6 d5 F5 x6 R- u5 J. p$ C14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。3 S! r$ _9 C! W7 A, b( ^: W

3 H% Q) w/ c* X' H# p15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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