|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
$ U! @" [, g5 D0 a: [还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。5 d. @% V/ M# m
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。5 |( x/ K$ @, ^* E
2 g6 z- U5 S/ D1 \* b! S. W& e2 m# g6 M9 q3 ]0 C* k2 Z$ T& y
问题8 r7 L1 M9 o* M! U/ e, M y' P
7 F, W) y% T. ?( N1.以下哪个不是合法的电子邮件地址?3 m& b( G% w" b% q7 s& `
6 R% f- \& A* ~% @$ `) e
A.john@89w.org. r' ^* W8 B0 D7 C
B."John Coggeshall" <someone@89w.org>
8 y% t% g5 r7 _5 j" ~C.joe @ 89w.org! o; {* m1 n. v2 P
D.jean-cóggeshall@89w.org
) }% c1 t3 y, c; s' r( ^ b7 FE.john
& e0 ?9 _# z3 \" G6 g5 x$ x4 c y" a) ~( J% O9 c0 D8 E
" R8 ^* w: J! H' l2 C
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选), ~" C' X/ v1 h" z; T, O Y
% a% q0 ^. j$ B* k! W7 H; S- I
A.Windows/Novell不需要第三方软件的支持就能实现该功能
* b" B; }) m% LB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
8 ~8 B6 X9 _% k) J2 b% ^0 xC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送- Y# T I" h: w* g
D.有可能完全相同,这取决于sendmail_path的配置& d( W, A9 y) _( }1 L! O
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
$ W1 u) |! x4 W, t0 ^+ k1 \& k: k' m! ]& T
4 ^1 \! p4 u; _# Q* P" _6 B3 c+ Q5 p
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
& |. n0 s2 {# v
+ \* a0 c6 z+ B$ F6 N% d, zA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数 a: _! M9 X9 u3 X' r' | ]9 d
B.用PHP代码,通过SMTP直接与MTA连接。
2 A H4 U, k0 B8 j- ]C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
% d% G& Y& G6 B+ i5 H% @1 MD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。0 W5 Q O- {) e
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
* p- ^* m6 o! f5 O2 t/ e! y& c# f1 F; W" X$ L$ j
3 v+ k, f" M& ~; N2 c# h4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
7 b; J' A3 Y) f0 a" @# b1 u% g
$ f) Y {, h& d7 g+ C答案:____________& u! n# Q+ v0 G u% f" ~- G0 C" C
: U4 @! h: A" K2 [3 V( n
; w( z; ?6 }# F7 N% D. V( D5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)8 S+ ]" D( R5 E( k4 V
2 A9 a' Y$ s$ G/ H: wA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示' f4 Y% A- B) a s2 E. w
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片+ G" C9 |8 u- a7 \1 g
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID7 a. `- \2 m, _# L
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名0 C6 E& }8 c+ l! F
E.只有一个答案正确 {* t+ h0 U( N8 \4 V9 u
! t9 M) w8 ^" s% q5 e& P7 Y, s
. e T9 r% o H/ F2 y1 z7 B# \
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
# l4 A3 `- C' @. @6 `/ B( `4 ?7 }% v/ @( N \% R# {3 p; O
A.从UNIX或Windows/Novell发送邮件时都会用到* N1 P* F% {! [& Q6 L+ e) L. t: F
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时* G a# B. m& c6 t; p9 S {" h
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
! i$ d* d9 z( H: {! H3 U2 jD.PHP里用不到这个参数: I0 v+ \1 D/ x
' A6 ~+ p4 @% l
5 Y1 b- k m; J, i: z- l! a; ]7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
% E) n: T/ D+ f4 s4 o. g# N! r9 q: \( j$ a
A.只有在发送非普通文本(ASCII)数据时
1 X+ X3 R! g" L) R& ` e" HB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text); n$ p) D9 P# q5 h0 b7 N
C.任何时候都可以用它来指出MIME的编码类型
& u7 r' c- p; P# s+ A; l, s3 }D.只能用来指定特殊的编码格式(例如base64)
Y, L ^( p7 GE.以上都不对
2 `, z1 o2 h+ c N9 n; k u! M$ B' J2 Q. f: `6 A
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选): f2 `( P p* ]9 s; y6 D/ [ {
! U7 W5 p, g+ w, w' YA.分隔符至少要8个字符
2 y- J7 |# m% V6 k/ P% H# dB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)8 K5 V9 s: F/ W6 }. q
C.分隔符在MIME邮件中必须是独一无二的
. }% P& y2 I/ \2 e$ w7 L8 Y2 u$ xD.分隔符不能嵌套的其他分隔符中8 s( Q* C" A% V: I) @# u% H$ e
E.用什么做分隔符都无所谓
5 H& [5 t z+ N' R \# [- ]* |
0 v9 a8 h% z8 e: B$ w% y% T9 }
# i* s% O2 W& S Q& V: N- Y9.考虑如下E-Mail:
3 ~. |5 u2 x! B" s' w4 F" A% w# V
5 H2 p/ J Z4 f9 }From: John Coggeshall <john@php.net>! W# p0 P7 ^! B5 M5 K3 Z
To: Joe User <joe@example.comt>
6 x& J" u+ I$ k1 b) u6 y9 dSubject: Hello from John! v; K7 p/ [* q) ]$ r. ?
Date: Wed, 20 Dec 2004 20:18:47 -0400
1 w, o8 c# B! _! H8 N# k& W( \- T4 oMessage-ID: <1234@local.machine.example>
' j. ~ }* E& LHello, How are you?
% ?/ u$ `" i/ b; S0 g- {2 Q# t# O5 x: U2 V9 E# M }
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)7 A) \( A9 Q2 j, X
+ Q, F l$ [% x. |; [
A.MIME-Version- G# P2 L$ Z; I4 x) U
B.Content-Disposition
+ b, C, T: w; D, }* g, n) JC.Content-Type
% F, ]" `) U0 _: J9 uD.Content-Transfer-Encoding. X7 Y4 a5 |0 J4 g3 _ N @ ^& [
E.Content-ID/ s7 P+ N+ n- z+ j6 n' N
' {+ W$ T, \1 f' l2 ]2 X. @
6 y# Y s5 j* Q7 I) y9 h! T2 f
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
- r* x; E* k1 i- \" S
; L/ ~5 U: q- ]) P4 nA.multipart/mixed# E* H$ |) S6 p
B.multipart/alternative7 L; _$ U/ ~# m
C.multipart/default8 r9 F* g6 i, D7 v+ T: G1 E
D.multipart/related) i1 s8 r: Z# W0 p. K* P( Y# f
E.不可能用content-type实现/ n2 U7 p1 F* J, Z' q( N" c
7 J4 T! M* O) v( ^7 ~
h& `+ S* ?9 ]
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?2 G: l# |/ I3 I5 E
8 `. J3 p3 i4 O h
A.安装sendmail服务器: Q3 o: v) e) R
B.安装Microsoft Exchange9 L2 M& c: O5 n, r
C.在你的电脑上安装任何一种邮件服务器8 `- `, u l% o Q% G2 D6 d/ r
D.改变php.ini的设置 q! R9 K6 N: H: S0 R4 h& R/ u/ v
E.写一个连接公共电子邮件服务器的脚本
" a( ?9 K1 S2 S8 W. ?6 i' m% Z1 L; o0 r1 S8 k ?( E
" h1 e3 o6 i2 ]# J( s) h12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
$ O3 C( k$ k y; J% P+ F+ ~4 k; c# P8 s/ R& R- @
A.使用GET方式传值+ z j% s# D A n" v- f0 f# q( C
B.用htmlentities()处理电子邮件地址
, J9 S `( V- } {. B8 }5 T7 Q8 XC.使用POST方式传值
$ ~8 j) \' _4 X: D1 P! ~+ b+ m* TD.用htmlentities()处理邮件正文
- u& Y$ T" K5 T) C" w' c. `( {E.确保填写邮件地址的文本域不能有换行符- m+ T" Q2 L$ O; T: G
{+ u9 L) }# g) k6 |" ?' ]& _/ `. I
13.如何将一个数组作为附件发送,并要能在接收后重新组合?5 v" T9 M& E: B8 ]* r
& K% p- }8 k k+ B1 n! ^$ w% F8 Z6 TA.用serialize()把它转换成字符串,再用htmlentities()处理一下
, ^6 H9 w- m- n: O5 C" Q" QB.把它存在文件中,并用base64_encode()进行编码4 L: }' U' @. J( I' r
C.用serialize()把它转换成数组
' t0 k+ R* k! P7 J- }D.用serialize()把它转换成数组,再用base64_encode()进行编码
& ?5 x0 j6 K* I. i, {0 w- oE.把它存在文件中,再用convert_uuencode()进行编码
! g; @4 b* J" l0 K
& E9 u) z6 B" r! c
. x% F) |. t# j6 v14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?# c* ?, K6 o" t+ a/ w
% H$ V! o2 R' B. {6 l0 S- m, SA.堆一个检测脚本出来; J. u7 U! k+ o% J. J6 N
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型" p4 U4 F" a5 P3 q8 z) b3 K6 o( i+ E6 P0 Y
C.写一个识别文件MIME类型与内容是否相符的函数- j& ?, L% H) N1 R5 x2 K# K
D.使用mime_content_type函数3 v- `- @- v: r a/ a$ B" P
E.把文件上传到外部服务器上
: P* l4 ?" R2 M
! ]' d5 Y2 N0 N5 i$ C
2 m# C" @$ X8 X5 Z15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选) R- K; N6 i% J' g+ u
$ K) X$ ?, d, z2 z! z
A.添加一个From头信息
1 Y- E9 t5 o0 O8 b: X/ F# pB.使用-f参数2 f- B; k+ a' H; c" J
C.添加一个Reply-to的头信息
6 }( X# c8 }1 K- V* b+ AD.确保运行Apache的用户有修改sendmail设置的权利4 D* ?7 R1 {2 r# f. {3 J4 l0 W
E.确保Apache在root用户下运行. N& `7 t1 T, |1 d
答案速查
/ G+ g F: j; K9 Y1:D
. d1 O" y: U/ p8 e7 g( I9 V1 o- O! U2:AD
4 O; `" K0 [6 g: ^+ N8 c& Y3:E
# C3 B7 n- n5 h- N& ~5 f4:Content-Type:MIME
9 p; \2 B: @+ W# i& t" O' h5:BC$ m y/ M7 K6 }4 I% a
6:A" k% k0 T/ Y3 n
7:C: o* v" }( F1 W0 y( [. Y
8:BCE) V. K6 ] b. f7 e0 W7 U" J# R% |
9:ACD5 k6 b: o& W5 K9 L- @) c
10:B6 V8 T I: B' ^
11:D5 F( s" e" \/ v; I
12:CE
@+ E" z" H/ ~& r13:D
( Q9 ^# Z4 I# c+ W% _14:D
, {& E$ d) ~ W" K0 ?15:ABD/ e% {7 S0 u! ?. h, F2 q" i( \1 r6 q
$ J7 b# A7 D5 |' J# o. w, M
' ?3 ~$ C- l a8 T
5 H; @- {& v6 R2 n7 a" S7 u5 r
答案详解
, A3 i! t9 d/ M$ G- K! c& {, H8 t) N6 h# ^ f7 g- |) I @/ p; F
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
" |: Y Q4 I& }1 P1 V. T- h
4 m, ~( _# }8 K( @! g$ j7 }2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
/ T! P1 _4 e i2 F; L$ F( U
7 {; t# ~+ l4 @, N# h3 q( F3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
" F% \ c9 _! p+ O: _: b- P! [
. W( o6 J5 b6 x; c) W2 Y$ P4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
: v1 T% a4 I& @' P& S4 a
( v5 o: Z& B- t5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
{0 J, g% Z% F. q8 u8 D1 k& B/ b3 q# H( P
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
9 x" v; h' K! c3 X$ V1 d% f$ A" K: @' w. B0 D
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
0 a" B' S. M5 d8 E% o4 f7 M$ m; a
6 j. Y" h7 `( n8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
! ^" [2 x2 o% w' k5 L
?0 q1 B) B" Y b9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。" ^& b" k& J' g7 I0 q0 j9 f
# G$ C% a$ n) ?3 Z1 r/ H9 i10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。6 i1 U @0 ^* [0 t" G
& h# m4 @" v9 `2 q
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。: Z1 o: i3 i _: y$ S- z
& m, [+ h+ _5 a12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
! f0 J1 H4 `8 K% Y9 G. q
+ D% ?+ p% |9 q3 A" h13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
* ~( O/ V. h6 N: `, H) B2 D \. ^
- {! ^0 t7 w6 `* V: r14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。% u9 r4 T9 _4 q9 ?. p0 X" p% @
: h0 ^% d' _, g3 s
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|