  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。7 V `! x/ }7 |9 Z
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。, |' I# L5 L7 e# a% i4 @
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
/ E. U7 I# i) O( a9 b
. k9 ?% J2 y v x9 j" n! P$ V2 N! ], t! W2 Q+ m9 l9 H
问题
% i# o3 R1 z# B7 o" ?4 J+ V8 ?" o* Y3 L3 y% d
1.以下哪个不是合法的电子邮件地址?
: r/ {4 X$ K7 Y# k- u3 ?: F% ^* j: |( @! k
A.john@89w.org
1 g, Z, Y1 {/ A( U0 @B."John Coggeshall" <someone@89w.org>5 A2 |3 e4 D2 y4 g, {
C.joe @ 89w.org* W0 s- T$ i/ S; @/ G3 L
D.jean-cóggeshall@89w.org7 `% y3 }% d l: q; z+ H: h
E.john* R% `# F+ M% P$ e
6 z4 V1 V7 T3 |; E9 l* v
% u. B q! C3 X# A2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)& ]8 L& }1 b( q5 |" W. b: J
/ e8 N3 M0 g$ ?# G0 Q
A.Windows/Novell不需要第三方软件的支持就能实现该功能
- I) \3 J1 y3 }B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。+ ~5 ] l" ~' R0 T+ ]: A
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送/ e$ f. F$ k, s2 b, m
D.有可能完全相同,这取决于sendmail_path的配置, M( k& h% F$ D( `# M( p+ H
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口% i* h5 d# H+ z- l' U# B
7 G7 @ f6 Z6 ^1 n# `* t) e) F% l* Y
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?" b3 k/ G2 Z$ X/ @0 Z/ m9 {, T5 t" s
0 W# V* D) p5 w" S( o* ^. N
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
. O; S2 a; Y7 s f- \" FB.用PHP代码,通过SMTP直接与MTA连接。
4 d' A- n/ g" x+ a' y" ]) gC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。, I/ F2 p: V$ z s
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。) e- [! S0 D- e ]
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
% s: H( V" T0 f" ~2 F; u
. ~( ^/ x( N+ |2 @- d1 g$ u' M
3 v! p7 f7 [, B( Q6 ~. [4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?( J( p& |0 Y( a: I/ N9 w
! U, [2 y0 d, _% d0 v7 V答案:____________' z8 W. L- T5 K* \3 z
1 C6 l0 A# m* X0 Q2 _ Y+ o
4 l# K7 {# ~, e$ B7 P8 Y* {& k- [
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
$ R2 V0 K) V2 E+ K/ v4 T
; Q: y A. H( E! ?; A& IA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示# M" I( `& R4 R( I/ |
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片, O0 w3 u6 S9 {- g' E+ ]5 `4 J
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
6 Q5 i3 s; v2 \. \8 GD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
7 q3 h4 p( g, _( k" R5 H$ h" XE.只有一个答案正确1 o+ D/ V! z7 ]
7 M$ Y9 D) |# t0 O& g7 _
" b" O* @; f1 E& X0 Y+ B5 p5 F( }6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
* E; m- H1 u" v& Q G3 _8 \
$ ?5 _3 ?' Y6 a3 k& p! p% v: eA.从UNIX或Windows/Novell发送邮件时都会用到
3 r/ _6 l; I j. MB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
6 B1 I8 H; ? _. G) `5 FC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时. o5 k- V8 U2 w" e, x
D.PHP里用不到这个参数
% p' H+ T7 M/ W4 {/ z8 P! K& u
1 i0 q/ O: G$ R- O3 C3 }9 J0 \0 H- h8 L. {! e
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
% M, [, e7 g! d$ b5 ]- c
\2 U: j7 l! V6 F6 l- I- _A.只有在发送非普通文本(ASCII)数据时
% [6 j) q( B: M3 Z- A% _B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)6 a3 p; a! H/ x% ~" x
C.任何时候都可以用它来指出MIME的编码类型5 Q* D& ~+ f9 F: L
D.只能用来指定特殊的编码格式(例如base64)
2 `; e; |" W: H0 x3 l( ^E.以上都不对$ I- A/ a( I) V- N. X+ ]* z5 n+ {
' R% |# p G1 C: [7 s) Q% q8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)4 J6 Y* q3 ^* U! A; K& i
% H9 O3 F. J4 w- O) j8 }
A.分隔符至少要8个字符3 e9 F. D) v5 M
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
6 n( D, V, Z4 V- w8 ]3 aC.分隔符在MIME邮件中必须是独一无二的
4 ?* {3 p" l OD.分隔符不能嵌套的其他分隔符中
, _ R8 A1 [4 z9 H4 nE.用什么做分隔符都无所谓8 x# j L( Z# N! b0 n
+ A+ e5 I6 _) c4 G m
" v9 _# E* Y3 @4 A9.考虑如下E-Mail:
- V1 i2 s) o+ J& j* V6 C/ ?# e& h( S- R5 x
From: John Coggeshall <john@php.net>: \( ^5 T8 q; Z+ }) D/ E5 g
To: Joe User <joe@example.comt>
/ D3 [; X" `3 S0 T. E6 u+ RSubject: Hello from John!
4 W7 E8 |# y: P' ^Date: Wed, 20 Dec 2004 20:18:47 -0400, R2 {5 ?) h8 |! Y! p9 \
Message-ID: <1234@local.machine.example>0 Y9 F& u. q+ q5 m# G/ {, F
Hello, How are you?; B5 \' t4 }8 i
" n" y2 {- M! X5 }* v! a在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
' N; k' ^2 e) {- g0 t8 A4 O" T j/ ^9 x
A.MIME-Version
6 F, c- Z. t! l# Z; DB.Content-Disposition
* U1 D9 g! W+ X3 ~( ]1 UC.Content-Type
& {! t; j% A5 {* Y/ ~3 H5 MD.Content-Transfer-Encoding5 a3 Q& U& }; p
E.Content-ID+ ^" Z3 h5 y: S3 G
# ^ V: u5 ~. U- c
! e3 t; O# w& T; L3 m! ^7 q; a7 X
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
8 e9 ?+ k1 n- l; P# `# L4 z2 }
) j: p# S, Y, |( Y. V; PA.multipart/mixed! J& N# C0 P( a0 K0 p
B.multipart/alternative
i, o% i) k( m' W6 {6 e4 o1 dC.multipart/default+ k. ^: ?% @2 G! K. X
D.multipart/related
6 a7 a$ D' B9 T. ^! DE.不可能用content-type实现
% i/ f3 ~3 _3 z+ d5 d3 H
: c7 X$ _9 B5 N5 q" H
2 \6 y) ~7 C, K1 Z+ u11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?- t% T" L* I' m
; p! Z: `- |+ t6 w+ ?6 m
A.安装sendmail服务器
9 t E4 f( T/ g) G9 J( m9 u1 H, `B.安装Microsoft Exchange
3 s1 ~- J$ T |C.在你的电脑上安装任何一种邮件服务器
- D5 U" e1 y, c3 s4 d/ C5 LD.改变php.ini的设置
' N) T& B$ }8 l( u( uE.写一个连接公共电子邮件服务器的脚本! {# p: ?/ R D8 C9 z
- T8 U! \6 k( A
+ B) t: n' m+ `! f- v) m+ g0 y
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)* N8 M6 }) E8 q' `0 Y
. o; h9 K5 \; ]6 _ TA.使用GET方式传值' X8 a. S T6 l7 K
B.用htmlentities()处理电子邮件地址
$ Q' B7 w+ t. cC.使用POST方式传值 ^0 } F' \3 G N- x, M
D.用htmlentities()处理邮件正文% B+ [3 J1 G a+ d3 X
E.确保填写邮件地址的文本域不能有换行符
% {3 U* @0 f! H4 {& x+ P5 D% T3 [7 F) x( i/ a2 s- J8 _! ?8 `
) E l; @3 x! _6 S13.如何将一个数组作为附件发送,并要能在接收后重新组合?4 W8 h' S% V7 e) N8 s/ S
, }. y7 P% j6 v2 h1 wA.用serialize()把它转换成字符串,再用htmlentities()处理一下6 F+ l- w8 X. U
B.把它存在文件中,并用base64_encode()进行编码
; L8 q# ?$ W$ O% x q" HC.用serialize()把它转换成数组
0 s- p% M5 q0 {D.用serialize()把它转换成数组,再用base64_encode()进行编码3 @! n/ [* U2 g/ o) B: v3 W
E.把它存在文件中,再用convert_uuencode()进行编码
/ x; d2 W) y/ g! E5 A+ v7 Q- w) g' t/ {. |
( B" ?4 h; Q) N
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?0 y6 N& ^. e. u
2 E: m+ N8 ^9 k N6 d; h
A.堆一个检测脚本出来
% q4 d) M7 O9 WB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型9 ~" G) \9 U& ^/ T& G7 D
C.写一个识别文件MIME类型与内容是否相符的函数
; O) p, }- l: X! a3 c6 |. F9 [% c' DD.使用mime_content_type函数
/ S+ w3 k0 y; E+ Q2 @/ iE.把文件上传到外部服务器上- `' r$ y4 [ B# H/ N5 n6 `! Z
! ^& R; Y+ |: {8 t8 y4 u4 \
1 S, y d" U( F. m7 G2 ]15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)- P. O# r; M, l$ w3 \
$ I* W6 }. C9 ?0 D0 h8 O, Y
A.添加一个From头信息
1 ?/ D2 f) T% L A4 B' r! kB.使用-f参数
' z' Z7 s' v$ G; J0 `+ Q. hC.添加一个Reply-to的头信息
2 m8 y# {: C! `+ k% sD.确保运行Apache的用户有修改sendmail设置的权利
; v6 W) o3 `4 b* JE.确保Apache在root用户下运行
: g0 H4 I* D2 |, A答案速查+ A' |1 q$ h; f, Z. Q/ p0 c
1:D
0 m2 S1 t% L7 ]$ L9 E3 y7 i" w. d2:AD
& ?2 P7 g0 x, x8 c$ x, O, G3:E
1 n* a( e& t3 B0 ~( n6 i4:Content-Type:MIME V1 A F' _! P& t5 N7 O3 K p& Q
5:BC+ o4 K7 C$ o2 A3 x j- U- Q
6:A
, V$ n; x# }0 A0 J4 z7:C
# g$ n/ I0 y, J' o, ^- l. s8:BCE
]' X; m V& ^9 k) ]6 @9:ACD/ X7 z4 ]/ d# {# }0 U k9 K% |/ B
10:B
8 b% d$ t! J. K! i' D n11:D) t l: G1 y2 y2 p; g" w: O/ R
12:CE2 c( s1 R4 I+ C4 F! a6 t( ^
13:D) X, O( Q; ^# ^0 F+ g$ T t6 W
14:D( ~4 j& D) @" F9 u) L1 U
15:ABD% f) _; [5 [) V9 B! M
2 O) Z$ J9 R" ]7 F
5 y! M5 p3 |& b. u! r" c5 V
* K1 V6 f; I% _% @8 v0 ~9 ^9 n答案详解$ g# w" M; R, b0 e: n; x. Q
9 g* f& x0 y d' b [/ d! G! N1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
3 X3 I& v1 V5 X8 y2 L6 i, ?; j
* r Y1 s! Z7 o6 @! c6 u4 c2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
0 w! o( r6 a% f8 n
# j& K) F* L2 W. j5 e0 j& \! `/ i" Q3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。+ n4 W6 L- M% m+ i. b9 P0 L
* R h# ^) a; N5 a) j/ |0 V, U9 \4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。3 }& N" s9 u7 l/ E& `, j) [2 z
2 o1 C) _' P9 W( O
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
# }# F7 Y f: ~# ^9 g1 \8 J' h$ d6 ^) ]
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。$ s2 o0 H$ P5 n6 w
1 E4 L" ^! E7 \( L8 W
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。: [% h+ z1 b# D+ }* G) p q) o
# X$ c& D F/ Z0 b h8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。7 X' k+ f3 f1 ]2 G0 `9 U
( ]7 C8 h2 H1 X" _9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。! P. K1 L8 N, m% ~# {. i3 Z
5 c. |& y; z9 v z, }# y4 E
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。% M5 e' Z# }1 d* y- H( t
* U0 S+ Y) P8 m: p
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。' I7 U* V4 P2 |; c5 \. r
0 N" V! R7 v# g* a2 ^12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。7 z# I) c* ^/ E1 \& J. ~( S, p
' k( @ q: P: P9 D( H" Z+ j13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。2 a7 |; V Z( e6 e. S% R( ]9 x; m
: B# o9 ^& k( I& ]
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
+ T6 t2 {, h0 w
7 y4 J$ n! W; i' o9 _4 z15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|