  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
% v+ `# a& R3 @( y, O! `还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
1 v/ H. |4 F) @+ M用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
) Q2 ]; T+ y) |. ]( G& l6 o: ]- B% Y" j. o) B
$ V# Z( v9 [2 q$ |问题5 R# J5 G1 j, t
5 W, P: I, F% c: N1.以下哪个不是合法的电子邮件地址? F% x' N+ ^) s9 \- W
7 n' `* N9 c7 k+ Z( t1 x
A.john@89w.org2 a2 E: m. i! F' ~! N' l
B."John Coggeshall" <someone@89w.org>
- Z, D* p7 m; h) \, nC.joe @ 89w.org3 W# F2 X3 J J4 Q5 W+ @$ i
D.jean-cóggeshall@89w.org C( M' } N2 E- k0 w5 Z% Q
E.john2 r& B2 ]8 F; x, H5 o: D- A" ]+ ?
1 q' ^1 [. e1 z( b0 p o( e# ~2 M, a6 \" S. H0 K
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)+ Y( ?8 p5 T- u/ S: K* V
9 O$ {9 B* `3 R, [A.Windows/Novell不需要第三方软件的支持就能实现该功能
- ^# C+ M2 H0 n4 ?B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
! l; A6 ]2 \5 a: G. y$ z$ \C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送) m7 Z0 _! t0 t. |7 z$ e7 Y
D.有可能完全相同,这取决于sendmail_path的配置, {% Q3 {6 ~* |0 t
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口% O8 U, c5 a" {$ F
) O- x) C, n5 L1 w( e
- `/ U* k% \/ g2 \+ g. r8 Q8 C: z
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?8 g1 \- Y6 K) J" D6 Z& q" h
" ?0 ^5 \4 y+ S/ h4 m p- y1 h
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数3 t( Y( O' K, ~& S; n
B.用PHP代码,通过SMTP直接与MTA连接。
2 c& J L% F( P5 w3 L" pC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
. I+ _# e% D4 nD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
( x: }/ }$ ]/ w ]0 n+ cE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾1 w: i y3 U/ h- r' y
5 X# t1 V0 A- z2 p% e$ f# J6 y R1 a+ P9 q2 n# U% \
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
- w' l. y8 [2 G: y; r. M7 _2 G7 _- g8 C" f
答案:____________
4 W, [3 \; g' T
$ ^, J! W4 v" i( \6 @1 E
0 p5 t: A7 P6 P" H5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)7 P" m0 N8 A$ y2 l: {
4 W4 q2 S$ V# FA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示* F. l5 J$ x& X; x* S$ W5 l
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片4 A% d( m% D6 Z& z/ n
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID. B7 y1 E( Q3 I N
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名# o" D# s+ X8 R) e! _$ s5 G- f: x
E.只有一个答案正确
( X' y2 U* `: _! m) g/ T) d5 R6 g+ s! x% u2 Y4 x0 w
7 y/ d; o$ [) C1 ]$ Z5 W6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?9 y3 v0 q& g) f2 @9 |6 s
$ U$ w$ M M% ~7 S! [
A.从UNIX或Windows/Novell发送邮件时都会用到
: o" V, E2 C, p2 t# LB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时5 c: p' A. ~" k) [6 C% [0 n
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
# D6 t2 ^9 q, ND.PHP里用不到这个参数2 m/ _$ S$ r; U! ^+ N$ z0 @
; t* }5 b+ Y d
+ j' O3 s X( n# P8 K8 _4 h7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?' H" S6 ?% S6 b( U2 P% C
4 t$ F& s$ D1 e0 l! iA.只有在发送非普通文本(ASCII)数据时% j) ?, r: g1 V, J4 B4 {
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
9 X; X! m" x+ oC.任何时候都可以用它来指出MIME的编码类型
$ I, t8 A. i( R& PD.只能用来指定特殊的编码格式(例如base64)
* e1 ?/ ^& V5 I# tE.以上都不对; V" F: [ q2 G$ P' i1 M, R
3 B$ @, R" k' I% A1 k, z8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
- E9 A6 S: U" A; k/ w$ [) `
^# }( d0 B1 K# y- @, U6 gA.分隔符至少要8个字符0 u: r9 K8 \3 k: R
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
: o7 @- _& |7 Q5 [" CC.分隔符在MIME邮件中必须是独一无二的
( A% X* |7 {7 Q5 L6 \$ Z( VD.分隔符不能嵌套的其他分隔符中3 G, V L$ g( `! Y
E.用什么做分隔符都无所谓7 ^, s4 w: P5 ^1 c$ M9 |. A! K
6 g# `9 [ C& @
9 P9 U0 h1 Z, _
9.考虑如下E-Mail:$ c+ M# E7 j. |( l, V. T( X
% }. N4 k2 B, `3 P4 y: |
From: John Coggeshall <john@php.net>0 `* }( L. B6 p: h- k
To: Joe User <joe@example.comt>
1 V7 ?' d$ d; a# P; S' b0 `Subject: Hello from John!- L5 B: M6 ~0 {
Date: Wed, 20 Dec 2004 20:18:47 -0400
/ V% U% b& R- Y7 Y% GMessage-ID: <1234@local.machine.example>
9 F( M7 \+ V0 @# x4 v) J7 sHello, How are you?3 n ]3 y' M# f [! e+ ?7 r$ `
) p0 T( W; G( t5 x在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)% M0 o7 K/ F. O, j6 j, k" p8 v
/ t! D2 Z2 ~3 c& w) zA.MIME-Version C' E. e3 V8 G; [. o0 |; p
B.Content-Disposition
1 X N& {0 |; d' N% c& LC.Content-Type/ l& d( Y9 }& c' i
D.Content-Transfer-Encoding* z. Q' w* U( |+ O3 Y9 P
E.Content-ID& w' Q, p8 h) t- S1 M# k
! W2 r8 U1 p/ H; R+ D, ]& V' B. H3 w
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?8 v7 p$ s9 U1 Y4 ^
5 v- @% S4 @% f1 lA.multipart/mixed5 M1 M7 n: z/ @# g% e5 @
B.multipart/alternative
: D- f! Y* p/ x4 r; X( UC.multipart/default" \' j; S4 V2 V6 u$ ]' @: x8 P3 B
D.multipart/related6 h* a; n" P _, O
E.不可能用content-type实现
) Y: T' B. o0 _8 G
6 Y& a' k [1 v8 P0 |/ i' m4 H9 W [3 _+ W: V0 w" v
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
7 i6 l! J$ l& @7 O* k, X! k" \/ Y5 c$ }
4 ?4 c8 H1 W+ V% `% ~0 nA.安装sendmail服务器
8 ^& m& M: A' s# X. y- U5 DB.安装Microsoft Exchange7 _* p. [/ u( r6 v4 x' Y+ W& [
C.在你的电脑上安装任何一种邮件服务器1 t' V6 u3 ]1 R; R
D.改变php.ini的设置5 T, d) q. c, _- u2 D* [' }4 t# e
E.写一个连接公共电子邮件服务器的脚本' X- W5 c9 N0 }2 i7 x9 M
" f4 `8 ]8 ~+ D
) R8 ], [% X1 i
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)) v% Z0 x# o- g4 V& V# q* ~6 @
, @) q( W% I+ B; W/ j1 _A.使用GET方式传值
2 G5 e: h/ C: H w4 MB.用htmlentities()处理电子邮件地址3 G: x. F9 }( I6 m9 O2 p$ _
C.使用POST方式传值
; ?5 }, y; [) Q5 ?8 y vD.用htmlentities()处理邮件正文9 K9 L( l) G/ J& D/ Q3 U' |) S/ ~
E.确保填写邮件地址的文本域不能有换行符
( Z9 H6 s. K; D! I$ p" a! D. j) k0 Z% I4 {; V
9 P- N, g% r& s; [
13.如何将一个数组作为附件发送,并要能在接收后重新组合?) F1 g" Y+ `8 z4 O
8 r( l! U" q4 Z) n4 k/ ~A.用serialize()把它转换成字符串,再用htmlentities()处理一下. ]$ ]; Z: ^' ]: @: D1 F0 r( V* n
B.把它存在文件中,并用base64_encode()进行编码
) K, f. B$ h, Y' hC.用serialize()把它转换成数组1 p1 Y( q4 u$ g( k' o! S
D.用serialize()把它转换成数组,再用base64_encode()进行编码
0 L' j5 B% ]9 w( ^4 CE.把它存在文件中,再用convert_uuencode()进行编码
7 I7 i5 e$ [1 S+ Z1 C- h
8 h- \0 R6 t. I, K$ a" q
' g! j' w- V, _+ W c14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?$ a2 ^/ V. x1 ~
# g; g0 ^7 p6 {6 R
A.堆一个检测脚本出来
: t6 _/ X% s* p/ ?# ?8 X8 a" pB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
1 t/ n! P* d r- H% zC.写一个识别文件MIME类型与内容是否相符的函数
5 g" [% G1 Q$ o, b+ ]. vD.使用mime_content_type函数, T8 y s1 l3 U$ x' T
E.把文件上传到外部服务器上
. p3 L7 w* u! |9 R# Z/ }4 P8 l0 O* W% {9 ^2 y
: e+ L/ d5 @. ?7 `15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
+ q% q z C4 r8 a1 p( x% x6 u( S# u8 f& q% J" b
A.添加一个From头信息* ?2 @ r5 Z, u/ \1 R x: h
B.使用-f参数
1 }# W1 z9 {) X- `$ PC.添加一个Reply-to的头信息
4 W5 q3 t1 i1 D8 C6 u) Y- c8 n3 p' xD.确保运行Apache的用户有修改sendmail设置的权利, v0 I# x5 {/ g. P
E.确保Apache在root用户下运行; b6 M5 ?* q3 H" k. `6 s( ]8 a
答案速查" T* S1 X2 w; N7 ^( h6 }; Y+ Y
1:D' s; T! I0 O0 T9 z+ U5 z4 K
2:AD
- c) p& `9 K f* N3:E% }, X( w, I9 a* o: `. ~# [; Y8 M
4:Content-Type:MIME8 x% p1 W' ~0 }/ k0 L
5:BC
+ X; A; Q; V% E4 R4 {, Q+ ~" o( X6:A& i& E9 {6 S( x8 ] o( \0 N
7:C& g, N) I7 E4 c9 I% ]% M
8:BCE8 Q/ @2 c( P' B" x: q2 m! N" p
9:ACD
x c+ v7 c: \10:B# i- i- u& S H% U" k: ^0 C0 B2 b
11:D
3 u# j" p* P3 c6 }6 f5 B! ?12:CE+ l" ^7 ~2 M3 {
13:D
# v7 B0 m" r" m. J14:D* [8 i$ u" ~' Q2 G5 s C
15:ABD4 q1 q M% H$ P6 F4 d8 k" C
/ A. A7 S9 p* Z: `; [
- s" D8 I7 Q3 T" X0 d* j2 k1 o& b% H3 v2 w* Y
答案详解
2 ]. D" }; {( L
% i( U3 L1 n9 O1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
8 M4 T! Y1 G7 L, i$ x! ^
y4 o$ Z. L: C2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
3 f1 q2 N3 z7 V5 y9 k( i# [. a2 P7 n* }$ B, {- o
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
; u1 D: Q2 b4 X
* Y# |4 w# D: A' y" @5 {4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。) N8 v# v7 c) r. e! O7 R4 Q( ~0 k
: t% j ?* N/ F2 m; Q+ I
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
' `- l9 A& e$ O% U3 S
6 ^% q/ @. O2 e% ?% Z7 @/ c* Q: g6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
8 n6 j, ]7 }5 n- _* M0 ]3 b7 r w0 `5 t# \/ R/ g! b
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。' K% J6 I. h+ N9 t# \, S
/ k( K4 G& @! Y4 c5 q
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
. F5 V% z/ M" S+ k: w7 S2 k1 |1 d4 n; F. T7 G, ]; C V7 j; J: G
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
5 i$ B0 n: {4 d/ L4 t& n. ~1 P K8 t. k
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。7 M1 s' N8 t/ h' h5 u+ G
' ~/ F; D7 |8 m" g; d/ |11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
2 u) Y W8 a& @, F1 w. ?6 X2 M3 z7 S, B4 a: }/ _" R j
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。* X5 B6 S7 Q" w% W. U
2 U" w$ a7 w3 F; `, F* J; L4 \
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
% {% C/ e! n2 ?; T8 S) g6 I3 T' {" U& F7 Y8 d- L: z4 u) s
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。: `+ v1 i7 e% z& p- D
+ C4 y) B% O" C% A$ [15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|