  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
; P+ y4 x, u1 H: F还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
7 }# l4 k# `7 H" r用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。3 D' v4 k9 U2 z) K
' E: K p4 z" t# V* p7 }
8 y/ r7 r5 S# w% c4 u
问题
+ Y4 `3 d+ V9 Y) J- o8 h! ?% H& J- Y. s1 v% Q) o/ }( z( z
1.以下哪个不是合法的电子邮件地址?
% \! a. e& E8 W2 ?$ k" }& E. I
+ Q- D; `7 ^! `7 l. L h- e# rA.john@89w.org7 H. L0 `3 s9 Z7 c9 B G9 o+ x
B."John Coggeshall" <someone@89w.org>
5 g) f! S: Z# P6 n4 Y2 u9 J( MC.joe @ 89w.org
# W. I: r1 R/ ~" Q9 }& [& v- O/ UD.jean-cóggeshall@89w.org6 v7 C* w+ ?) H# E
E.john
2 Z9 D) B2 U" |/ }- a) g+ ]" w1 t0 D& E" T! N8 C
1 @& P; ]+ V. S$ Z& i! _3 V2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)3 `6 }5 }6 g/ N" @2 k! V
, F' k3 T' i; K, Z4 O0 D, q/ [A.Windows/Novell不需要第三方软件的支持就能实现该功能
# f- g, y5 Y4 D) k' vB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。2 s8 \ L3 y9 G
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送- ?+ d: @5 B$ p
D.有可能完全相同,这取决于sendmail_path的配置" Z5 R1 H, F+ X4 I# \* Z
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口; I9 U9 S: V$ E5 C
; ]* F+ _0 h1 P9 g/ g% E* z9 f/ ?
7 t" d% u6 t5 X' W3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
6 W5 O0 t C& E" e e2 y% g l
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
4 A4 A; o$ C, a( T0 t8 WB.用PHP代码,通过SMTP直接与MTA连接。3 n7 F6 Q* Q" c( |- y) t! f
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
0 e! y; G$ O5 n" DD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。! Z/ c* Z9 S% G8 e; z5 i2 {
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
: ~5 f& W2 y# ^& T/ O. ?. x* q1 g# k4 Y# W/ i, D
7 \- h8 R1 [) _ z" i
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
, D" j1 r K8 B$ j( P8 z* @" G! j5 ~8 [7 D; w
答案:____________
% T/ N Z5 l" a+ e: b# V' V. B: j, a4 b2 z7 M! ?& g" v( v
% A' Y9 x% t$ X- D t* @/ ?
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
# D0 a4 b7 \) r6 r( c5 X8 M g5 S2 w' y7 y! Y: I0 W+ g" c6 F& E8 q/ Y
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示! A8 z! P; L. N, {; c! t8 N% J
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片5 }1 j5 s: S7 r6 |
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
, f; I6 u# X9 T* `* ?7 p( k7 gD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名$ A- v4 v: e) ~# Y
E.只有一个答案正确* G+ i2 N7 z8 _- X7 Q
8 K3 P. x0 ^2 j
& ]9 I2 L2 x' y2 V; p6 @6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
# I8 t4 z! F, E: U0 }$ [% ?% V( P) ~1 \! a
A.从UNIX或Windows/Novell发送邮件时都会用到4 v9 O1 ^1 J. }4 W
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
! n4 t# E, f, N8 l4 pC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时3 b) o* x9 v2 ~. V3 R' m
D.PHP里用不到这个参数
, ?9 _) W. V0 s2 U/ z! k1 {/ K2 I
. L5 [ |( O) S3 S5 S. n- ]7 A- R$ a3 N! H) I3 a
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
) U! `$ c" k4 e" }
# V5 ^' q: B7 R6 CA.只有在发送非普通文本(ASCII)数据时6 W9 I+ B# x; {! G' Y4 K* Q
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
* ]7 \: |8 p& \" JC.任何时候都可以用它来指出MIME的编码类型, J: l% z' p2 ?. ~" Y$ }
D.只能用来指定特殊的编码格式(例如base64)
, b, u- o; n* _1 J8 p+ e8 c6 W8 B+ VE.以上都不对
9 j% k* K; X, Z7 o3 A0 e% e- D/ T) F* S4 v$ C
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)' ^% }3 h/ x' v' }* ~
8 ~0 n: B' g9 i& ^A.分隔符至少要8个字符9 T7 X X7 g' Z7 j
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--): _" L) X% ]! k8 ?' h
C.分隔符在MIME邮件中必须是独一无二的
* r* P# \9 d! y2 E* W4 sD.分隔符不能嵌套的其他分隔符中- b! j( s7 A u: s. G# a' s# T5 E
E.用什么做分隔符都无所谓
2 a% r! X) K( m2 D+ C$ Q
% x* }$ j2 Q- ^6 P7 K
% U+ }3 q4 e& i7 Y" \" r+ p9.考虑如下E-Mail:
7 f3 Q2 P' O2 o" s7 k5 S' f- `' s6 s1 O8 ~; Z2 E# `( q+ H
From: John Coggeshall <john@php.net>4 d r' i8 } Z
To: Joe User <joe@example.comt>
0 T" ]& W4 r! uSubject: Hello from John!
3 o4 E5 c" Y0 Q! e/ K* L8 xDate: Wed, 20 Dec 2004 20:18:47 -0400
4 J0 K, k8 d0 h& ~Message-ID: <1234@local.machine.example># f- E$ I% b: O
Hello, How are you?0 \+ i$ e- w& A% \* f' n
4 z+ L/ b4 x9 ?" X7 Z
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)% @. K* q2 |! y- P$ S( o) q
& M& L/ v z, q2 n( WA.MIME-Version( J& [' V( f0 c- Y+ J1 c9 h6 q
B.Content-Disposition
* \- u+ H( W1 t& q8 NC.Content-Type1 r# [0 O7 W2 O# J7 w9 p+ C
D.Content-Transfer-Encoding! Z) m# k( k) K+ Y4 r
E.Content-ID
' _5 J' H7 P# [$ c" U" S1 a
$ T) ^9 y0 g: v! ~! o# m( E) s, e3 `3 z1 A" f3 x' `" W
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
% b5 J/ k! E0 _5 y
4 R- e0 f0 C* x+ z9 j; NA.multipart/mixed
& T& Y( ^1 z U, dB.multipart/alternative, l- p* L$ e- Z( y4 M& E
C.multipart/default( l o* Y, Y# K+ x5 O2 j
D.multipart/related8 N. D* c% ]) }6 `* B
E.不可能用content-type实现
* j4 r0 b. j8 u. ~2 A
+ @- A$ b* H5 S/ F; ]% Q( n* E7 t" {
c" ^, W+ K- w! [11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
; V& ?6 W4 Y; q* G, |& I4 Q% }& Y8 e1 g
A.安装sendmail服务器: n8 o$ V7 U# E& [5 j
B.安装Microsoft Exchange% q5 P; C- J* w# c, D# I
C.在你的电脑上安装任何一种邮件服务器$ A" @/ e( Z, ?' K) ~
D.改变php.ini的设置
* C5 V2 e+ I, YE.写一个连接公共电子邮件服务器的脚本) X ]1 ^% f& ^6 [! Y) p" b4 {
8 ~2 ?4 M/ d5 w. z2 g1 A1 @0 B
& V3 g; {8 `) R2 M
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
: y: q t8 a: n. ~; l( ?, f6 q3 U4 X
A.使用GET方式传值 R n& L" v! f$ @, m8 J2 [5 h
B.用htmlentities()处理电子邮件地址, m4 O1 b0 K+ A: z' I
C.使用POST方式传值
7 M( f8 c$ O0 ^( E8 }5 T: yD.用htmlentities()处理邮件正文
, n/ q" Y4 X+ p) iE.确保填写邮件地址的文本域不能有换行符
8 @6 P) r4 X. z6 D. F, @# D3 B) q$ J; y9 p" n
0 k( f0 C" o! E% H8 @: C13.如何将一个数组作为附件发送,并要能在接收后重新组合?; D" O) U# f* O; Q# @) a/ o
0 J$ T2 g' ?9 a! ~
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
" R( `, |# G/ L0 [B.把它存在文件中,并用base64_encode()进行编码
& Q- f: }5 D% v) Y! PC.用serialize()把它转换成数组
5 H2 Z- t$ f' j8 \# qD.用serialize()把它转换成数组,再用base64_encode()进行编码; U5 r' g' p& | P; e( Z
E.把它存在文件中,再用convert_uuencode()进行编码0 h L) h7 L5 Y) _4 i/ n
8 ~, S- r+ T3 m4 F) f
6 J% a1 e( b. K) F# v
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
$ _3 [# K1 Y( T9 v7 T2 g; U7 j! E a# P6 A) }. `: t, X
A.堆一个检测脚本出来3 F& ?0 p0 S- V/ u4 M2 z
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型7 T6 C& E* z# k2 {) Y: i
C.写一个识别文件MIME类型与内容是否相符的函数
4 q; |+ G$ S9 p# K4 d/ f0 h) d2 ED.使用mime_content_type函数
2 y0 q$ O T, ~E.把文件上传到外部服务器上2 e8 u \ }3 J; J1 r
2 D. B! R& t, M( F
7 Z& w6 v2 e) h! ~9 c6 B4 d+ B) s15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)) `7 w% e! q7 q
/ U7 c( j$ l+ u. o$ oA.添加一个From头信息# \: k7 T8 d1 Q u3 F+ @* @1 O
B.使用-f参数: c. E5 M2 C7 H$ f2 Q, I
C.添加一个Reply-to的头信息% o' X& a( k: o. ?1 P8 B1 ?
D.确保运行Apache的用户有修改sendmail设置的权利! D' L L$ r& g$ ~
E.确保Apache在root用户下运行7 K2 e( a1 n) @* }8 \ E+ X1 ~
答案速查3 k: t0 S3 c2 K% @
1:D O. i2 C! O4 R7 ?' \' U# J l* O
2:AD; c, X$ [9 J$ O( w! ?
3:E
( d( k3 x# T' h, Q4:Content-Type:MIME
: d1 n' L+ a, h* u5:BC
' O; x* X$ s: g& F) z7 d6:A7 P6 g# Z p! w9 c4 V
7:C
: B; I- t2 [1 O5 Y/ Y, X# q8:BCE
4 N- y; S; v, G) v4 R! G/ m- T9:ACD4 F3 s( K( ?/ h V. h$ P" p+ P" c4 `
10:B
* s, ^8 T; r0 v3 [; k7 P# d11:D s% P# e# z1 `6 L6 ^2 e8 r, M" E7 V
12:CE
9 a/ z3 e" q( C% G; g% f13:D
: F/ g' Y5 d" P: p3 z14:D
! t7 q/ G6 D+ U3 H5 `- v15:ABD
; ^( C/ A( q j N0 I2 j% P6 ^& n0 D
6 x9 R$ b; B4 I/ d! D- T' x* b0 A# j F( J' `1 e4 s
答案详解
* h7 E0 {7 k2 |, c2 e/ J4 K$ I! F3 p# y+ j' w3 f" F. d9 e+ V
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
. T1 ~ ]+ Q. k' t( I; ]) V& g, r I9 Z
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 C% h! I$ S1 {7 @
* X9 z& U0 A) H7 z( ~3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
. ~7 s/ V8 q4 ]: s8 z& |7 g9 b8 T
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。9 j5 S9 Z- H) g4 u) Z
9 a/ [: q7 v+ n) i4 x5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
' a9 V4 f2 s' @0 I3 T% G/ ]% A m( _
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
5 L& n0 `2 H, T7 k! _. Q& ?" V- U
1 K' Y! F7 [7 P/ ~3 _; l7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。4 j, j7 |# ~, r3 k/ B
/ x$ U' ~/ N1 _3 f8 F8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
b8 ?3 E h, O. b: T' }/ P. n8 y" w9 q5 J% o
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。) h9 V& y( ?! c$ e
; v: M+ Q0 B- x) J* j10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。9 ]1 h; b4 ^3 G7 @0 N9 K" W7 v$ Q
/ I5 ^* R& {+ ~5 D11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。. i4 H' v+ F8 [
2 H C5 I, c! V8 }
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
- F, Y" ~ a/ q, D7 L4 E1 u% s1 G- h. R3 a; q$ s
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
) A9 m6 V! S. P/ X, J' m/ k: @
- G( c S' x# C14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
2 f8 N8 J9 I! S0 U: G6 L- k
6 k$ l4 B0 K1 [15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|