  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
! `. V7 Y( F6 v, t% }还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
) I! S2 C% `6 s5 q用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。& _4 t6 k \% T& H5 ?" h, q
7 M" I" t6 n$ }/ A0 [8 s+ m2 q
I( k) C$ e) {/ ~" q问题
5 W8 l* r4 D, ?4 J! `
( x0 g. F8 A, X4 F( a1.以下哪个不是合法的电子邮件地址?" v3 I7 E1 p* p7 w
3 N/ i" I' n! K! g' e9 n. ^; O" A- J
A.john@89w.org
. Z2 \( j2 U0 Y: k& j5 `* |B."John Coggeshall" <someone@89w.org>
0 N2 Y, N" K- |7 d- W$ [C.joe @ 89w.org4 |1 K& a$ T, N) S; m+ J
D.jean-cóggeshall@89w.org% M2 }' f1 x5 S) `- \! d O3 u
E.john
7 d7 d1 F7 A( N( ?7 d9 ` l( x1 {- w2 [8 |4 D" }+ m. h
% T& v4 z8 C( [2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)" l. D& R+ s% S# B/ S* L8 T2 z
6 s" [7 H9 W6 {9 u( I! z
A.Windows/Novell不需要第三方软件的支持就能实现该功能. B4 s) f, |2 t5 D7 W/ d
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。& o. x9 O4 K2 s
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送4 i7 F4 ^0 F0 V, z
D.有可能完全相同,这取决于sendmail_path的配置3 Q- P9 p" ^' s' p3 f/ K
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口9 O N% t9 N1 e0 d: I, B
. g' i& x( T1 Y Z# z. J: C7 x: l+ @0 i; A9 n0 m5 `$ Q2 |% @1 F
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
: S6 o6 ^ g# I5 G2 c# F+ h9 O
; s# E$ t- b Z& o, OA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数8 \) s2 L& ]# b4 O6 k% K* x: l$ a* u( A
B.用PHP代码,通过SMTP直接与MTA连接。
( q. T' M3 k4 S2 ]0 r3 u& ZC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
$ A2 B; n- V( FD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
- Z7 _. B$ b: G; b2 ~E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
4 X& U5 F" D* a- Z- L
3 {$ n1 X0 ?/ ?# e7 e( D( B# m+ C2 n/ v5 t
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
% O5 A8 g9 }7 t$ Q; x
# s8 N3 o3 X5 ]4 q2 e3 ^答案:____________
; a! C1 K: q. Q" y$ T
6 w y, k' x4 l1 x' ?# i$ j: b. _" z+ S4 h3 [& R
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)) [ r7 Y( d0 s$ ~. E
% s% y, {; P: ^4 Z u
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示9 h0 h) H- s1 D- X5 q, S4 C
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
0 M; C8 a% n, OC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID4 n+ r3 R5 G8 p8 {
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名, o3 O( L/ S+ u# n! x
E.只有一个答案正确
- L# T, H; z0 P9 C) t# v: j& |. Q0 Y+ _. w. C" F
: X; n# H% \: l/ Y& C! Q4 a6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
: }: ]) X1 `) @. E/ ~- i% r6 \3 S- v/ \& ^/ u$ W4 S7 r, s
A.从UNIX或Windows/Novell发送邮件时都会用到
4 U% }% k# C7 i5 ~2 S" j3 }, f6 j" ZB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时3 u. {. h& Q! C4 _3 G
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时+ |0 P; k2 H& y4 O7 m+ u# D
D.PHP里用不到这个参数7 \5 d/ O1 f% b! A2 C) t3 U
- Z# f+ R6 b& p9 |9 v% [' b* p7 O* `1 _4 r: D
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
$ n* f3 d" b9 a. t# c( v5 I( z# G7 W% q3 c0 ~
A.只有在发送非普通文本(ASCII)数据时* f& C5 G4 R( j* v9 c
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
9 E5 v- m8 e& p& U8 u" b0 ~. ~C.任何时候都可以用它来指出MIME的编码类型
/ X0 d* J- D& o# QD.只能用来指定特殊的编码格式(例如base64)
) i7 ]( g/ W6 e$ `E.以上都不对
* r( R+ |7 W. A3 O2 `. E1 j/ ?3 Y) i. @1 _5 I
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)% x6 A8 k6 {1 g; _/ x9 L
* \$ d9 E: \- j( b6 Y" y* W
A.分隔符至少要8个字符/ P6 a1 ~1 u8 Z6 G7 q) l
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)+ s. i! H+ e8 A
C.分隔符在MIME邮件中必须是独一无二的
' K1 Y" ]) g! D( f; MD.分隔符不能嵌套的其他分隔符中; |5 c. d5 L$ U# J
E.用什么做分隔符都无所谓
+ A/ p1 S5 Z2 J0 g8 E' m: P/ N4 T4 M) M+ v5 G
0 O A* D H1 ?/ J
9.考虑如下E-Mail:
% F( s5 q7 l" P8 u5 I& F% y
+ O H6 J7 ^ V7 ?1 |4 d" `; h4 T& pFrom: John Coggeshall <john@php.net>
! h8 P/ X6 Z: C/ o5 rTo: Joe User <joe@example.comt>
6 b% G# T; t* X) K- F, ASubject: Hello from John!
. i: Q8 T* s: z: C4 F4 U O5 ^Date: Wed, 20 Dec 2004 20:18:47 -0400
& h) P/ I9 P6 X& A$ A- t. d% @1 Y0 qMessage-ID: <1234@local.machine.example>! d8 _, G) ~0 T: P0 I0 U2 q
Hello, How are you?
: d& {0 N7 e+ \0 o' S( Q6 G5 T. w3 Q# n& M0 V$ y: m, c7 ]
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择). [$ ?8 [0 L+ _) p; G5 A0 F
! t( s ]4 k4 a ~; aA.MIME-Version
- ^2 g9 s F8 S; B- P" GB.Content-Disposition' \# [6 j" I# m9 T; k' p
C.Content-Type
/ h5 W# [2 k3 `D.Content-Transfer-Encoding- o& Q1 @* ] E4 I8 m8 }/ w# [
E.Content-ID8 r/ {1 T4 ] o# U
7 a( v) E& X% P& @" {
5 q# j' R& @% s! r* h& W
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?, j& Y# I R& q+ i$ t) B3 J
: e4 w! H5 {/ R: C( {A.multipart/mixed t& j- L( ^# J* u) m3 X
B.multipart/alternative
) p; c4 { R- Z. PC.multipart/default0 d% H; Z, F$ t5 L, F( y$ A
D.multipart/related
! ?7 e& c8 W- a4 u; LE.不可能用content-type实现! @* ]. ^2 G+ ]( f+ G, \) y! b
* m% n/ S4 Y- n& S; U
# h% P$ `; b+ G* i; ^1 Z) i11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?5 @% Z+ n$ b5 l; u
0 a, W8 m% a1 B0 d
A.安装sendmail服务器
1 B" Z2 i7 V7 E m3 {B.安装Microsoft Exchange/ l a, t( \) y
C.在你的电脑上安装任何一种邮件服务器# _. g: l2 p0 @# g" e% t# s/ M
D.改变php.ini的设置
+ _1 ?2 s/ @0 }E.写一个连接公共电子邮件服务器的脚本" o! E6 H+ u0 o2 J. r2 T6 e
+ W& d" G+ J9 k* C" V8 M" a: r9 n0 A5 ^6 O8 T
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
7 N4 |6 B. D8 e# c5 W, r$ e' v9 q+ a# j0 h/ ?
A.使用GET方式传值- C# E8 l6 H2 p) P7 M1 d6 I
B.用htmlentities()处理电子邮件地址. ]$ C! v+ p, G8 G" k& W9 j: j
C.使用POST方式传值
; C1 ^. J# J- l2 f4 B, WD.用htmlentities()处理邮件正文% L& `- v& S9 {; R: u
E.确保填写邮件地址的文本域不能有换行符
7 M% A5 G" d2 J6 B
8 O5 |5 A- u2 K9 _- J
7 c( `3 ?; w" H/ E: S13.如何将一个数组作为附件发送,并要能在接收后重新组合?6 U- Z. l1 z4 P3 u$ E- U
2 ~0 L/ e+ S0 \: `6 f0 Z
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
% ~: T! J8 ]) pB.把它存在文件中,并用base64_encode()进行编码5 p; O# \ C) I. q
C.用serialize()把它转换成数组
1 r# O3 {8 |: n5 bD.用serialize()把它转换成数组,再用base64_encode()进行编码
& u7 w3 b" G P- i* H8 c TE.把它存在文件中,再用convert_uuencode()进行编码1 R3 ?3 H. N7 l: T6 Z/ X9 v
/ @6 M9 s# E; t& s; g: t
& C8 o; E; a1 J6 r* r
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
; N0 L' u4 g$ L/ }1 m/ r4 s* D3 z: g% v/ i, O6 y
A.堆一个检测脚本出来 G+ }& Q5 Y F2 o5 T, E5 |
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型" h& o, j1 ^) Z/ P6 o l$ W
C.写一个识别文件MIME类型与内容是否相符的函数
( ~. U& e" ?% @1 TD.使用mime_content_type函数9 w$ K6 y& A* T
E.把文件上传到外部服务器上
9 q8 g [; V C8 O: I$ ]. j4 U5 w7 u+ Z! r v* z, d
5 Q k# V& H9 }' R z1 T3 x2 O& Z15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)6 I! U i0 P& v& e
5 E9 J4 L0 x& l( I1 b( tA.添加一个From头信息
8 X' a8 }6 t# s# n- ?8 y: ?B.使用-f参数
3 c Y' f$ ^; _3 k- U! _ eC.添加一个Reply-to的头信息; q6 M. }1 d9 N% F
D.确保运行Apache的用户有修改sendmail设置的权利/ U+ A- _4 S/ s/ C; R
E.确保Apache在root用户下运行) V" m8 X8 _. ]1 E+ V
答案速查
% c9 o7 p& m0 ~% Z) s2 W1:D
: O1 c0 r" P* N) o2:AD
( ]2 r" y- k) v" [( R: w+ Z! K; F' t3:E3 o9 r, @+ h3 a' m- _
4:Content-Type:MIME; J8 c, N1 l1 `+ {
5:BC2 z$ b" a: ^, R& S: I* b2 @) T
6:A
6 B6 ]% Q& Z) c9 G$ x) T7 W' y7:C E: [$ J1 x# A6 c: f
8:BCE
, u5 n, U4 Y# t. K. V9:ACD2 | L' R. u1 }; U: u2 R
10:B% l9 K1 `$ R L5 F3 t' A/ m; }* s
11:D( \- n! K7 c: n" o
12:CE
! X c7 f. ~3 i13:D
1 c! v5 d% G+ V. c" N0 @. a/ M5 k14:D
" \+ L2 h. R% l3 T% ^8 k- q15:ABD
9 F {* M# k! n/ [' x- v/ d7 A6 x3 {3 U6 O* m
( I' O: S& O; }9 K: K' X' Y3 j3 C- i9 s1 L
答案详解! ]' V- X: o! }2 {3 e( L3 K; k
- m1 B/ e2 O5 [1 s [
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。. T1 R0 s, `5 x2 m% @+ \4 |
0 Y* S# W2 x$ I( 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 `% t c7 t6 Q: x, G* ]$ @/ g0 l5 e" X& H6 e& w% b: W
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
6 K1 l8 s6 D; I7 A) J) R! r; G* w/ T; Z; f4 d D4 r/ H
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。 a \# X) z/ [
7 u0 @& q! `+ X. f/ B5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
) q& V2 M" a( L7 W% }' Q7 }0 F F/ g8 R
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。9 Y! P0 O% k5 ]4 _
9 X2 [& x. `8 z7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。4 ^+ q) J+ `! y" `
. M# A8 p! V0 G, E* \1 D' s# w+ X
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。& s4 W1 R: _! u7 b; I) \3 S
2 r8 x! f3 D J. i9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。+ `0 b) N% ]1 L; U% m: h) l
# [4 L5 v' e3 u2 E3 X$ x
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。. ?' L ?. v) Z# x) R* l
3 l9 ~: N; L8 b, ?# b0 ^9 _1 K! H
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。7 v. N+ n% J2 s8 {! x
) t- f% D- W5 S/ N, O5 ]12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。, W) q, l7 f' M! H8 c9 z/ w
4 W' g' R/ A2 A8 q2 `" h1 i$ {13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。* a1 D) z& N8 {" x
. a. g( ?+ J# J1 W& a r14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。7 Q/ Y9 ?7 ]. O N
3 }& m5 ?# [0 h* P, e% u
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|