  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
7 w g; _ |5 A B还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
4 u' J+ l* B' f用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
& B6 Z3 v% C1 R G; {
' [8 n8 L# S; N0 N& v2 }% I* ~) D' `0 J# Q- n- F f
问题( H$ f) D* G3 P8 P* z. r
$ W' D5 a1 }7 ?5 U1.以下哪个不是合法的电子邮件地址?+ M' K% w; m4 u8 [9 f
+ V4 d( n8 e$ [% Z$ W
A.john@89w.org) O, _ s" C" S& h5 m2 D% R
B."John Coggeshall" <someone@89w.org>
7 g0 y4 I% d5 u8 r& k$ c. ~7 QC.joe @ 89w.org
% v% n/ g% O1 _3 w, wD.jean-cóggeshall@89w.org: s: \1 T% r$ T, S7 i2 Y" E3 u
E.john# g- a, g0 x! q; [% n) Q
1 u j! G: M/ N6 i0 e" U& [0 O8 Z8 _
+ c& N3 d; T5 T- y* c. C2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
. j, d8 c& ?# z2 s5 R. x5 P) k! w8 ]( I- j4 O- `
A.Windows/Novell不需要第三方软件的支持就能实现该功能
/ a' o! I& x$ b. bB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。, C0 ~6 W5 A( {8 G; h2 I: X$ H
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
' m: h& n) i2 j3 sD.有可能完全相同,这取决于sendmail_path的配置
9 Z( w- H; G$ k) y+ [E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口9 ^! }* p) l6 Z# X8 t( ?& b: |2 u" ~" }
- y! p, j0 Q* ~. f5 t6 x
h8 |# r1 {( U+ F% @! @3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
8 S2 N6 u E( u/ L" |6 r r' C1 x: h2 t5 {
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数! _' F, ?) L. w" Y7 m
B.用PHP代码,通过SMTP直接与MTA连接。
. o( Y- G3 J6 ^6 k+ z. ?C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
, Y( ~6 J z. n* S/ U9 oD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。4 M6 ]7 G/ T9 a3 g' E
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
/ ^6 V. y4 u) F7 c* X! I0 e' ?* j# T1 ] v. S( C# w
) ]: }7 X% d: w; N' i# {$ k3 }
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
9 {* W; n0 e* i+ S4 v
6 R. R$ T! j/ `. w- w! @! n答案:____________
/ R |& _! f$ v" A; p |; j
2 y8 T- }7 K5 x$ ^- [
3 \. r; N5 M3 v" {: Z5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)) V. ~+ f2 m. _' k/ _" O' X, i
/ H1 U9 f# x5 Y1 t) G& HA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
8 q7 L' o& n K4 o K% rB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片" M0 Z9 a4 K4 S# ]% l, a
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
; X( [. H+ D/ g% a, D" x8 QD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名# Z$ Q s6 q3 M4 x7 Z
E.只有一个答案正确
. f3 G. r% D0 Q0 h. z
% U7 t6 v$ m7 l0 q$ e5 i
+ c/ Q) w( Z O8 w% i6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?3 \ M- m# Z: K7 I
- o4 _( Y( J$ i3 x3 y& H6 C! E
A.从UNIX或Windows/Novell发送邮件时都会用到
" b [& |5 ?# F- \8 ZB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时1 _. _( P! n- M( ]% O9 q- v
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
# i6 W# E" Q1 P! y3 U* _) yD.PHP里用不到这个参数2 s: H; ]) K( P. b
c. L O/ H) x$ ^1 D6 E. E% L7 ?- Q$ I+ t0 G" p. V% o- j+ X# i$ x
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
! v6 ]7 e. o6 ]" I' t; X6 ~
6 l" h' E- Z1 I' tA.只有在发送非普通文本(ASCII)数据时
, q$ l0 `0 \7 ?5 `B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)9 Q8 M2 R& x# g: F7 B1 F
C.任何时候都可以用它来指出MIME的编码类型
* a8 ^5 T+ q" T8 x$ y1 V! t) b3 SD.只能用来指定特殊的编码格式(例如base64)2 U9 A ~; d- }8 L* _4 T7 V, W
E.以上都不对! H- h/ a$ a( V- {; B* u# x& U
0 k- ~2 `" @: B- C4 D' x8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
, n* b* v" }! ]- M) n
5 Z( i/ D! h: `& I1 H8 S9 [! q vA.分隔符至少要8个字符
6 H" F7 s( @ I) [ a3 ^5 I: w% K. d/ p4 wB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
. G i! x+ T" i0 b. V$ C% y' q5 f1 qC.分隔符在MIME邮件中必须是独一无二的
! U7 i' H' E/ |! k7 sD.分隔符不能嵌套的其他分隔符中
; A6 t. s' Q- W. l" o$ aE.用什么做分隔符都无所谓
- r2 w) }7 D$ `1 K- i8 c: U, |7 Q* m2 x1 m
1 x4 y. z* x" ~) r. f* a
9.考虑如下E-Mail:& p1 B' g; N) {) ~$ a4 a- b6 i
" J$ ]; n! f4 j" W
From: John Coggeshall <john@php.net> m" ~6 B% A" ~9 M5 l) d: `7 ~& ~
To: Joe User <joe@example.comt>
) }; B/ ^+ c6 v6 h: J) [6 cSubject: Hello from John!5 M0 t# \0 c Q- W2 ]0 n; I/ E
Date: Wed, 20 Dec 2004 20:18:47 -0400
$ Y" ]7 E1 D; Z! r1 \# ~Message-ID: <1234@local.machine.example>
* u3 ?7 g, z- A' m% s. NHello, How are you?
; F+ D. U! D9 t, A% W
6 J0 r# O1 E- L! j* x/ |& }在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)9 l1 A/ r" Q; N$ R2 I
* K! Z& H- u8 q6 t' w
A.MIME-Version
: n( b# x1 E. \B.Content-Disposition
+ h6 f3 y/ x9 Y! b, k* j) lC.Content-Type
: {/ \; a9 a l* {/ _D.Content-Transfer-Encoding
- Q- E. D" t# w- z) c2 f6 o+ k# ^4 [E.Content-ID
X3 y; {' G, N2 _4 I0 T! i( N" p# y! Q& v3 s0 z- d/ F# n- b
1 j9 y! z, d/ d) B1 D" d10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
1 i* n0 `$ B* a, [$ ~& }0 l0 p4 r, o# {& S% L0 Q i
A.multipart/mixed' i: S( L: ?. f
B.multipart/alternative
1 g2 T5 t2 t E4 PC.multipart/default1 @5 U+ W: h* y
D.multipart/related' E+ V+ Z( X U: J( p' \. k
E.不可能用content-type实现
& H7 ~9 m8 x% g5 b* D+ i. Q; i- n" ]$ g7 `
9 [6 Z2 c1 {& d/ o; T' h11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?- }2 n5 l. m4 f, i6 p/ g
5 p; W0 Y! d' KA.安装sendmail服务器: e- K7 T, y) |% w$ n$ I& _
B.安装Microsoft Exchange% a! z q7 `: u( W6 Q0 T* t
C.在你的电脑上安装任何一种邮件服务器
, m R: G7 h. i: B& SD.改变php.ini的设置6 |6 a7 N8 c6 B: i& V% {2 d5 U- v
E.写一个连接公共电子邮件服务器的脚本
/ k5 ?! c" h: l- F, u" C5 F
7 G- N' d& f q5 C( v2 R! O! I) B: K. g: w' X+ g8 L7 a2 Z9 _
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
, H4 d' k$ h. r4 x' s+ ^$ C0 F" t1 l% O* y
A.使用GET方式传值6 m! Y) R- z7 \% ]# ]
B.用htmlentities()处理电子邮件地址. R! h! I: @- |: B
C.使用POST方式传值+ X1 J2 N5 b5 ~. Q& u9 z$ n- v
D.用htmlentities()处理邮件正文
+ ]6 q# V- m3 |4 W; F1 uE.确保填写邮件地址的文本域不能有换行符' e3 F8 _! t" J+ c+ u
: L# s: `0 d; C# {/ T5 h5 A! a, X+ o( A: u* b! h( Q* ~( u
13.如何将一个数组作为附件发送,并要能在接收后重新组合?6 y8 P9 ]& Q# A3 u. h/ G0 K6 V
8 v0 S& o3 X) s% s. f8 }0 p
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
9 O9 S# B0 W7 x+ z( |B.把它存在文件中,并用base64_encode()进行编码
# \9 L( R& K" ?3 zC.用serialize()把它转换成数组1 T# C3 o; l7 N" k; X9 Q
D.用serialize()把它转换成数组,再用base64_encode()进行编码7 n7 D$ u* ^0 A
E.把它存在文件中,再用convert_uuencode()进行编码
( E8 B# C5 F0 s8 g, `
; e! ]: p7 z7 H% N# L2 [ g6 V5 X: Y, J: y/ G/ X0 ~
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?' O& P/ Y5 g4 G5 u% d8 f1 i
# l: m. W( l9 P$ S' sA.堆一个检测脚本出来
9 q* ~- i( T+ I* YB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型, [/ ]1 }+ {9 I$ A( Z
C.写一个识别文件MIME类型与内容是否相符的函数* B9 F$ ] c, T8 i* Z- _. `6 }
D.使用mime_content_type函数8 k3 l" Z w% Q3 v+ t/ @
E.把文件上传到外部服务器上3 n& y- f, l: e/ K# N/ Q/ z) a+ w
: r8 C! C4 w& f0 k# I, e% o) C1 t1 X8 r# H
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
) V G4 f9 Y$ t5 L/ L$ A: S, y3 F0 r0 H
A.添加一个From头信息
5 M: D4 Q7 H" } [B.使用-f参数
\% a6 K. C" p1 C+ }: b3 nC.添加一个Reply-to的头信息
1 q, w1 L7 U6 _. s- Z8 AD.确保运行Apache的用户有修改sendmail设置的权利- ]: Q& v. n$ `+ n' `' v, G
E.确保Apache在root用户下运行
+ B3 h3 A/ I1 u/ N9 J答案速查
- F& _& S; O1 q7 g- Q5 f a* Y! Z1:D
2 H. |4 { J/ f: |; P2:AD I3 Y; e5 i& @' M4 y0 H# w5 }
3:E
' f/ Y H2 M/ M$ Q4:Content-Type:MIME
" O+ l: f& C; V7 n- y+ x5:BC9 x: R" h! j% E& K" S
6:A
, B; P, E @* V4 ^& Y1 C7:C. I p9 X, _, \* T4 [: D* o- w
8:BCE
' X4 X# m) m o9 V* ^4 x, k( r9:ACD
7 [) w9 z# P" d0 o; }5 s10:B
n8 i [$ ^7 V$ [; Z* z' E11:D
9 X. M3 x# G2 W; n, p12:CE% `* v9 d; k* i7 D
13:D
! d: L9 k0 x8 v9 r5 I14:D
* v$ g n, n* y& \15:ABD. q: X/ d% Z- i$ S' O& k# B
7 o8 N ^" j. \: @) |
% s- ^; r4 Q; U) B6 J+ \9 _2 b9 |
2 A; d3 ~( ?: B+ x) v) `# S0 `& j答案详解
O) b d9 X/ N) e' r! x
# I a/ y6 _5 j1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
+ x! v0 K4 L! M" o7 T
5 s9 Z# [/ k8 V" A) O& {% Z2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
) B- [" R: S; `: ~1 s5 m/ j& O: F ?' o: w* u" L+ H# X8 |6 u1 f
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。" W* Q; j- E6 M3 H) h, M
3 Q+ `. V3 ]9 `4 v, Y. O
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。7 u* M$ r+ g* @
( R3 g6 X5 I& Q! W+ G# @
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
# E) t& a$ J* B( s5 s3 R
( I9 J% |, Q) O6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。9 ~9 N: I3 k Z+ w( r$ Y* m
9 U2 o) }# H0 y% j0 U- q I
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
3 U. [4 b1 S! D' m" q1 E8 {, Y8 E1 T) T$ @7 D6 N Z. q
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
, W8 E% r: W+ V d' G- j; B+ L) Z- X* C3 [3 m1 g( W, t% h
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。# t0 A6 P! N3 A5 F" b& @5 z A
/ r- i" A* |% P7 V$ H0 a }$ j' q( y10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。, [, l' H1 s8 s
+ Q& N7 V" Q# x( u) j6 S/ Y11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。% k9 O1 W$ W9 B6 Q
" i; s( `; k! l, N0 O
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
6 f" _! Q; C2 f+ w! {
! B3 p& f( I F9 |8 o7 C13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
4 ?/ k0 s Z: d5 o! Y c
" N8 ]% |% l+ N) e' A4 v14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
3 x7 Q( @& M; ~& ~/ G% T* p' P+ C4 o' [8 i/ m
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|