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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
2 J9 i+ a/ p; z# `0 [8 o还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。% M2 n1 B, O5 q( l7 J+ ?# W' M
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
  R& S6 J/ k# @- O! \9 `/ t) _3 N& M# c5 Y; n( @% m% S7 N

: A/ o. T0 i. L& J. B( t8 T  ~问题
) _. O2 q9 y8 }9 {: S( H8 m9 l- }! q+ R4 F( l
1.以下哪个不是合法的电子邮件地址?- r$ _4 _7 M7 J) S( O# T9 B

* E4 r- Y' Z. Q% KA.john@89w.org0 j$ b; l! {2 r3 d. E7 p
B."John Coggeshall" <someone@89w.org>
/ ^) Z' [- P2 U! XC.joe @ 89w.org
# {" M* X8 Q/ f; |( T/ I7 rD.jean-cóggeshall@89w.org
; c& `" \+ ~2 L- ME.john
* I& i8 h; Y8 _
- [1 R7 `, F4 |* ~; H0 ]7 {
, T  n! r4 g3 o) u( U2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)& J  M) V) X4 Y3 B8 t

1 _5 `  }. m' c5 M5 sA.Windows/Novell不需要第三方软件的支持就能实现该功能+ A* A1 v  U7 f1 E( P; G8 a
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。! |& o1 ^2 @, O: q7 g0 V
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
/ K' n7 p- B- N9 ]$ HD.有可能完全相同,这取决于sendmail_path的配置7 _8 }# k& b5 a: x; ^* v
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
! z. }7 ^$ ]- m8 E* u1 O& B( Z( d4 k% b( K& d: P- n! x; d

( u) T1 B. z  Y8 S3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?  a6 O1 Z! ^, P6 c- k9 H+ ]( z& n
/ c% [" P) ]7 h9 ^) E6 i, }" F' K
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
2 X2 R% z- n# z/ gB.用PHP代码,通过SMTP直接与MTA连接。
2 U9 ~3 m1 _. uC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。0 D+ F' s  j5 O
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。9 H+ h% b* D" v8 Q6 W
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾; }9 r' F( A# z# J- z/ Z
" N" x1 N) a6 i

, B) n5 ^* b& f; r% |1 C* _4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
6 @. X9 {9 ^8 K: N: O
% k2 q" o0 g8 V- t2 I答案:____________6 U! J; w- O% q/ t- D: A5 K
( D" r3 F3 \6 R) w7 X
" q5 B' ]  m6 g" b! R' w+ Z, F
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
8 u4 y/ {# K% t% [: S, ^8 G! j' b1 [, q$ x' X" Z5 o8 V
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
+ P6 ]& g5 A+ P3 V7 V8 M% MB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
( A1 ~# q- X7 }7 _. c2 v& H- n# i9 IC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
* Y2 G$ A5 n( h! O9 _, ZD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名& y7 Q2 `& G/ K# F
E.只有一个答案正确& N( n/ q0 I" {9 q' T
% m' n# W5 @, n! w

" e  Q8 y+ l! D4 O/ y6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
  p9 b% r2 j6 t( l1 }6 V; a& }, D
, x& F0 u0 a$ QA.从UNIX或Windows/Novell发送邮件时都会用到
! g! ?* i) B3 f& G# f4 J5 \B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时7 r6 ~! T% a& f9 C  W& T
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时4 r  a2 V2 f. o4 e0 ]( ?
D.PHP里用不到这个参数2 {9 |! k5 J, ?/ l0 f

! f2 @8 Q8 ]( I  c
3 D) }# i& s* [  `2 K7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?& m$ V( h& w' [! R
$ d* |) T- R$ ^2 u  q: u
A.只有在发送非普通文本(ASCII)数据时. ]/ l; ^& F6 l3 Y  m
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)8 ^& l2 w5 N- j! \6 j8 d. j/ I
C.任何时候都可以用它来指出MIME的编码类型
* J5 Q  i$ E! H, v5 g) kD.只能用来指定特殊的编码格式(例如base64)
3 t/ V; K( K5 K. AE.以上都不对7 r$ v5 b2 \" _2 s; R/ q$ r3 F
4 o1 O* |* H6 _
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)! Y$ m2 J3 I2 b
% J7 B5 f. g: h, A5 y) L
A.分隔符至少要8个字符
' l; ?5 c/ B" y% }B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
( e# O# D! F9 v5 }$ `2 bC.分隔符在MIME邮件中必须是独一无二的; h. x, H, Y) B# ^  ]& R7 _
D.分隔符不能嵌套的其他分隔符中
: X# l* F5 A5 R# @  e3 eE.用什么做分隔符都无所谓2 D# x, b& m7 K3 w' U1 g3 x- D

3 f$ Q8 j! P+ i0 x; b7 [& n7 y( N, G2 e' }( P! I" E
9.考虑如下E-Mail:
6 V. `# G! j: }
. y4 k; l+ P$ ?From: John Coggeshall <john@php.net>
9 g( m6 Y$ e5 z% ~/ bTo: Joe User <joe@example.comt>
1 X7 ]0 n( e* R& USubject: Hello from John!
" o4 g$ M' b' b$ @8 H4 O1 HDate: Wed, 20 Dec 2004 20:18:47 -04004 p9 _, Q9 Z8 |* _( m
Message-ID: <1234@local.machine.example>
) }4 {9 {  v$ h" S2 I3 \Hello, How are you?# j1 {9 q( U* \4 E2 L: v

# D% w( `) z* ^+ a; A在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
+ v3 A$ M4 V6 I0 V2 Y; f# n3 q1 l
9 @4 j6 \( K# M! J: i6 @4 DA.MIME-Version" R7 m+ I8 e- {
B.Content-Disposition( O& i9 h% X6 L) Q9 n! C- D' x1 D
C.Content-Type
. o' m) d' I4 k0 h8 {, SD.Content-Transfer-Encoding& u2 |$ L& U& K1 J2 d4 @" h" j
E.Content-ID1 t9 x: V  L3 k* g" `# E

$ y3 o9 d7 G  @" L: }3 t9 s7 J
  B; R3 o4 q( Z10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?, g6 Y2 s  y) K1 X% f( O1 h" G

0 p! ^3 ~* }1 a1 r- ~A.multipart/mixed
* D* H+ r- n. C5 j/ G. ^2 pB.multipart/alternative! Z' f% A9 U3 ]4 g( k
C.multipart/default
$ ~# s; J5 B1 B) h0 p/ y$ mD.multipart/related
; J. ^; s* S5 R7 KE.不可能用content-type实现; n8 b- m- }# s: b) ~5 L8 W: S
- N$ Q" [8 I* R& i9 e7 D9 p

/ v9 _. G" O/ W9 e, J/ n" D11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
  Z3 U7 c1 f  L# C5 E7 S( @5 A; s; |& Z3 F1 A- n
A.安装sendmail服务器2 g1 p5 I2 T- R  Q" V
B.安装Microsoft Exchange
% J2 ?5 \6 S. W1 MC.在你的电脑上安装任何一种邮件服务器: w! Q3 X5 }. I1 S
D.改变php.ini的设置+ f+ T3 R- i( C2 T/ K$ q! }  u
E.写一个连接公共电子邮件服务器的脚本; I# D  a# R0 |' ~+ `* Z2 T
* L9 z6 o7 F- Y% [! ?" h

9 r) e4 p- k( }) t12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
. @# A4 `8 L; m( _9 Z
( r* r! d9 c/ q+ W7 iA.使用GET方式传值
& M& ~7 ?& C2 o! l2 q. y$ lB.用htmlentities()处理电子邮件地址
' P3 `' H9 e! b& Y3 NC.使用POST方式传值* a. R) J  h$ h- f. k5 x
D.用htmlentities()处理邮件正文
, s1 w$ o2 t# R# E4 z3 T* J4 b8 bE.确保填写邮件地址的文本域不能有换行符
6 G+ B  B0 V  y( k4 C# G. p5 b9 |, P. [5 P) Q' T: U$ s
' j' [1 I, E. x
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
7 x- y9 T) F: M9 s& ^& [+ ]! E% w. L
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
  }- G: p: Y2 K$ c& H$ ]* JB.把它存在文件中,并用base64_encode()进行编码8 [# Q# U: z/ c8 P6 K
C.用serialize()把它转换成数组$ i& e! n5 O4 R  h% r# A
D.用serialize()把它转换成数组,再用base64_encode()进行编码
$ I3 U9 |, V8 y% l# d+ B. d7 ]E.把它存在文件中,再用convert_uuencode()进行编码! D# w1 x1 S, n
, f2 b, W' z% m! _. v5 x
" g! e6 @4 d2 t5 S8 H/ {4 V
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?" ^/ P; I3 \9 w. f4 S
* X. v. `" @& q
A.堆一个检测脚本出来5 B  ]2 P4 S: _; d' L. h
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
9 P9 X& w: G( ]( {, H8 I# HC.写一个识别文件MIME类型与内容是否相符的函数
/ ^& R# E" g; L  O, N$ QD.使用mime_content_type函数
4 E5 n3 B9 r* `' S* NE.把文件上传到外部服务器上- @  k' z* r. T  K# Q
" `  i' K  O+ u6 g7 [
3 E3 i; m" V! b$ y' J7 r
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)  K; F, s! J2 l4 D+ R: R( ~: c2 x
0 K# C5 L) X) {. q8 u
A.添加一个From头信息
& ~$ H. D: A# R5 P) S' L7 [B.使用-f参数3 x% W2 I1 ?; Z
C.添加一个Reply-to的头信息+ Z1 p* M  v, i* @
D.确保运行Apache的用户有修改sendmail设置的权利+ F) [* X3 r; m- Q
E.确保Apache在root用户下运行
  m2 W& X. Z! {# ~' V; r  \& c- v答案速查
1 S* U% G, X. y( k1:D+ [# f1 A: V& P- ?) e
2:AD# y+ \0 A' J  B/ x: J' v. M$ E. k
3:E
4 Z% i& g2 |, F  B4:Content-Type:MIME; u( t3 c: r5 s4 g, r% f
5:BC; J3 i; R. \; W1 p& r/ H; D
6:A
4 b# s& W" S  {6 ?  |; y2 K- d7:C
9 G, k  }3 [% P4 F1 P% W4 ]8:BCE
+ q2 E8 i: ]) m" C1 K+ t4 `3 Y9:ACD
+ F1 N3 O5 O; |10:B
/ K6 Z' b) P  o' {. l* o4 M; `11:D
: @- o1 [1 N+ F* J: M4 |12:CE+ |; f' C9 R. D" Z8 O; {
13:D& l; Q  n& W5 b, i% B% H
14:D. i1 B/ @- U2 T+ N6 T; L! M4 n* M
15:ABD
3 h  h. K" X. v3 A- n
/ A" x( \! S! G  ]9 r: o+ ^, ^! r4 c7 u
# ]% e7 \6 _  Q) g" C) W6 _. O: A2 q# R0 j3 F
答案详解/ H+ `4 w3 q" _3 }, b

" C, w7 Z) g% U# [& i1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。; \  i) h; D( P/ u5 _6 }
3 B* O! y  |1 ?9 O( b- `
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
' M; A5 m' U7 D! F/ X& c$ |; a6 P# @! f! Z( }
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
* j5 U( W: M1 n
6 X: e, a$ F1 I; g- c) b. o4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。* |2 Z! g) d% W. j4 P
( u; i4 n" {# d, I# J
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。: I  C- d. C0 Z7 i( I

* T& `. S0 P0 m3 V, D% Q% H5 ~6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
3 N& ]) l2 h4 A' u! U
# Q% J' d; c8 x! r7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
# R  ?! H/ L% L" r3 s! I
8 h/ e/ W  |& W, T8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ k, w6 O1 z" J, F$ Z& ^, R; E( ]$ j1 H: W* Y' ?  {
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。/ p6 ?& X. p- C* d" h1 y
1 d! y% t+ @" K3 Z0 _" U' T
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。& c& h4 v8 q9 j

. j4 G: ]" z) R' N; E11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
( j# T5 k3 V; k0 ]5 b$ r7 d2 I3 i
/ G" B9 L: K. Y8 P. n. [$ F$ [12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
# Y3 g1 i1 S0 Z9 r3 \) ]- t8 C+ Z1 ?; \/ h
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。- f+ x, j# R. q& z% X8 j5 L/ O

5 I1 O$ Y/ k! u+ w3 Q14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。# u: C/ O/ }( a6 H" k0 G
; @4 d7 X4 w8 t. `( F
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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