  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。7 U9 D. M0 V6 v0 X) `1 M# r$ M
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
9 M# {3 c% _% ~5 {用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
# s) S' w3 n! H: L' G- R) r. _' u4 S# q! C% a
3 ` ]- g5 O( z9 N2 ?) t
问题- W X$ Y; h4 R) e$ C. J
8 }8 J) l" F# T: R/ r4 y6 k6 P3 v
1.以下哪个不是合法的电子邮件地址?; g W$ u; M \- i/ Y7 ]
! W& V8 Y4 u4 e$ Q9 M9 t; XA.john@89w.org9 F M1 i: M$ Q E
B."John Coggeshall" <someone@89w.org>
7 @/ ~+ a* D/ c2 u, H$ uC.joe @ 89w.org0 U$ q" v" N% Q
D.jean-cóggeshall@89w.org+ Q; D3 i# r9 i( |; r
E.john
6 h9 W! J( z9 e
6 H( X- B+ w- h! @4 w, s) e
6 _0 Z$ V! b5 s2 i. }2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
# @# U+ o5 q2 [( Z- ]5 j, D2 m7 t5 `, K7 N% [
A.Windows/Novell不需要第三方软件的支持就能实现该功能 F" s3 R6 n7 n" H( s
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。% Y) Q# [3 O* I' {
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送. C! H9 h+ @" p6 j4 g" T, C: `$ P
D.有可能完全相同,这取决于sendmail_path的配置
U" o6 \, ]7 e( P" XE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口$ }4 K0 N( ~: K* |2 M$ \0 O/ X
4 d2 m" q% Z$ q2 R5 j- S
/ [2 [+ T% z/ X( ^1 A3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
! s# q3 a) r+ C% U' L `/ ?" _: C. L" {8 w. P* i
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
- l8 [ H- p/ X# M. FB.用PHP代码,通过SMTP直接与MTA连接。. |& l5 M9 B* I5 b9 k, u# ^) k
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。! @0 V5 e- N% t* | A4 ^% u5 l3 I8 F
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
1 |8 m( E4 ^% ]# K! U1 Q; H5 uE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
9 W' [3 Y/ s/ y7 U
% E. \1 n( {4 J$ ?, {; L E. w
. a+ [; `; h, t, T2 H4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?& ?" n% E# i" _2 y9 E' P# d
% B/ V8 A; K$ c9 L% ]答案:____________- ^% m% U- ]7 H
0 r. w' Z+ Z, w' G+ {
4 S( e" k. u# W% X+ g) c Z- Z5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
1 j/ n+ y% Z7 ^3 G4 y, u- Y2 O' @8 O" m6 B) _# C
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
1 H6 f2 f- i. tB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片 \1 r3 A$ c2 m9 R
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID+ i( f9 c5 |2 `( l+ L2 y9 z
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
8 q. ^) @& X+ ?- N' z! a! GE.只有一个答案正确
. x2 w4 v0 g) s% Q$ ], r2 W2 X4 W/ o0 ~# A: ^8 K) @, O% a
* Z3 e5 t, O5 ^- [, o# v
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
3 N3 ?' g6 ?+ r4 C% ]& T' l+ M) v3 b: x
A.从UNIX或Windows/Novell发送邮件时都会用到% _" a* p$ V/ t( o
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
% c9 ?2 G, {2 }3 q4 FC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时* ^0 S! Y4 l+ b+ X/ g& t. b1 W
D.PHP里用不到这个参数0 m* B6 T, Q3 N) T" o
) \" m" e, a& Y% ~
) W* a: ^ i7 u: x7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
7 n* L2 e8 X- R# n \, c# ]) A0 s' j- C2 J
A.只有在发送非普通文本(ASCII)数据时
) J z0 `1 n7 J* g. k; L2 i8 c, SB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)9 V+ o' o4 z' Q6 ? t7 Y3 k1 r! K
C.任何时候都可以用它来指出MIME的编码类型
5 l5 t& [2 A" M+ g. b" tD.只能用来指定特殊的编码格式(例如base64)
1 w6 H0 s9 ?3 O: F; F2 s& pE.以上都不对
& K9 v5 O4 _8 a3 ?" \% H; g% b0 O& r" r/ y
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
( F! H R% q! t0 o0 `: V$ s& S- y: e: z: J& Q" U! Z3 g
A.分隔符至少要8个字符7 g, j5 v; _2 D' `
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
$ \) t( E8 m. [! d9 KC.分隔符在MIME邮件中必须是独一无二的 U/ L' ]/ O8 F2 \, P
D.分隔符不能嵌套的其他分隔符中
( b; D+ s" j) y& TE.用什么做分隔符都无所谓
$ K/ P" G9 r) l3 {: R' @6 J- V, I
7 h0 i; [; q, w6 N7 R$ w# e$ j0 d1 R1 ~
7 a) G3 w1 n% `7 }% \9.考虑如下E-Mail:$ m/ _* ]& c5 o' h5 r" o
# |- k/ U/ Y& p5 \) t$ [# @* Q h
From: John Coggeshall <john@php.net>- e7 s9 Z" k# U" T" N" @ e
To: Joe User <joe@example.comt>
2 Q) K0 a0 W+ Y% b) U( hSubject: Hello from John!
+ y; h2 w& p& H0 ^3 eDate: Wed, 20 Dec 2004 20:18:47 -04004 J2 s2 O5 J# Z3 I; H5 T6 O. f8 R# h
Message-ID: <1234@local.machine.example>. ]2 A9 i: d2 ^6 i2 Q: X. I# \! }
Hello, How are you?' \/ d" j4 ^' O: P7 L0 s* _) W. f9 e
( g' v8 g ^! T8 Z4 r+ ^
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
+ E" p2 y; }1 l+ @& k J4 N' K6 J
+ c" n4 V; S' d% D$ \7 f7 g( ?8 MA.MIME-Version( \# V, P1 ^$ T, m; J
B.Content-Disposition% Y8 ?( U# O* G, B" A
C.Content-Type! X- u D! r! E, J+ N+ f1 n
D.Content-Transfer-Encoding
7 Z0 h2 I5 p' G1 C6 L9 VE.Content-ID
' }; D- V1 M5 X2 I9 T& W6 u u' J9 q4 r( b3 b
) C; w) \& t1 x6 C6 F7 p3 i. O
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?+ J1 u8 U) b+ I( G
2 V3 `0 N& z! @2 @7 Y
A.multipart/mixed8 c- m1 O4 ?2 [ B p2 J
B.multipart/alternative
. @8 ?* \9 @5 |# V" \C.multipart/default
/ M8 b' J5 F8 ~4 t) [# d/ z# w# lD.multipart/related! @1 s% i, R# A0 L9 q7 m; `
E.不可能用content-type实现
, P, b3 T. K9 X' F- v# c3 {3 ?
0 x: X T/ N+ b. p8 f) `9 O9 w! Q [" {$ j. K
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么? A; i8 s- F M6 o( B. |# g
Y$ r; U0 Y4 \ J
A.安装sendmail服务器3 ?. V/ q+ N) R% q
B.安装Microsoft Exchange
) e1 l( m7 c. W& HC.在你的电脑上安装任何一种邮件服务器
2 s, }% R5 O1 m# {9 bD.改变php.ini的设置; {- G. ~3 f) G; j' L$ s
E.写一个连接公共电子邮件服务器的脚本6 q( g9 ^1 E9 \$ E# j3 ~! ~" t
# _- z% j9 z4 U8 i+ F0 S/ {9 A# r( f
1 i% w9 \) _8 f$ E1 s12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选), B" ]6 x, h3 I5 B0 `
: O( d4 I/ ]8 RA.使用GET方式传值, G" {' E' f) C. t
B.用htmlentities()处理电子邮件地址
; X* o" M% L% I* {. ~1 AC.使用POST方式传值2 j' {: s( d% L3 J; _
D.用htmlentities()处理邮件正文 y8 K8 q9 ~! J7 x7 O
E.确保填写邮件地址的文本域不能有换行符* x# F- p0 D/ K/ d( m8 @/ o
) [0 @3 p, X; x. B, H
8 V: I! t2 {3 [/ K13.如何将一个数组作为附件发送,并要能在接收后重新组合?$ E' Z& N' }) I
+ v5 f4 f5 {+ k$ P$ H dA.用serialize()把它转换成字符串,再用htmlentities()处理一下% h' [1 |; a% y/ t" Y: F1 t8 d- o
B.把它存在文件中,并用base64_encode()进行编码
H5 L9 c* M3 `% G6 z# Q: CC.用serialize()把它转换成数组2 u* h8 }7 x X+ b- e! P: W/ p
D.用serialize()把它转换成数组,再用base64_encode()进行编码
) b3 T8 t( ?, w& Y0 yE.把它存在文件中,再用convert_uuencode()进行编码
0 Z. X2 Z7 b$ V$ Q" i, E1 n) s+ V: K( l
! m8 e: p8 u+ L; t
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
* \6 B# O# Z$ o. W {; N+ h: ]% ?! B7 G i
A.堆一个检测脚本出来; d$ U, U( p8 P8 k
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型. i" k) i9 Q* Z* A9 ?# |% k
C.写一个识别文件MIME类型与内容是否相符的函数6 D6 \0 v2 e, X, W6 l& T
D.使用mime_content_type函数. ?" v- S4 { m% W# o! T
E.把文件上传到外部服务器上, A2 Z n/ ]- s; q% i5 v
$ `3 ^0 f5 l' X3 j, {/ ]" G
3 B. `# r _3 V3 `; R c# b15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
8 i( E8 l' ]" @9 W4 R- U% ?: ^, n" c) R1 A. ~4 R8 U3 M& R
A.添加一个From头信息
" @. B$ f- ?+ f5 d/ r! ?6 @B.使用-f参数
/ u: w$ u7 p" H8 H& a! lC.添加一个Reply-to的头信息: a& @" {, |3 \) W
D.确保运行Apache的用户有修改sendmail设置的权利
) o6 e! J- k' U6 nE.确保Apache在root用户下运行( v) P6 H2 }/ F* d
答案速查
3 S6 C+ ^7 h* ]: d9 P, N; D1:D
/ s6 {2 T' Y. [; f, E$ l2 {" B- L1 R2:AD, N: Z7 F; j9 `3 _2 |
3:E
4 l( N+ B4 j1 w+ o6 V4:Content-Type:MIME
) n) v- S$ Y1 [+ L2 j& n. D5:BC
4 }, d) B2 u8 [6 |6:A: {$ y) B5 q) Z1 D$ i
7:C
- m& W" q0 o+ @/ a8:BCE* Z3 |% o3 l6 y0 N6 s- g* u
9:ACD
/ O5 s9 e6 [2 W: i10:B& ~. \0 O% Z3 ]/ ]7 ~/ N* I: t" Y
11:D3 x4 Y9 z3 Y, ^& R1 p5 A y
12:CE
( v3 L4 x& ~5 R13:D* G6 v T! J" G+ U
14:D. D" r: _8 u4 I2 U; _7 w7 Y/ M
15:ABD' j% Q0 A* b! q' W m& j
) g! o3 e" d1 x6 U
% a: D! b! n7 g4 |/ D: G3 O# J3 a* h
答案详解
# _+ U- A; K8 @( T# y" m2 O! L) f7 Z; G
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
K2 W$ k( \' z0 y9 w# ]+ G% r0 o) l
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
; E J0 A. d9 N2 n2 C5 f: K" r2 W. z
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。' V4 y7 J+ b" [+ b0 T
0 I, H1 z, F \8 k; d' V! F
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。% R. d& P$ z, h7 u/ f+ \* C- `
+ z! Q5 V7 O5 {; l* ]
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。* J9 y0 O2 M, ?; J0 v6 ~5 x
% o" U$ g1 `# ?* t ^& O6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
4 U! N! I1 j+ F% r: T+ T/ D' X* @1 _8 p$ g: Z$ z
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# h, t* b# ~" T4 D6 h- F
0 `* R5 b' p& m5 P6 e5 o1 W8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
, t+ H) y3 J' p
) D! u. i* v, d' z5 A9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
/ F" w+ \- c: f0 `9 E
N7 v* ~ [- X# |0 J( l10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
; s g$ p& {; f7 t# M. L$ F: w
5 L, y, Z/ F. ~. `11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。$ r0 z$ \% K+ I7 t/ q( n- G) _
5 ?( H2 b6 u8 M* w3 y4 B! B- J
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。% n5 f/ A& l) B* q- g% ?' d
9 |' t1 K+ [" n+ {
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。, J. X9 i8 H& F1 v1 ?/ J0 k5 I
j2 A5 L, {# O% n* r3 R
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。( ?0 x6 [; k* X5 f& B. V/ |
/ w( M' p; Z q% Q6 n+ P+ X3 y
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|