获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
( i& G- s' s6 U2 u* R' L+ T还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。% L4 n6 Y4 W' w6 @% I
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
- l3 u7 ?8 h1 r5 h2 h# y
7 A# _; C3 C/ ]4 d/ f; b  c, V  Z: B7 H/ T% k* H
问题8 |* R2 v0 S0 ~0 @. H

5 A/ [6 T9 N' R1.以下哪个不是合法的电子邮件地址?
  n7 U" o! l: V3 t7 j+ v, J" t7 ~- M2 ]/ {- ]; Q8 ~5 [! M8 c9 w: B
A.john@89w.org
+ L3 E9 b* i5 J) EB."John Coggeshall" <someone@89w.org>+ A# m$ m& R! F
C.joe @ 89w.org
# k9 a; F0 D) d4 R: L8 `$ _D.jean-cóggeshall@89w.org5 g) d0 ]8 l4 o: n! A8 F
E.john
9 j4 p1 |9 J' h: L6 Y6 j  }8 n- N1 z, ~" y/ b* \6 s) V4 Y3 g
, g3 U; C, K, T# l& e. [4 a
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)/ L2 ?- B% k5 m& s: W6 a
  T( H1 p. ]0 e$ {$ K
A.Windows/Novell不需要第三方软件的支持就能实现该功能* B! q" `" l' G* X! H+ Q
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- E5 ~6 g2 y4 i. h
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
# y1 A; g4 b# a; ~- c5 _% pD.有可能完全相同,这取决于sendmail_path的配置4 o9 p5 r+ b6 k+ e
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
0 r$ G* I7 d0 I6 g% }" i# E6 W# j, b( b+ ~5 k

+ @4 p, _- O: W3 C7 A3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?; c' S- |9 r" |
/ O0 c  S0 N, ]& {- G* I! l) ~) p
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数8 b/ x1 e7 s9 h+ }1 ~8 E
B.用PHP代码,通过SMTP直接与MTA连接。2 d; }- U) \  Y% C4 {0 f: V$ @# T
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
- ^5 a, r( ^7 l9 s. lD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
# `3 l3 S4 b( p; {5 V( F* d7 IE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
: [& v! O% W+ U( i) H( ?$ B
) c" u0 l& O' e0 I3 {6 a$ W+ B; Z7 F$ v0 ^1 \, z
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
0 X8 X) C" O/ z( [
( x8 O' ~/ f! w, e; J  k* T) _答案:____________
$ x: N0 b) s+ B' p/ L- ^  s( E0 W+ B9 v4 F7 c! X/ @, |/ ^4 ]
! ~+ K3 \1 d0 @( D* N
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
1 F1 ]9 A( ?9 ~7 [: d
, f' a# X+ b6 v3 }7 EA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
. c& u, N# u7 z: HB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片6 ], `0 A5 ]" y* |
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
. v0 c% N0 c" W" a# bD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
5 J6 u4 ^( D0 Y: ZE.只有一个答案正确
5 ~( ?2 L% B/ ~8 x4 p6 n3 H6 w# o/ e* V# L0 g$ u, E! R% ?( w

- `8 Z7 O) |3 H; @. D6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
: e2 R; E3 g2 z7 M. f6 w6 X0 _6 B
+ Q' r3 b5 Q. \A.从UNIX或Windows/Novell发送邮件时都会用到
( r  j, G* m9 D" e, u* F2 fB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
; ^% P% u( e; b8 c( B" A6 OC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时: z  N) y  V7 H# a! |2 P7 F& X
D.PHP里用不到这个参数# Z3 F8 v$ x2 S& q5 r
& W( ~# _  y# ?; c

* X+ \. k3 B7 p7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?1 G. Q. I- Y& ]/ l# ?3 |

+ {8 |* S# f  X' v; zA.只有在发送非普通文本(ASCII)数据时& |* y3 w7 S$ D
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
2 `5 @8 U  W* g7 G* AC.任何时候都可以用它来指出MIME的编码类型9 M, F" y3 o/ D& L; A  o
D.只能用来指定特殊的编码格式(例如base64)
# J: u7 G+ Q% U/ o, E% y6 C" HE.以上都不对. H  D; ~3 v* {( l: R
7 h- f( E0 q  Z- {/ ]: b
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)9 C/ o" I4 _7 u  ^" a3 G* P- D' S

8 `; _2 I0 I, Y" zA.分隔符至少要8个字符' {) y# H: u% _, m( v$ V; J1 \
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)/ i9 m, W; c& P( Z0 o( n0 _
C.分隔符在MIME邮件中必须是独一无二的; a8 C* o9 E- |+ T+ G2 F2 G
D.分隔符不能嵌套的其他分隔符中+ H) Z6 O: b+ M3 g! ?" Q
E.用什么做分隔符都无所谓
6 J0 d  y: V" Z5 f9 K
; z. f8 B) {2 B& S6 j# V! N6 Q/ l1 b3 _
9.考虑如下E-Mail:
) M' T9 o- d$ o! b- _& Z
( d0 X- x# z0 q* v) MFrom: John Coggeshall <john@php.net>) ^/ n: }) B  ^* [. Y( d( z
To: Joe User <joe@example.comt>1 P1 ?4 l) k. h' f
Subject: Hello from John!9 ?; _. p+ n' e+ e, l3 [% }* [
Date: Wed, 20 Dec 2004 20:18:47 -0400
9 u- B! Q7 p& w! {Message-ID: <1234@local.machine.example>+ _+ T0 B4 F1 p, ~) t% c7 h! V# R
Hello, How are you?
( K( L3 }: ^& H% y8 j( d5 v' T2 ~0 U( R3 E! I
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择): q& W0 G2 E4 R& A- {% P* }

1 i/ D5 b$ X8 x4 {9 Z# W. t$ p6 zA.MIME-Version4 w& r, B$ \  c7 _2 I) A3 A& ?
B.Content-Disposition
* o0 N1 V: {- ~* g+ Z/ a1 \1 jC.Content-Type
3 |9 ]4 |7 r) j8 s) LD.Content-Transfer-Encoding
0 v( X- P& F& _7 @1 r6 z7 jE.Content-ID! o7 v- |7 x. L) ~: S

6 n- d/ j1 M/ L5 H& E4 l( {* K( S+ m1 f
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?0 A  T8 c3 m; H3 W( o9 Y

- K5 E) L3 j2 k, e" O) RA.multipart/mixed( ?, b7 H4 e. O% x
B.multipart/alternative; s7 H# N: s$ f% u! U' [
C.multipart/default
6 ^4 q6 _$ t, S, z) aD.multipart/related
5 M$ ~$ \4 R" [% H% D8 q+ jE.不可能用content-type实现) H$ G# v( F3 J8 M

, H  e0 R7 i  O+ y
* P  K" M1 p% T, a/ z+ h. Q2 v( Q2 v11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?  Z* |. Q2 ~9 e8 C7 N' R# m( y
9 N" ^% ]/ F! z! M! q
A.安装sendmail服务器
% J; i1 `$ v' d; V" lB.安装Microsoft Exchange' S2 `/ ~; o: H: ?8 }: w* c2 B
C.在你的电脑上安装任何一种邮件服务器
; M6 V8 J; \' D$ zD.改变php.ini的设置' G; b2 @* [1 r+ m: x$ p
E.写一个连接公共电子邮件服务器的脚本# B6 ?& m  O5 L6 b& O

* |0 s/ o+ B# t: X$ k& @' n) x6 _5 K& \: t
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)1 m7 G. w7 T8 t8 F1 I$ k1 ?
% I. R0 C5 L6 V1 a
A.使用GET方式传值
2 R$ t, v" b, lB.用htmlentities()处理电子邮件地址
" H/ N2 f3 K5 f0 W2 j% sC.使用POST方式传值0 h1 {- a. B7 B5 f, e0 r  Y
D.用htmlentities()处理邮件正文
4 @+ o2 T/ X! b) n7 U0 k: lE.确保填写邮件地址的文本域不能有换行符
; u' x2 F# Z" Z. k$ |0 W( R- J! ?
. v2 \$ b' u1 Z' I" V" m- J4 S5 k4 j5 \- M) s. |7 e- u5 S  U
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
6 u0 |3 M9 n1 x6 ?& W1 F, y. n+ v3 D; s
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
# M+ o5 _- j( r1 r* G  f" E  BB.把它存在文件中,并用base64_encode()进行编码; d% i  \- m% l) l
C.用serialize()把它转换成数组
: b% ]3 w+ x, v6 {0 OD.用serialize()把它转换成数组,再用base64_encode()进行编码0 I8 W  r) \5 y" C
E.把它存在文件中,再用convert_uuencode()进行编码! Z9 t* O: c4 P. S% Y

6 _0 `& \& y5 V4 n) r( b
" C( y  [+ {' }14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
- ^# ?% z+ n$ [; L1 h# S
% d1 Y( H% g2 F  SA.堆一个检测脚本出来
, J& n" P3 I% P! r3 |! tB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型9 a7 V7 ~+ K3 H- _
C.写一个识别文件MIME类型与内容是否相符的函数
- _2 n6 Y. ?: n8 m; f$ ^9 ZD.使用mime_content_type函数
8 ]% d2 V' c. [; S+ m1 b+ J6 R/ J  zE.把文件上传到外部服务器上
3 k+ \' q/ u: k- k) h$ m' f) M) l! P
& Y! D) y! f1 Q' z- u$ b
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
5 S2 ?' J2 d) d, p+ U6 r' |3 b$ @6 h$ b8 ^3 z
A.添加一个From头信息
3 V( E9 c+ E7 z0 j* nB.使用-f参数
* v( n# K& M' nC.添加一个Reply-to的头信息
1 }$ ^# `% q  i9 D/ ND.确保运行Apache的用户有修改sendmail设置的权利
/ ?. `3 T4 N9 f# fE.确保Apache在root用户下运行
$ T8 g: K9 S. S答案速查5 E2 c: h! E. T# S; H, N
1:D/ U  t5 e: D- O' o$ b; @7 R2 a
2:AD
, I4 N. O/ |) Y% V0 `, o3:E- L4 A- E% T7 y
4:Content-Type:MIME' M" T+ l+ @* |- K: k
5:BC
  R1 j  x/ Z) H# z( `/ D6:A4 H  y6 h$ k) u# H: I$ I! @
7:C+ I: `; ~! W& i& q
8:BCE
1 S" v" u9 ?! {! M7 z9:ACD. J* f; A1 d4 T! a
10:B
; q- g% w9 m7 E  Y11:D- P. |0 z" [! I  E! F/ ]# K- U+ w+ M0 u
12:CE
# W/ p: |; ?1 s1 F9 n; @  A$ k13:D
5 y" l. `0 L- ]2 S2 [8 k14:D) H. q6 D) u5 n
15:ABD8 f% |% {8 _5 `2 E' a* R
% u9 ?7 x  r6 V3 ?; J# n( v
5 X$ y+ _+ P# ^4 C+ D
) P0 g5 ^; F( g5 N
答案详解
: i. z: X% p: ]( a  ?8 s" C
% b7 B5 j" x, G% o5 b1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。8 q" S; ~" O' z% \& q3 g5 w
8 N4 z; }, `! `) |% c2 N
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
$ j4 y' ]5 b& t, d1 P. H9 }  r4 L: I# J- H' [* T
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。6 ~% \. O5 d0 d  [& `. C

6 q" [7 K" k" L, k: J: W! I4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
" S2 q/ N" Y) ^( x. g
0 M1 p! w1 N  h0 i) Q* O0 w3 h5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
. H2 h7 x4 O, @2 l1 s5 s6 r, E* U1 ?4 O) B. R/ K, r
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。4 A- N6 }6 S, q6 t; n  r( }
) y, N+ d$ ^8 u$ V( y; d4 M: f9 g
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。" d$ y' Y& W9 P& h
) {4 d4 O) j4 T- L' K
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
; r1 |, L& K9 b& [; E+ Y6 k9 Z0 b( T
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
6 N6 c5 R8 }7 |: d0 _* a8 e/ R
; r/ y) ]) ~7 n3 t  n& K( r" d  L10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。: I- ~# L( E! [( w5 b
& c- O& \& v- C, `5 G
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。- @& j, u; u- o) e0 l
/ I+ h7 {6 K/ |5 k7 d: L! y
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
* s& M" R" Q* @/ z" i- h: M- k2 }, f% q7 q- A. d; C
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。/ x" `3 R: R! a7 ?/ y$ V- k
" c1 ~& v# Q& \# c* R
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。9 ?& _7 I! N" f- N4 p4 c* j- A

# z, E- m, k6 D0 }% g% A# u! B; [$ |- A15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

返回列表
【捌玖网络】已经运行: