  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
8 K: U6 ~: |; ^还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
8 s5 u* {1 d0 G3 a: l用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。. m/ K6 d: U3 e3 s# I3 _
6 ]+ i" H+ V3 R% Y$ T/ T# F
" u( j% Z- J; Q/ \' d( j$ W0 e" l问题& {2 v/ ?( N8 O& p6 {- c' c3 l8 a
1 H% t+ e/ U0 ~. g5 B k
1.以下哪个不是合法的电子邮件地址?
7 ^& ?/ _/ ~5 N9 s4 f) h) h
4 R; v5 Y6 n8 c, C5 M$ y7 yA.john@89w.org
, {- N2 \' T7 v/ wB."John Coggeshall" <someone@89w.org># e1 Z X% r w0 ^) p% V/ f5 E
C.joe @ 89w.org3 {1 x* u# V& @7 ~% t$ @
D.jean-cóggeshall@89w.org
: F5 o. l' N' K& P3 t3 H) pE.john" b* _1 M# \$ X S4 y- {
$ N4 ~) a2 t4 D' }( g6 {# G+ G% J
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)) u1 I8 L3 W5 f7 Z+ P) M/ O) L
# f3 R4 x8 ?, ?1 ?, H7 u. eA.Windows/Novell不需要第三方软件的支持就能实现该功能( }9 U+ S# Y4 m+ j
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
8 T- Q2 O! m5 ?4 u6 J5 sC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
- ?; g# ?. d( P8 e' Q o$ fD.有可能完全相同,这取决于sendmail_path的配置
* f, b! q: D6 V- u; vE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
* E- ^$ B4 z# f q& }7 z+ \4 y8 t/ G6 M. o; _/ z6 G
- d- ~$ Q# B0 g6 u/ _3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?6 C: f+ { N0 Q, o$ f! V1 _
, {3 U' S, k G B; ?
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数/ }8 ]% _' H" c
B.用PHP代码,通过SMTP直接与MTA连接。
( s' e( L/ k; W+ `! j" JC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
' Z) m, Q1 U, l6 y3 `/ JD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
7 Y$ E0 w, o! L- z$ }% RE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
+ E3 `# O/ _$ r4 o
) W) U, b% U# Z, J4 G. K9 D8 i# W% E |* T
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?/ ]/ z4 z( q: D" J z
3 k7 Q. G& Z5 e1 z% _0 N, Z答案:____________
$ g' c4 N8 z, A1 H$ }. t$ H+ [1 U. Q% c: Z' Z3 U% k0 G
4 z0 c4 G& _( {6 O" K% ?: W
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)! }# w' [% K2 y. f
+ B5 ?5 r0 H* {: P, `
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示9 T4 N: \9 N' O/ z: q, x# J
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片: w2 y, h7 i( j! c9 P8 I6 L/ O
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
0 ^0 g2 c, w8 O* s8 t- x. K, iD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名' N4 J, W& C0 v! s/ l. ~9 h
E.只有一个答案正确
# i: {* G; E; t O
$ P5 d1 J, P/ K
6 r, P+ w$ A$ l) ^4 F- N! _6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?4 r/ j& ~) E2 O9 ?& ^' r1 {0 I7 V
- O) `# u! V: s p# D. _2 ]5 TA.从UNIX或Windows/Novell发送邮件时都会用到) V$ t# b! }, f
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时) s7 Y; r# C4 [# t* C
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时* V# l$ N3 y; a1 m9 ^
D.PHP里用不到这个参数
; J' D# n4 g3 M, h. }( K+ d' o( k+ Y7 s3 a9 h# m5 O
: f+ W8 Z. H* m
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
% I3 T* H+ X7 X6 Z
6 l6 h" R5 C7 M L) S4 R5 uA.只有在发送非普通文本(ASCII)数据时
0 Z. F# l" b1 E9 u( c; z4 RB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
+ u% s1 H9 P& [% c' N8 ]C.任何时候都可以用它来指出MIME的编码类型: A& E0 q. A5 n7 Q+ T! K
D.只能用来指定特殊的编码格式(例如base64)
2 w+ I# `$ X( o/ d7 @( z2 KE.以上都不对5 D8 D, C, }$ f' N8 U
5 j/ D6 k( {) c! n; R& w9 F: E6 b
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)5 r6 @7 |0 \6 J* F' S. ~
, ?9 X" v2 N, y8 ]# W7 q
A.分隔符至少要8个字符; F4 U/ g, q7 z! ]
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
$ r7 W4 c/ h, E8 @! n2 oC.分隔符在MIME邮件中必须是独一无二的
' o* B% f4 O$ W6 G% qD.分隔符不能嵌套的其他分隔符中
% ^ u# ^4 X' H, x) r6 XE.用什么做分隔符都无所谓" Z# g7 m9 O! a
9 t. ^( m+ g+ C$ u0 _3 O7 g- u7 ]7 x
9.考虑如下E-Mail:
; c" G$ P2 t0 s) K' j' V- b
8 D6 h1 G% Y# CFrom: John Coggeshall <john@php.net>
. n8 b' ^- G. V: D6 B; {. r2 `To: Joe User <joe@example.comt>" E3 [0 v: y: [& ^' }' l1 n
Subject: Hello from John!
9 E' y+ E& R3 o Q( fDate: Wed, 20 Dec 2004 20:18:47 -0400 V+ z( Y7 {3 H0 }- y; f
Message-ID: <1234@local.machine.example>
0 P% M. y# u6 QHello, How are you?
& d# F0 r( j+ T* C& L, J
: R- B- h4 A7 I4 [2 s2 u3 B' c在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
8 O$ Y& J& j. F
x' F' }; @9 _( E9 X6 KA.MIME-Version
# P& O7 A9 j& E8 w2 gB.Content-Disposition
% z9 V. F& r$ ]! }C.Content-Type
: i3 r0 W% c. l0 t# DD.Content-Transfer-Encoding
6 e) U" P6 q) }$ ZE.Content-ID% `& T7 g; s- _' a* P2 x1 `
$ e1 X, i/ G3 c9 {7 U7 I! L3 P! C! {
5 J' g8 M( c* H) `# Y10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?/ S8 y$ B* {" _% x0 G
% Q) c3 Q& z8 ^' A. GA.multipart/mixed
- }5 U+ a3 e+ p2 G* Y) S( F& tB.multipart/alternative
% h) Q* q; h) i* qC.multipart/default
$ P$ j) D8 A( D9 g" ?' AD.multipart/related" i, e2 w, S0 A, C U/ c; W8 A
E.不可能用content-type实现3 L, ~5 y4 j8 q* c+ j
& [3 |# m9 x) ~: o- d% y, o
- V8 u' W: \; p0 X5 K. B11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?. ?1 z1 j! i& d4 V; }7 R
+ o. ^2 F- A4 Q( mA.安装sendmail服务器* [" b9 i6 C. b) _6 d) Y6 _. N
B.安装Microsoft Exchange1 M5 m% D4 J0 B1 } m
C.在你的电脑上安装任何一种邮件服务器* h1 g g A# G# g3 h
D.改变php.ini的设置* F/ R5 E5 A* ^: }; H
E.写一个连接公共电子邮件服务器的脚本
) j) ^9 x. e h: q4 W# B( Y" e7 Z+ |! ?/ h
; p. q$ _% g, p; F% H
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)- {. s: x R0 a" E
2 F0 V' [- m8 L6 @" qA.使用GET方式传值# a: U$ W& ^4 X' S
B.用htmlentities()处理电子邮件地址
6 W) ]. n& a3 vC.使用POST方式传值
* F2 ~, ]& P. i9 ^. _* K) g2 U% w5 pD.用htmlentities()处理邮件正文
$ S% ^1 Y) H" B/ y3 G2 S+ _E.确保填写邮件地址的文本域不能有换行符8 w* d8 q4 c3 `7 k" a
$ x; j5 E1 N$ A
9 N- c9 V1 \0 t7 I( G7 d13.如何将一个数组作为附件发送,并要能在接收后重新组合?& C4 B7 |5 b+ T6 p! t& V" o* E2 l& f
/ ?. r7 p% M/ y$ kA.用serialize()把它转换成字符串,再用htmlentities()处理一下
* W& F% Q2 X9 ^& _0 b! LB.把它存在文件中,并用base64_encode()进行编码% ?# V: E% B1 a# F# u/ C J+ ?) L
C.用serialize()把它转换成数组
) p) ^$ k Q% {# o7 }D.用serialize()把它转换成数组,再用base64_encode()进行编码
* M' e. @. U& c6 s* x7 @, |6 dE.把它存在文件中,再用convert_uuencode()进行编码
- b9 a: i* ~% L7 G+ b
3 ~* X& `! F, w4 R. q/ o# A+ L. A$ f. e
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
* M$ I- y3 X3 ?2 H3 Y; s. k. v# y2 Q: @+ i- `, [
A.堆一个检测脚本出来 x, ^" |! h2 r2 {' o
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型6 G* h# @3 Y% g0 @, x. D' q; a
C.写一个识别文件MIME类型与内容是否相符的函数
# Q2 ]8 M$ Y: z7 K+ ]* _) DD.使用mime_content_type函数
1 R, i; R `1 q/ ^E.把文件上传到外部服务器上
J& p$ a$ h# Q& r/ Z
1 f/ w- C9 R! Z8 o3 H J
/ O. Q" Q+ x* z& U. u& @15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
6 c% q; j& }" A! ^8 }2 N4 ]0 q& ]( N2 b4 M7 @
A.添加一个From头信息
9 ?9 }3 v1 T B" pB.使用-f参数
* T) W* x( q/ A4 u+ R* y0 ~C.添加一个Reply-to的头信息
% D$ T( H1 Y6 l3 u2 U: F" Y1 |* m9 ND.确保运行Apache的用户有修改sendmail设置的权利
/ P" t) o5 z3 H I7 RE.确保Apache在root用户下运行
7 y; Y* o! w4 f; m& Y答案速查4 |. ^! c5 k) h& _
1:D' J2 t# f1 P, y5 S( B+ N) \. o
2:AD
D+ F& h, e. B, k( r2 D& U3:E
( t' L7 u$ q6 b4 M/ i } v$ F; ]4:Content-Type:MIME
- W1 @6 K" s: w9 i; [/ B5:BC: D: Y1 d( X& h
6:A; Q2 W5 x% Y& q) K& ^
7:C+ x$ ?" _5 m; j
8:BCE+ ~, B2 i+ d8 s. O% J; K4 ?
9:ACD
6 X& |" w+ ?# N( |9 p10:B
/ v- j, u* r( c/ V L, Y5 U% v11:D
1 @$ o1 b. E/ |! j4 w5 Z' q8 P8 a: R. m12:CE1 S3 ^% A+ j: m, o9 ^. Y
13:D
9 B: C; d( K4 H. c14:D
* \2 n; ~3 ? D0 I6 [: b15:ABD
6 j) p/ h8 B" B9 P$ Q* y; Z
. S) k* t4 ?8 ~7 `" ^) L% p. W& N2 @1 n4 F/ A. F
! @' r/ C- c0 K& u* K答案详解
( _: R7 P8 S& h9 y2 |8 v# T# V; n4 X
/ M. d% U/ V- ^/ D: K: H1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
' W" G7 b0 n! Z# G5 ]( d# w8 S- }/ X6 H0 N; Y3 x/ A# y- k
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。, A& F3 n+ B1 T# i2 C7 D$ X
9 u4 h$ u* r7 ]) D1 @* t" b3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
J- J8 z( S+ c! _7 b6 s7 j) A" _# l: I- `0 G8 G+ b, j
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
$ j4 l T0 t' ?, V: s/ c' V. n
. @6 X8 A. {$ k9 c. A5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。/ P9 u" q5 ~1 w/ q3 o( R$ B
1 | l, m; ~! x; A: ^7 c0 Y. _6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。. c1 d. i" T3 G" X
! L% d) ~( o) H# x7 K. U* D7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。" U! K$ ?) H$ m5 R
- \2 R( Y8 n4 i
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。7 w2 c! E7 w z" [. W- [
4 o) Y {3 ?( `9 C( a( P
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。; p$ j) F: X4 x8 t N/ n3 n
- E. e- f5 K: D' J) R; V* `; y
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。) Y+ `3 N5 [2 b7 p A, o) @
6 l* ?8 `3 y- I9 v. h11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。0 r8 {1 x8 z: O4 _
: W5 k+ Y/ h7 {$ h6 ^
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。2 z8 [* v! H( R( y% t
* _% [( [; J. ~( C& U5 a2 Q13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。* ~: s5 o. t" O2 C* ^
+ D7 ?+ b M3 x7 L
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
; m9 F% _& u# [! ?3 @- y, G; k, \/ U6 O% n& Y, V6 T
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|