返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。" H# _, l' {* p1 S: N7 F
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
$ N, R3 d% I! J: i1 c用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。2 e% c$ ?( v" R- [

5 E* M% ~% K. i, F/ P: b. @2 I3 j" a# |
问题  Z" `) V' M0 o

: l# k; ]+ ?& b% c1.以下哪个不是合法的电子邮件地址?' q+ T- P& ?0 T4 G& p5 y0 D9 r
7 m6 m/ X  z; M3 @1 k! }6 f9 x
A.john@89w.org- |( Y( @9 m$ U/ A5 t, [1 k# i1 `
B."John Coggeshall" <someone@89w.org>
+ v3 J# H! m( ?  j! y4 }4 gC.joe @ 89w.org
9 [6 p- r5 N! U( o- E1 B& eD.jean-cóggeshall@89w.org) s- ?/ `  ~/ [8 H4 I3 g  R' u
E.john5 U3 ]  [6 L. J! b( r4 ~1 L2 J
) S! l0 v4 B- a9 X$ S- u

! n% q! e* f3 i6 U  j2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
" j: F2 n1 `, u1 Y  T3 B1 O) y
3 S" J5 n# Q1 s. tA.Windows/Novell不需要第三方软件的支持就能实现该功能
8 Z' Z  S. T9 {& t: i$ G8 L% ?. LB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
( H5 L6 i( g  R  dC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送7 {( x" e. J. W* w7 |5 x. s
D.有可能完全相同,这取决于sendmail_path的配置
: O& W( W/ N& N) v- y( YE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口. q+ w6 |8 j  i2 V

7 H  Y, @' j. C5 C) g& b! X' w; ?
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?' U/ O+ ^) P( m1 |2 f& ?

! g. ]. ]. |) W9 t9 q( q2 ~7 n# z0 ZA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
, D" I3 k9 l; M; x4 ~B.用PHP代码,通过SMTP直接与MTA连接。+ ^5 B4 w2 G5 W
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
8 G0 }& {$ }$ d4 [( ^5 kD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
1 U8 U$ f, f4 Y& B: M( AE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾( N0 i9 U7 t# x, Z7 Z
+ K3 k2 k3 v) g2 y
% B; E& E$ p# B
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
4 ?( L5 G$ z$ g7 @9 t3 |4 _& S( g; Q6 M8 i3 a3 K
答案:____________
+ Q* ]6 Q3 K! g' a( A
2 c! _# B" H+ X5 `/ T( k7 U  ?+ Z2 d, D' ]2 B, o
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
) G+ \$ ]9 n  H1 ]4 x  b' l+ f7 a' Y3 U: Y  L3 X# ^- U
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
9 }0 l6 u5 Y4 k+ qB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
8 ^) A# {* k+ L. cC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID" O" f6 Q9 x2 Y$ l  f
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名. K7 C) D% T2 m- `5 q& x& ~  s
E.只有一个答案正确4 F! W" o. J# Z

8 Z7 `5 [) E& X% Q+ p+ J5 F& S" r- \$ u
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
- V6 g& K2 h3 _9 m& W9 C. E5 _3 {- V  W8 T: d: G, Q7 c1 R4 _
A.从UNIX或Windows/Novell发送邮件时都会用到
% h' n) ]( m6 I+ W5 Q$ g3 m+ rB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
3 g  k7 a8 x6 EC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时6 r' |' s2 \5 W9 }9 Z
D.PHP里用不到这个参数
2 s" O2 k+ D8 N! o
, z' g& p1 r, Y# Z! n" V7 _4 k) o% I3 ?6 P- E' q
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
6 [! z' M! K2 j. w+ J- ^5 B' N6 `+ [6 n% _3 f) @( e# d
A.只有在发送非普通文本(ASCII)数据时
6 C/ O, L2 p6 k7 tB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
5 W8 n1 [) b8 AC.任何时候都可以用它来指出MIME的编码类型
# J6 n1 j5 C! t, y. D3 X) yD.只能用来指定特殊的编码格式(例如base64)
( Y) I1 h" S$ B$ H; OE.以上都不对
+ q' ^/ q. c  f4 U7 L7 Z5 x% T5 V) j8 ]1 Q- T9 B
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
% b: Q% P+ B" q7 s6 |5 P
6 ]! w7 P7 `: A; q: fA.分隔符至少要8个字符
: s. N! a5 s+ e' k  w6 m- [B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
5 _+ @/ s: l0 d# F9 WC.分隔符在MIME邮件中必须是独一无二的% i3 X/ c! B* G) D6 `$ r
D.分隔符不能嵌套的其他分隔符中
2 ]1 n" i% i! A$ [6 x! r( l* e1 w- ?E.用什么做分隔符都无所谓
2 M9 V* R9 F0 z/ u# z  U: m0 x9 Y) F

% b! ?, Q, J. U+ x$ T+ ^9.考虑如下E-Mail:$ H# Q; c. E  r4 n0 w
7 w5 t0 R' q* Q2 I: r0 `9 j
From: John Coggeshall <john@php.net>
- G6 l5 _+ F; G) \  R  k0 J$ [2 gTo: Joe User <joe@example.comt>
' |7 h& @; I" `9 @& p7 h' m. }0 FSubject: Hello from John!
- D2 }* s. `4 ~4 nDate: Wed, 20 Dec 2004 20:18:47 -04000 C. H. O- B. Y2 J6 q0 B$ a/ d0 ~
Message-ID: <1234@local.machine.example>
& x( i! O$ E+ f6 D0 ?8 NHello, How are you?
, m* @1 \9 H% C# ?& \1 `
* \/ z. e+ S4 Y* M在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择); j7 N6 G# ~; M4 T
3 F  M+ B2 ^/ w
A.MIME-Version+ x. r. ~8 u9 W& ^; k# W; @
B.Content-Disposition
0 l; n, _1 K, b! I. x0 lC.Content-Type
5 [4 p# t+ g$ G% OD.Content-Transfer-Encoding- M# E$ n2 C, R# g: O2 m+ N
E.Content-ID: h7 Z0 E* D, \9 p" {' c7 ]3 X
! C+ L  y( N5 q# P

0 i6 q1 p3 ^2 Z: h10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?2 [8 k( A% N( A- f- E( R
, X3 f- h, s5 ~! r
A.multipart/mixed, l, p% V3 P; M" j7 P, c9 I
B.multipart/alternative7 L6 p/ E0 B5 K! k
C.multipart/default2 l% x( A6 O7 W5 d9 ~$ h# M$ x8 A
D.multipart/related
" B' y. o( h6 }% l1 q9 r) s$ \E.不可能用content-type实现; h9 W5 y, J: I/ z
6 r4 Y, P+ \4 M" v3 _9 p
6 y+ x$ U, E$ N- p0 R5 A
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?4 J( v5 H2 m8 ^

3 y* _4 T; n0 n$ I+ |4 [% mA.安装sendmail服务器
8 q7 i8 C+ T6 k8 y) u$ x4 tB.安装Microsoft Exchange% b: y$ X  J( \) Y) E
C.在你的电脑上安装任何一种邮件服务器
) m2 s1 s& I% C! {) l( U; eD.改变php.ini的设置
' j1 ~3 |* P; P6 m- `1 a" j1 jE.写一个连接公共电子邮件服务器的脚本1 d: K, Z, }9 \& k
2 Z/ d, y3 g3 c0 Z% v/ W

) R7 Z! K7 W( B; q12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
7 I% r9 @* v2 S& Y3 k9 ^. j- u3 t8 L& M) h# {" \
A.使用GET方式传值  K( J8 Z. c* d8 }5 H5 s
B.用htmlentities()处理电子邮件地址1 ~9 o! \# L7 z! w* D
C.使用POST方式传值
, s' U: k2 P) }* sD.用htmlentities()处理邮件正文+ t% V  b( g  o$ x' M$ \; K
E.确保填写邮件地址的文本域不能有换行符* |) [8 D. m  k9 `- E& E3 u
! C# t# t1 r) n' m  r: |  l

6 _( _3 [  Q) O* M; c, [- F" u/ }13.如何将一个数组作为附件发送,并要能在接收后重新组合?
* e5 `* [0 @2 [; @# c7 y# |- i) j# u6 b4 U7 ^4 _
A.用serialize()把它转换成字符串,再用htmlentities()处理一下7 h  e+ W1 _$ A% o8 D9 h7 h
B.把它存在文件中,并用base64_encode()进行编码# J& m5 j& d. A8 `
C.用serialize()把它转换成数组
" }* L( k6 C% {1 }7 W+ U  g/ J8 SD.用serialize()把它转换成数组,再用base64_encode()进行编码
+ H8 l: Q; V0 [' E" y! fE.把它存在文件中,再用convert_uuencode()进行编码3 |! a2 k+ V1 I" y. l

$ Q- G" k3 ]( e3 r% `6 ]! B1 M' b8 B4 }& X
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
8 C* p& S+ d" k5 |+ D
5 j) N- ]% v/ Y! pA.堆一个检测脚本出来( @' y4 B1 |+ m$ N0 N/ F/ p
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型0 _1 ~+ ^/ h# J6 X" }5 }+ m! G
C.写一个识别文件MIME类型与内容是否相符的函数( f; O; y" @9 Z$ `
D.使用mime_content_type函数
1 z! W! [# {& x2 @E.把文件上传到外部服务器上
: L$ \1 e- ^% X% @* k& G  f
) h& I/ ~% [6 `7 [$ Y
7 t; |4 i: Z  J: I/ ]15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
. b! A! }! G) e' U
& U! |$ T- r# [: `" sA.添加一个From头信息
7 n7 x) c6 L4 _5 cB.使用-f参数
8 H' c  ^+ `" Q5 ^$ F) K6 \C.添加一个Reply-to的头信息4 n' r' K+ }1 S4 R/ T
D.确保运行Apache的用户有修改sendmail设置的权利7 h. I. n3 Z8 B% o) s: i
E.确保Apache在root用户下运行
# Y$ Z  O' P- p4 _8 s, E答案速查; C+ X1 w8 w- R+ K
1:D
$ M" \7 i. g' U; V$ m2 U2:AD; o0 g8 U5 i+ \  P% K
3:E
4 }2 j" C: Y5 i) o4:Content-Type:MIME
$ ~) r& ]& U( w# F# ?# ~# L' P5:BC. B; F% F5 C5 o+ n
6:A4 E: v+ I. A+ z# M- ^3 W3 V9 Q& K
7:C# s; T  u* c9 }$ h, X, w
8:BCE; M" y" Z0 s( S( E# Y8 y7 ?
9:ACD& |/ d" }4 v% S# C
10:B
! K- u* J& P- s  T2 H11:D
9 Y/ I& C' W3 D8 }! k, g12:CE6 F$ x: h5 G$ u2 j/ d" L
13:D
, q4 N7 d5 @# Z4 P5 H1 w% ~5 e14:D
2 L$ g# t  [: V& B) t2 n( p3 O15:ABD
7 J3 Q. A* Z4 ]+ U0 u: ]! p9 Q2 V  ]% \# z
' B. v- Z! J  a( A2 b/ }$ y8 o+ s

3 Y" g. @- M& B! }答案详解, J8 w: V: E; s7 O+ X! W

. J5 A+ n2 t, T2 v% u1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
" Y4 h: x/ U! ~; `8 l& w5 f3 v! |2 q/ [+ 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程序自己来处理。
2 `) t- V2 d3 r* \% r  g- h5 c4 N! \/ \4 e& C  Q
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
/ `' R0 G! }+ Q: B5 v  O% J1 h9 h( m) ?
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。  i: C9 l/ l, E- |1 U# X+ x3 T
- I5 q  y( ]' p5 O: S
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
: o* u$ M9 O: m0 |: @
3 c6 h2 Q5 O7 o  u6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。; s0 t* y) j& k6 f; n
& s4 E$ h) K) h0 E7 f+ _
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
1 ?# n: v1 k4 K# {" _1 H
/ z9 U5 _" N! }  A4 J0 ^8 ]3 G8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。7 J# j9 d9 y' p- S

7 ?8 u' X- H0 F/ e' ]9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
+ J4 k) v5 T* Z- B/ b, r; l
1 s' g$ s- C  R8 P! C2 p10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。5 }- d0 z' Y, f5 ~0 w. u% y
: v+ q. t3 `* u% W5 E2 X/ `
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。' I( c/ ?3 x. B
3 U7 R9 b. T7 [% u' t
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。. p' _* J3 i# {
. B$ X/ J' |; |4 O& V
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。* S2 z2 R7 K+ ?6 ~8 ~. \
$ d, k/ T& a: E) [1 c
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。# v9 m( `2 {$ h6 e
" k/ n* `  h3 ~! m
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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