|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。2 @3 j! ?1 e6 X- t4 p W k1 `* I
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
x% h" L8 o+ N5 E用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。: v6 C; \7 I6 b: w# }$ ?1 K
6 K8 s/ C: B4 [9 E) F
7 B: `6 l s1 z- i) J' N
问题 C% C9 b& K$ l- X- @: @ h1 s
# M' d( W8 O# c- D; j1.以下哪个不是合法的电子邮件地址?0 n$ a) I8 U% l( M; s
# A4 n4 s" ] S( J7 q. CA.john@89w.org9 B, v8 k* ?% k2 x" Z3 y
B."John Coggeshall" <someone@89w.org>! G: L# }. w) T6 C1 H
C.joe @ 89w.org
2 a; F$ B, H; O- g: z% LD.jean-cóggeshall@89w.org) o( b2 N+ y3 q
E.john
; ]" s) v! ]8 Z1 B- @" t$ g
) ?% e& }5 ^0 A1 e7 R7 z
2 a( D* k1 y: Q3 \$ K1 ^0 H( K( c2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
8 T% B4 W: s) m" {9 I, a; z. B. r9 ?% S: `$ _
A.Windows/Novell不需要第三方软件的支持就能实现该功能! d6 ]* B7 C5 @! E
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
d; F; R+ s( i3 e0 H: sC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送) B/ H; E) N, L$ c2 Q
D.有可能完全相同,这取决于sendmail_path的配置
$ H, ~+ V, z% d* m' C; \' uE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口* e( G- y( r) V4 r5 T k6 i' m( I
) \5 _/ V* h" I L9 ]; m$ u
, ^% z! U) f( j h3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
9 `3 i9 `; [% [8 y: w, ^* K+ N& U0 ?1 q* T# H
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
; h, V. o8 P4 a6 a3 {B.用PHP代码,通过SMTP直接与MTA连接。
9 }" I- Y5 A4 J: B, N- ^C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
5 f8 @7 _" X. a- U% A! L1 {. t% QD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。# H" Q' p# n0 o/ d# R9 O7 } O
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
! r' N3 @4 E: f- Y
! {" D+ M2 A& k' |4 s% p( D6 I( L3 G, B
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
. |9 E+ x( X: T8 I" O" h
9 \7 P6 V9 [! b9 p答案:____________
% M0 ]8 P6 X' Q$ P8 U; t& K! P/ o+ ~) C$ f5 ]+ ]) {$ g
% @0 y& V, G3 l5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)& V/ r/ \6 l/ y% S' n J: A+ y/ R# Z
( \# B; _1 \+ ?A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
) b* s- @( n+ f3 b) S9 q o7 ]B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片/ G% [/ s; ]/ v- j+ y
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
* ^/ @8 V9 @1 S% B3 T* TD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
$ C0 A4 J, f, L0 A0 y# I) uE.只有一个答案正确: U* G" k+ ^- Y; [' B
- N9 U5 u) g0 Q0 u9 }
% g7 Y# s# Q% `2 O" R9 z8 m! n$ b" K6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
$ K: {3 g! @( x" S! n) n. b2 D# T# J/ i/ }% \8 M3 z
A.从UNIX或Windows/Novell发送邮件时都会用到
! z5 [- v8 k7 ?, B& u; K- m+ d7 qB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
5 n! b' z2 q# a8 f' D6 ?C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时1 I6 S* q) w. `: y N; o, [
D.PHP里用不到这个参数% k- [. q1 e3 N- u# ?& W
! s$ r7 l+ b0 s+ G1 c$ l
/ O6 ?* q! l6 w' ^& y( g% ]3 y7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
; y* N# J1 E2 ^4 h( P
7 b8 w* }, g2 O/ x# }" \A.只有在发送非普通文本(ASCII)数据时! x; N9 _- v0 \ _
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)( |' g, m) m* J I
C.任何时候都可以用它来指出MIME的编码类型6 B8 n0 S, L; D# T: o. U! e- T3 U
D.只能用来指定特殊的编码格式(例如base64)" B" O2 j( K8 R
E.以上都不对
4 ]0 a3 J7 i& `/ d- [+ ]; C& k. `% t9 Z; {' c8 Q/ d
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
- ?6 ~9 f4 \! O$ X( b* i5 g5 G% w
5 u/ G- h& _8 qA.分隔符至少要8个字符
; k3 o- }& ]0 W6 K: {5 e7 @B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)! f% w+ W2 W$ H+ N
C.分隔符在MIME邮件中必须是独一无二的9 F9 @, j8 s( x' D- D2 H
D.分隔符不能嵌套的其他分隔符中' Y2 x! e, X5 C7 p; r
E.用什么做分隔符都无所谓4 y7 ] G- t3 O; t2 J
& U, x' {2 B4 K" `8 S1 g8 t: ^3 v4 `+ e8 d7 T
9.考虑如下E-Mail:) x6 p+ e: m# ` W" ~
. u3 @" G2 q \& B& F, M5 eFrom: John Coggeshall <john@php.net>
4 n2 z3 Q* _ a: dTo: Joe User <joe@example.comt>
0 z. E6 |0 j. f: WSubject: Hello from John!" I) d5 g9 e m* d+ X% _, @
Date: Wed, 20 Dec 2004 20:18:47 -0400
/ l* k1 K1 M8 T$ AMessage-ID: <1234@local.machine.example>+ A- T; ^ z/ J! A
Hello, How are you?
- Z7 H9 l) k! ]( R& g2 q8 z5 \, ]; N1 R: R4 A3 G. o
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)% S# o, {' Q; |* N6 j# X$ N7 r
6 Y1 z. }# B5 j
A.MIME-Version! ^$ Q) P. N0 x2 X
B.Content-Disposition
+ N' x" P7 ^3 X$ v' XC.Content-Type; M1 e, e- c6 v
D.Content-Transfer-Encoding0 X2 {& l' B, b/ l2 g
E.Content-ID! H# d: q& `/ D! h" `2 q |
3 |7 P, o0 B/ m) ^
1 f8 f# G3 m: G" K: M( o9 W, H10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
( O$ J7 F1 _6 y$ [" [& I, e" E. T i
A.multipart/mixed- B7 Z2 U6 J. R: a+ q m
B.multipart/alternative
7 n' X! d* @" O0 T& `C.multipart/default$ g2 A Q4 D* }7 v, A9 g7 N, {
D.multipart/related
V1 p- g# P+ E# gE.不可能用content-type实现
* z8 L* F* P1 M( l$ c( [ p @, U% v n& v, x; ^5 P- r2 Y
7 F5 X2 r/ ]2 e' ]7 q11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?; P# P- } w6 m% E% J
- z7 G) p6 h' M0 ]6 p( ~8 MA.安装sendmail服务器
' k9 q7 b% ]- i2 UB.安装Microsoft Exchange
8 u- {) H8 B' R& U! S8 fC.在你的电脑上安装任何一种邮件服务器1 B4 ^8 e: K: z3 c( l& J
D.改变php.ini的设置! `# J3 {( [, t$ H* o5 `! M5 ?
E.写一个连接公共电子邮件服务器的脚本
6 i' \8 v, \* S3 c4 j* p) Y$ v) m
4 V" Y4 L n. u3 {; Z4 H. ]
$ t1 ^& s6 u1 r$ i4 h- S12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
8 E; Q- L' M, G. s8 y0 I
9 v: ]; T8 R7 i# y, {A.使用GET方式传值# s; H9 W- G* j4 i' P- O
B.用htmlentities()处理电子邮件地址
3 Z% k7 u1 A6 wC.使用POST方式传值
" D! g* w5 _# }D.用htmlentities()处理邮件正文
- J0 E8 \" T* G- q0 v4 EE.确保填写邮件地址的文本域不能有换行符% z* N& [6 U- _, e- w3 t8 c
: u8 `! R# ]! A
/ `. `! \/ K, G0 c* ^
13.如何将一个数组作为附件发送,并要能在接收后重新组合?$ ]+ K: A/ d$ L' s' f3 g/ l9 b
! m+ Z& M" {6 t, ^A.用serialize()把它转换成字符串,再用htmlentities()处理一下5 g- \6 D# R9 L0 L B
B.把它存在文件中,并用base64_encode()进行编码
" W0 P8 K9 R! L, ~# hC.用serialize()把它转换成数组+ r! h! A3 n* _7 q* C
D.用serialize()把它转换成数组,再用base64_encode()进行编码 \/ u* {5 n1 I. ]# Y
E.把它存在文件中,再用convert_uuencode()进行编码: p5 |+ J2 I* c @9 D+ M' v
) t" y; V* T4 P! r7 I% q
s' ]4 N1 }8 ^5 y
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?+ @( J- M/ B4 W, t& [) O7 ~
# Y1 V) {+ |# R$ T: VA.堆一个检测脚本出来
. H+ \# C! s+ E! `8 d# MB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型: @6 q$ ]2 Z+ ~" `
C.写一个识别文件MIME类型与内容是否相符的函数
+ H' t9 g+ Q& x. y2 ^3 U3 b% d5 d4 dD.使用mime_content_type函数
6 z4 X1 V' P0 ]$ d) p3 m/ yE.把文件上传到外部服务器上8 u/ I) I& ~$ w: a
( H0 t6 p( C! k! J1 e7 `5 H" |. B' q# ^; m
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
, J* b; t# F# z) H. f
6 q: f% s4 O' G, j3 BA.添加一个From头信息) r( m! \6 N% H0 ^0 l7 E
B.使用-f参数# a4 V. f: B+ z6 X
C.添加一个Reply-to的头信息! u) Y+ y, V# u3 K
D.确保运行Apache的用户有修改sendmail设置的权利
9 x2 K5 C/ F, jE.确保Apache在root用户下运行
! b1 B, d6 H$ v& z) h; c. j7 Q答案速查
: Y8 f- y5 h/ y/ I. J6 u+ @1:D
( p* p) k/ e N9 O0 @8 B2:AD
" f# Z; K& N$ T4 ?; A2 @2 M- D" \( D3:E
. y1 S- t: k$ y2 ?- n4:Content-Type:MIME2 K( L$ m) s# u$ `8 u) a
5:BC
) ~/ \# U8 Z* Z0 p* o8 x- `% I6:A) g4 p; f4 V: ?/ _ m
7:C
- L+ y$ R: u; k" g8:BCE9 O3 e! p/ [2 v" x% o' \6 x
9:ACD
. E3 |) U0 g/ L10:B
5 j) t9 G, Y) P7 ~) {; m11:D) U1 Y3 q' V1 x1 e7 q; s d
12:CE
8 a. d9 r3 y$ }* R8 x13:D
$ q t/ [# H3 q14:D. i8 P$ {, b, A y! j1 q
15:ABD
; |: N6 y4 K4 \! X3 F4 B* p+ N2 e) \
# C+ W d9 ^8 d
, Y" D6 R: x! _* D) R; L1 S答案详解
7 f4 Y' z8 ~! H1 B, z6 t) {
7 |8 d/ ]& k; S9 f3 b4 Z1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
] V9 l' P$ C+ W1 ^. @! D! O. ?+ W
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
- G7 d* N3 n) c, ]. E4 X) [
6 L3 D6 l2 @* [5 z/ y! e. ~3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
. r/ f, E5 q/ v) w) _% x' H# U. B
_* S6 T9 \! W8 e, k" o3 ^( q5 ?4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。$ Q/ t# X4 N. m
: W$ X7 N5 |* v q' @. X5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
8 y! [3 w$ u4 k" B; J6 l u9 n* G7 i6 F! y
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
, d0 B3 h! x; P, q1 ^2 g1 X, r- L7 P) n
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# M. s& ^+ h! H& f& v
$ i0 ^* M; W: T+ t" Z9 N$ V
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
- v! M2 |* g. q5 y2 w. ]! y' ^: G1 w0 T; |& e: e3 R- W; z: X
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
7 f5 n" S T# g+ m7 E' [7 s+ d; `
0 u5 s7 A( N# n; d9 {10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。$ h$ l7 t: t! M; o" p
$ X& A- F% Q6 N6 u# O# P11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
/ R" O2 Q. t; J. u4 m7 w
! T7 M4 T3 P; A/ x8 k( [9 @12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
% }5 o9 m% R. F- Y+ H/ x/ s R( v, m
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。9 r/ A8 n, q4 D( ^0 x' ?
4 p9 m* G& A$ e' Z/ `1 t14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。% S2 W2 @- K; L, ^: J
( f- M! c- C* N7 A- w15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|