  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
% O3 E* S7 U) Y) S还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。, N' T9 K% r- y$ h6 b
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。+ {' O# g4 q% z/ C( @- A
* c. W, E, w2 ~7 Q
3 Y G, F9 P4 S3 c; S, B1 N! t- d问题
- P5 x A' W2 @ D+ n
- a( }: f7 }1 c9 c$ Q9 c! T1.以下哪个不是合法的电子邮件地址?0 `# \( X1 Y0 j5 f* ]! K8 O
; m( y9 v' f* l: RA.john@89w.org
1 H4 y/ t0 t5 p. b. y! ?) ZB."John Coggeshall" <someone@89w.org>4 z; d; n4 _+ G1 P F
C.joe @ 89w.org
; _- e+ s' j5 k. H; SD.jean-cóggeshall@89w.org
0 u5 B8 S- I7 i, LE.john$ F/ q) y) E1 W
2 I1 E/ R( T1 |* Z! g0 e7 @; r
2 G* p$ }# | A2 f1 i! L( X: I2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
" K. }7 B& j2 B2 O* d! u$ I! E0 P A, J6 k9 A2 N" D9 I6 K& m0 b
A.Windows/Novell不需要第三方软件的支持就能实现该功能
0 y* i! n. s# [" n! EB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。% s* h+ I* V O2 q
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送" K& e9 r C# H
D.有可能完全相同,这取决于sendmail_path的配置
, M$ \7 E3 X7 E" U; X: pE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口# B( }/ C4 ^$ F9 N2 D( f
. L2 \9 x6 h. i
( {" I2 d% b i8 b, J
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?. a+ t$ v' |, E: B. j& h
6 U" A; v% G$ y! W$ {- AA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
9 F4 A5 L7 v. r; D" S' d cB.用PHP代码,通过SMTP直接与MTA连接。8 J) `% k( R. |2 e
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
' U7 n/ q# m* ~( m7 LD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。1 ]' H3 }" V' ]$ a
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾/ n6 i# I- m& F; l8 {
/ p- o" U, n* ~
: r* R7 O! ? m* W4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
+ r; ^" Q, u8 \ V' t
1 i5 f% l6 T- @# u9 Z* L6 r答案:____________
4 h# @8 I9 z: r: G- b- d0 `3 Z0 \; ]4 ]
9 L' g& C t$ J2 L0 Y* K
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)+ W2 K/ z7 a# R; }% g) e
2 P( [% j2 E' V% d5 ^* f8 ]
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
6 G8 c6 j$ F B* Z) f. Y/ h% YB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
1 p1 U6 ^ c8 W7 ]( d- aC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
8 x; l1 y5 {9 R7 m- k- {D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
4 e6 q; D! O8 |E.只有一个答案正确/ s4 Y4 _2 M" n+ f6 o
?) v$ ?$ O+ W5 Z. X) C4 v
, t9 h7 Y l+ R+ I$ ~2 f" u: H6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?. s$ H; c$ a2 @+ Y1 V) G
; r% o9 T3 b! r/ [A.从UNIX或Windows/Novell发送邮件时都会用到5 h1 l6 v1 V c3 M
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
8 I8 w7 \2 e1 R2 D1 _# o# Q% y0 BC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时% D* D7 H1 J! ~, { a" w
D.PHP里用不到这个参数
- x3 ^' `" h Y
0 u0 `4 D( _3 J6 E( z' J: t0 A0 j3 [3 @$ M C6 e/ O8 @7 h$ T
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?0 X( r7 Q2 U9 A5 y
+ B; [* z J5 i( m6 J3 T7 P3 F4 U0 k
A.只有在发送非普通文本(ASCII)数据时6 q v7 T6 B3 G6 i9 Q
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)1 D- ]0 }6 I1 `- ?
C.任何时候都可以用它来指出MIME的编码类型
2 Y! S$ C8 d) W" B, RD.只能用来指定特殊的编码格式(例如base64)
5 S( j; }! T0 U1 jE.以上都不对
& |$ L$ z5 B( T: L$ T J
$ m9 U; Y" {7 c# V- b8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
, n; {" `- Z( i9 w2 O" i& P& C
$ D% ]) |& i/ r% [A.分隔符至少要8个字符
8 k5 C+ d1 Z. x7 [& F# IB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)2 E5 ?( ~$ w! v, c, _
C.分隔符在MIME邮件中必须是独一无二的
" w0 ] J8 Q% Y7 lD.分隔符不能嵌套的其他分隔符中8 i6 ^9 l7 | _/ o; r; R
E.用什么做分隔符都无所谓
% ~1 q1 E* S( t& V( p
3 M# l8 `9 w' t* |2 ~4 |
+ [" v7 Y+ T, I7 x9.考虑如下E-Mail:
) S; l( G+ U; O5 q9 f1 V' k+ |3 ?; q) m7 P5 L
From: John Coggeshall <john@php.net>
) i% y% B* u [7 PTo: Joe User <joe@example.comt>
5 v$ H/ P7 o% j9 p5 gSubject: Hello from John!0 G6 H% s5 a- H/ u2 S
Date: Wed, 20 Dec 2004 20:18:47 -0400 X; P" d B( V8 ?$ \
Message-ID: <1234@local.machine.example>. I8 p% ^+ a7 ?- M- Z5 j: N+ b4 \$ K5 v
Hello, How are you?
, N& H& P" P; F9 h. d2 `
( h' F2 ~/ {' e+ s6 B# Y f6 M8 H( N9 L在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
6 }3 g" c% h6 S! e) w7 M9 B1 K5 w4 m) p0 C: E
A.MIME-Version$ Y: M( O8 P! u8 a) U3 X; Z
B.Content-Disposition2 @4 a$ k6 u' Z) S6 p: a* N
C.Content-Type
( E) L6 o5 F/ ~' B& i. k/ t6 wD.Content-Transfer-Encoding1 L; i, `& v" Q- Y3 U) B- {/ R, j
E.Content-ID3 r0 K/ E3 x3 O- j5 C) H4 h8 V
! {, R @% I+ {' C1 a" M+ g6 a. [
0 R; A+ N; q* c) A5 q _1 x4 Z, ~10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
# `, L1 U4 d# m5 b+ \) F6 [9 u
* e! R1 `8 B( l7 xA.multipart/mixed
9 T9 ?9 |$ M5 X9 z9 k* M; _B.multipart/alternative
0 j4 k& ^& `; q/ H! Z# QC.multipart/default
, s" Y; O U# ~ l6 VD.multipart/related
- u* t0 ^( }! o6 TE.不可能用content-type实现
% i2 D! A+ e* o% f: N- S: a s; B/ e) G; Q# Z& |
5 r8 A1 f6 a( G3 Z2 D11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?& F- U1 \! f' ~8 l
+ S3 I# y$ @# x% g
A.安装sendmail服务器+ w- s! H$ b G- ~
B.安装Microsoft Exchange
. C7 a% R6 E, J* R; J3 pC.在你的电脑上安装任何一种邮件服务器
' n7 R: _% [$ p4 H5 ^9 C1 ?4 |9 _D.改变php.ini的设置( q- x. t3 s% t1 G$ N6 @
E.写一个连接公共电子邮件服务器的脚本
( j9 ]: W p; f% \. p+ z; r: |) t6 q+ H! U, p: O6 F
+ T& w, I' F! u, H/ I
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
/ I% v. j, a" x/ v% e: m6 Z' c& S4 k
# v' d+ l$ \7 D' J5 V, KA.使用GET方式传值8 R! Y' m7 p! Q+ r' g; L
B.用htmlentities()处理电子邮件地址, m- S8 _1 D( o H+ H7 }9 l
C.使用POST方式传值" N m; Z; V- m, e* ^
D.用htmlentities()处理邮件正文
/ ^8 k- M$ u- p+ e8 {% N/ TE.确保填写邮件地址的文本域不能有换行符' U9 C9 \& z4 D- q) [' B
( U: T' H7 t8 M
( l3 b$ t H6 C8 \
13.如何将一个数组作为附件发送,并要能在接收后重新组合?! _. H+ c7 N% y6 h$ G% [: t
/ l+ f! o1 B0 {9 _A.用serialize()把它转换成字符串,再用htmlentities()处理一下
+ M& y; E: t* F3 |B.把它存在文件中,并用base64_encode()进行编码
( F" f/ L6 F2 u L$ z1 d8 j' Z$ ~7 GC.用serialize()把它转换成数组
8 X3 D5 {! z3 c* qD.用serialize()把它转换成数组,再用base64_encode()进行编码2 O, Y. }' p+ b0 t
E.把它存在文件中,再用convert_uuencode()进行编码
' y, n# {; }+ ^4 E- m# u
6 Q) `1 V s. o: _5 W' k
3 o6 x* C4 T' S- W, ]: T. U14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?4 C9 [; l# _9 Z
. ~3 q# Q/ Q, WA.堆一个检测脚本出来
& H- }: l1 S+ {3 {" a. KB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
0 o2 \3 [; k4 k: z: YC.写一个识别文件MIME类型与内容是否相符的函数
/ \0 F4 F8 }1 x: [4 k7 f6 ]D.使用mime_content_type函数
% f" H6 c' `0 r" n' ]( Z [7 i0 OE.把文件上传到外部服务器上
6 _6 B: M# {- \) N5 k1 m# s! I7 h
+ F8 q$ }4 Y4 v9 ~ M8 ^3 I+ T3 m
8 F3 q! F! m! b5 w9 x15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
6 q. T6 ~4 N9 A
}8 v' r' o" o2 ]! c7 M0 U) TA.添加一个From头信息7 D' |1 _5 T% M; A6 l; \$ O
B.使用-f参数8 X% a& p- d7 K3 P& ~7 J
C.添加一个Reply-to的头信息
" H) v$ {# k# S- T0 x' XD.确保运行Apache的用户有修改sendmail设置的权利
9 k# F% U% _. S# fE.确保Apache在root用户下运行
* c* X: l8 w2 d) p' v" Z9 j答案速查
3 O" i7 N. | N1:D
( A( u1 }* \/ \8 y: z' D4 f2:AD$ ~7 F# w8 ]9 x' T5 Q9 {
3:E3 M3 v' k5 x8 O2 B2 b/ e2 }
4:Content-Type:MIME' _% U! F* |9 L+ B' g* ?) @% }
5:BC
% u# W' c; |7 b5 h6:A1 m1 h- h( F7 @: g) }+ _% S
7:C
& j/ B5 K1 `5 z8:BCE
, J' S; n; ~" Q) l: i+ `9:ACD
( a/ S- k% ^+ }9 |10:B- u+ x2 {& r5 o- K/ \
11:D5 g& }: t& k% J: @( y. L- X( n
12:CE
5 s9 p- _0 n* k3 k) x3 U; r. d/ U9 l13:D
2 h5 _* C' t2 E& R* K5 m14:D
$ D; i; u7 I) _* G- e5 C2 i5 O15:ABD5 T. d- b4 e" Y- x& H4 q
3 E+ j) q2 U4 [6 L* ~
! ~/ W- V" z7 k% f* c6 W" u. S
3 c6 U* ~+ H, f3 y& x" w( ?
答案详解' F# Z3 [# q, U
: ?+ q- Z+ @! X2 S# Z1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。- N; g$ C2 R' x: X6 A" U S
+ s% l# f$ k$ N4 R, u; y
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
' m5 f$ F9 d& E# A+ H# @4 S2 T' h" P" i: y; K7 T9 n
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
( {) f9 P, [( c+ | e: O( q5 }- a9 v* e: u. j! F: X/ I5 s2 j
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。; `$ X% x- a% \5 q7 B; T
$ M+ z+ b( u7 _& M7 z; F
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
4 p! W( |# S' G4 ` ?3 f3 K* Y0 @+ ~" X, b
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。7 ]& O" s, u0 m4 p
# b- f* `% c6 f) U* X4 u0 G" Z7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。% y+ ], {. C# {+ _" S
5 N) b/ C v- s8 { _$ d* L8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。# O2 A8 m3 K# u# e: h; _9 ^0 E# l
, c" y7 @5 U9 z1 r! H: k
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
; i' ?3 c$ I( ~1 z
) D' [1 i" \* k1 N) P; l10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
5 N B" e5 s1 o" |4 ` u! w1 q5 V! V0 d5 o) L
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
# N; A" B0 O: t L; C5 m' O/ ?, b p) M
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。4 |* v! G/ o4 E
% m: A0 [; w6 n; o$ C& s, k13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
1 {& s2 k2 H3 L% K# c( T5 |" X8 Z1 i, u! S2 c
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
" I1 u( a: \+ U7 C8 h% z
- g; N# A) k' s6 V0 w* O. S15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|