  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。' z. s2 R1 Y+ J% K' C9 W
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
* o8 \: D4 z3 z) z' e# S$ F; N用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。0 K$ W4 u- h6 j; U2 V
$ ^) U& R7 Q( Y& G$ S
9 e7 ?6 C" U# H6 G# _9 B问题
3 ^) z: o ^: r
( h) y0 s) g* J& X: Z1.以下哪个不是合法的电子邮件地址?/ b9 S" I" m+ d% M7 K5 R' O
: [0 ^" e0 N# @- _5 M7 Q+ J' {8 _* F% ?3 e
A.john@89w.org
: z( {4 E( B9 D6 [- KB."John Coggeshall" <someone@89w.org>4 N# L3 R ]5 O
C.joe @ 89w.org
# n9 N1 }, |2 W z( bD.jean-cóggeshall@89w.org8 E+ i& x f% X: C% l* U: I
E.john
$ z, [% {2 J# C8 I: u! U/ `8 K& m/ Z# Z
' Y( F. h8 N# M7 |5 u
3 M# E( L' ^ B& J- d' \4 G2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
3 E; [- Y" c* C2 A: S) t9 L0 y6 X/ N1 H! W- n& @- ~
A.Windows/Novell不需要第三方软件的支持就能实现该功能
" }, K" F- w7 U# LB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。 e3 z- R9 n2 U; G
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送* D a' {0 i2 F8 C( U7 E5 D
D.有可能完全相同,这取决于sendmail_path的配置
$ R6 x/ L) X, v8 a( P2 B0 wE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口" k; q9 c+ _+ d l9 I2 ]
) L& `& F& D; T9 O, \
O' S; ?! B- r) W
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?* B e" j: I" g; z% O8 w
4 t$ ]: ?* T# S/ j7 X* X6 G) ?A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数+ V5 X9 }, `! g* e( e
B.用PHP代码,通过SMTP直接与MTA连接。
' s9 i, C* c8 q9 x7 xC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。! u+ ~# J' M3 ~5 _& J G9 t; Q
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
' r( l! K+ l0 j0 v8 bE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾 w! R7 f5 M; d! I$ p% ^- B- ]7 M
7 A) e1 G$ o0 y2 B$ {4 n8 ^
' C+ U: W ^, [- C
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
( V$ D5 }- F! A4 p( G
8 z! t; J8 ]$ y7 s# S答案:____________, E6 c5 E d. V8 O
) A" {2 O6 J: L9 o1 c( G$ n4 c8 v4 Z0 {( i
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
: p: ^2 Y" h" V' M3 i# g4 r5 H3 W' o) p5 T$ g! | W
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
2 m" a) [3 Z. m+ n$ rB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
" Y9 ]1 M1 t# T4 nC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID# c0 }0 Y# s$ j! i3 H" ~
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
! g P- p2 I0 h% h, v% x5 ?E.只有一个答案正确
; F7 G3 }- W4 [5 V& g& U1 A9 Q) `6 C9 s) l4 }! T8 x J
* |' H$ t; r$ L7 P/ x+ r2 i& I
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?' M4 I1 ~6 h- A3 [6 z; u$ |
6 E3 z) h, L2 r5 }5 z/ `
A.从UNIX或Windows/Novell发送邮件时都会用到' V' ~ z- ?) V* j1 i% `& B
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
) N) J* ~6 D7 t9 x' r& b6 c+ `2 U; C; MC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时" m5 C, I: x: y' s
D.PHP里用不到这个参数5 I* `; a& f( g7 J1 U7 e/ Z
7 v$ d% K2 W0 y! U. m: w; S& n* ?3 t* f0 d. K9 E9 U
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
$ z4 d- D2 A' w7 i, @9 ~$ _2 [: c5 f# C6 R- l+ J- d: O7 M0 j
A.只有在发送非普通文本(ASCII)数据时) K" G# v( l, W1 U+ ?7 ^3 Q p
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
* o+ V1 [1 s L1 p( i/ j1 s# LC.任何时候都可以用它来指出MIME的编码类型( Q9 Y& D- { t8 Q
D.只能用来指定特殊的编码格式(例如base64)3 \! ?4 y+ z4 Y( O9 Z4 I
E.以上都不对' i0 S/ T. M1 o! |
3 T& V7 Z8 b4 q8 E. C8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)4 P" L( Q2 j% X$ L: S( j
& ~5 J- n& U I, b5 j5 w7 M
A.分隔符至少要8个字符
; M! W* ^+ k& Z: }' a+ GB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)5 ~- V4 ?; e, e) F: z
C.分隔符在MIME邮件中必须是独一无二的: A4 h- m8 q6 d& T: J% F
D.分隔符不能嵌套的其他分隔符中# @8 t3 x% b! y" c! X P' ^ n
E.用什么做分隔符都无所谓$ g) s# W1 w: e* @
3 N! D) h& E8 O3 v- Y
! L: f Z8 s9 g* e5 v( p |9.考虑如下E-Mail:$ a: d5 ~7 D6 j; o: b5 x
- O1 u% z2 i: q8 z! h1 o0 uFrom: John Coggeshall <john@php.net>
( {/ O% o. k! m6 s( m- V+ mTo: Joe User <joe@example.comt>
: V' r7 x; X! ]2 ~/ A7 Y2 i4 r9 fSubject: Hello from John!
8 u! w& \4 W( x2 SDate: Wed, 20 Dec 2004 20:18:47 -0400% L$ a2 q9 Y1 y9 t* ^
Message-ID: <1234@local.machine.example>( ?5 @+ \ \% A' ~: q7 ~/ D- H1 C
Hello, How are you?# Y# w! D# W* j3 F) h
( b9 Y/ a; I! l在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
9 j5 e4 B w, a) z8 b: W1 H$ p! i Q! q% _8 E
A.MIME-Version1 J7 X, W/ B. \" X+ H* {
B.Content-Disposition
8 C9 Q7 ^$ g) z3 K5 wC.Content-Type3 w0 L' o' K4 d u
D.Content-Transfer-Encoding
4 L$ S: Y3 I* Y+ p% P& c. z- eE.Content-ID" y: i) P+ C2 ^7 \$ H
# T# [/ [' c# x* j' B; h0 i' G2 z! `4 u1 b6 Q1 R( P1 ?. s
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
* {* I( d1 U- }: T$ I; Q+ y6 G0 ]; m# L5 X/ N0 N8 m
A.multipart/mixed
& L4 z; q6 e$ @5 fB.multipart/alternative, C+ @( Z- ]! C. t# Z S: C
C.multipart/default
3 d8 T; T1 S/ h/ [D.multipart/related$ O. v, R9 f' s$ l
E.不可能用content-type实现
$ q1 J" e7 F' M: h# c, q1 z& C$ e8 o/ m: W# b9 F& T# ]
) a7 }0 I* O9 }8 |11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
! ?- _( a, u) Y O, c
0 U! I/ v E8 o3 \2 a+ MA.安装sendmail服务器9 W. |! k9 [, E: p
B.安装Microsoft Exchange7 U: A4 n' l. R4 F, q1 ?# b* |
C.在你的电脑上安装任何一种邮件服务器
J, h5 n: s" _' S2 Y8 ZD.改变php.ini的设置3 T/ V6 r2 j( j" {. c- P8 \
E.写一个连接公共电子邮件服务器的脚本$ M/ U; M. r( W8 L/ {
. e; ?+ ^$ q7 I- ~& D& X6 i
) v/ Z2 A: f+ m' m, E+ D12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
$ i/ ?' k% d1 c' ~& {# a, P) T$ [' H
A.使用GET方式传值
% x8 T1 G7 \- q, a& S, O" t% YB.用htmlentities()处理电子邮件地址( A/ I; T. O9 v& e: }
C.使用POST方式传值& Q' q! M/ Q) s* z, R* Y
D.用htmlentities()处理邮件正文
M( J4 S; o9 ]: q% o4 q2 z( pE.确保填写邮件地址的文本域不能有换行符3 U% ^5 l% j n4 m. p
% Q. S; D7 p2 `" m) j4 i% c
7 D/ h- F z$ @: A: M13.如何将一个数组作为附件发送,并要能在接收后重新组合?* J+ q! Y6 j% E6 I4 k4 L) G
6 Q5 P# j7 w/ P# k# \. j- W, \) \A.用serialize()把它转换成字符串,再用htmlentities()处理一下
9 ^% Y8 Q$ p5 t4 G! ?( q# r( D( PB.把它存在文件中,并用base64_encode()进行编码
( ]- A- N* v1 g' d% t) sC.用serialize()把它转换成数组
3 I# S3 } |. Y( Z$ x/ ZD.用serialize()把它转换成数组,再用base64_encode()进行编码
# X; T! K: ^; ~/ Q" E* XE.把它存在文件中,再用convert_uuencode()进行编码
7 U& C4 l a" h+ m1 G C- D( `# Z5 v, z* \ b5 f$ H
% v7 v* V% L+ ^0 t, a14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?, c/ N4 K3 C& y6 A6 p; Z
$ j ]+ l3 I+ K3 DA.堆一个检测脚本出来 l- b+ P; i/ R! t4 {% u( A/ u
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
( z) H) F8 S6 s6 _C.写一个识别文件MIME类型与内容是否相符的函数* s& {# a; o* P. {. a! e
D.使用mime_content_type函数
8 m$ e5 o0 |# z$ f% EE.把文件上传到外部服务器上8 H3 G, i2 F7 y2 p
3 y) c E$ H+ [, W) G
& u, R$ T( |- a/ F3 ?
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)9 U% @/ Z+ t0 R& p a1 C
1 C( y$ P4 s7 `
A.添加一个From头信息1 {# ~2 [; {0 d" ~- A# t& b) o
B.使用-f参数& M# n$ d7 @6 J4 c4 S
C.添加一个Reply-to的头信息$ B: x7 {9 T+ i: V' m
D.确保运行Apache的用户有修改sendmail设置的权利
- g- X' O l0 r1 J2 |E.确保Apache在root用户下运行 N u) M9 ?1 W2 y' g. m# }
答案速查 h, |- U6 G' p9 H
1:D- E' S$ k' h9 a0 s' Q
2:AD
7 d4 F. Z- s7 `9 G" J5 g+ C1 `3:E
: A: w. Y5 A" i7 Y( T4:Content-Type:MIME
. R, {+ Y5 @ I( g& V) Y5:BC
! k" Y) w6 ]! q- k, L4 g$ q+ J6:A
- z4 a. E- l" X# `0 Z# ?7:C9 V4 K* U% y# X
8:BCE
K8 m e. P" y+ k j" ?9 b1 F( M9:ACD
& V5 ^% j0 k3 A7 |% B( b1 O% l9 ^10:B
! N. J& M3 x4 \* M11:D
5 ~* a1 w! ~: h12:CE
' n6 I# u( B: D- W; a9 ~13:D
! U9 c. E, o& N _9 u; y* Y14:D
( d- _- Q$ ~7 n: N/ a9 E15:ABD$ v9 v8 a: `+ p# m" h1 m3 |
! \5 q- N9 ] w$ U+ E; _
+ h/ H3 i! e4 Y# C0 p, ^- I/ q4 e5 ]6 \
答案详解4 G* y9 X- |9 [! x1 V5 k8 O$ g& P$ W: M
2 f7 L4 A5 H) i% f1 @8 E1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
& ~$ k) Q/ q% |8 C0 Q! c
! P- W2 G- S( z2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
% @6 M6 I/ i# T. p1 j
3 X- O6 |! D. e; O% j3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。' w+ E* p& O; _& N& M1 W
/ F/ m. {# Z2 I4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
# O" C3 m' w/ c2 S, ]: ?7 R6 L7 ]+ x# d. d s8 H. A0 V) f" m( f
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 I) y/ E5 D0 p% I7 o5 n+ M' w$ m+ ~- ~ G( O' ]3 M3 g" V
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。( G6 F( t( m2 H5 y! k
0 p8 Q# z+ m3 {( l9 w4 |2 k4 O
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
: g- [4 W6 u5 k6 f! ^
: v; r: q/ e! k# n8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ G0 C+ c- t% T1 R9 r7 d, a$ X8 E+ D- G6 J/ [. L3 r5 x# | r6 ], X
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。! T3 {+ [: ]3 f9 ]9 Q/ Q' g
& M! a: O! n# o4 R
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。! S1 P6 n% p( ~ S1 u+ b, k
: f+ U2 w6 N1 v11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。& f" _) ^1 {: _2 @, x; f, Y6 L
; d6 K! N/ w3 @! v' Q/ ^, F
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。) h% c+ ~1 K1 Y- D1 \9 A
- E7 o# N( Y* G+ l
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
- E0 v P. c/ H Z3 w6 P2 |4 d0 O4 K X/ ^
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。$ F: O5 |0 I" u' {
1 e I0 b# \4 o0 C$ y15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|