Board logo

标题: [Zend权威认证试题讲解]第八章 - 处理电子邮件 [打印本页]

作者: admin    时间: 2008-4-4 02:46     标题: [Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。; ]4 F+ H* q0 \
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
. q( I5 ?4 G$ {+ v用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
* `9 P$ \) h) r( q7 s9 e
8 G3 M7 A- g! J+ x/ `9 m
/ ]5 W* }$ ~8 H) }问题
* a  i# c8 ]0 n$ H1 F: Q' D" N- ^' d. r5 ^
1.以下哪个不是合法的电子邮件地址?; M  @9 w9 R. G3 t: T1 L
6 f8 H6 F! n' {
A.john@89w.org1 q8 l- E6 X9 n/ |% t
B."John Coggeshall" <someone@89w.org>
; Y- o' I* w9 IC.joe @ 89w.org
8 `$ c" c& c+ \7 O9 XD.jean-cóggeshall@89w.org
$ ^. l; q8 Y: l: Y: ZE.john
8 I2 O% ~) T- n% x  J1 t3 j- m0 J3 @& X/ Z( @1 [

, |8 Q8 C, p/ D4 v( K6 n# W2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
0 ~- ]0 T) w2 W9 e/ i! a/ t% n8 k6 O$ s
A.Windows/Novell不需要第三方软件的支持就能实现该功能
* ?( v& Z% x6 `: C" v+ tB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。6 l. H$ e$ g( y, `7 z
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
6 E0 m8 T* _2 w2 e5 g* wD.有可能完全相同,这取决于sendmail_path的配置1 S6 r' G$ U# G; T0 L' m# {2 J4 }& y
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口% n. |9 C+ W: C( J! p/ b9 F
+ }$ \- K* u- s  q9 D: n

1 T$ t" i+ C& \% v' _' B# z" m3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
+ y0 |; X) P  [5 t( K8 Y: ]0 P
0 D9 h0 G- R) q* K* q" ^- [A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数1 r4 ^9 z  J- f6 e$ l4 t0 S
B.用PHP代码,通过SMTP直接与MTA连接。$ H1 l' U" ^: J8 s$ T8 ~! `
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。4 I4 Z; O, W: X6 T1 }5 T% a4 E
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
9 z  Q' x6 Y, _. u: k5 ~E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
" e. [% B' j4 w8 B! ~" |. Z. O# s
! G# q  D- c8 K* l' J: H* X
# N- R4 \3 S% P4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?" r" G! N8 O9 E2 ~7 a

- j' W  B5 @( J# F1 M. o答案:____________
8 q0 I( D, ]( d6 Y' B/ L$ g
1 }$ p1 t7 Z4 a0 ~" N5 e
8 q" g2 d# e# |# @5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
+ @" s. S# m- {' ]4 r' ~* P( B: n: o( m
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
9 f0 S# i7 ~# G* B0 AB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片4 J  [) v8 b4 }
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID+ u( Q0 Y7 W" R' ^# T7 W
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
2 \& n% ]; C5 I# w4 ME.只有一个答案正确/ E8 D# A5 D; V) _- H$ X* \& L

5 ]' G+ _) u4 \, N5 s! h  L3 Y, N, Z( n
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
5 ?' I; ^2 b, z2 T# y, |; a
$ @# U0 t! u3 u4 U- c$ NA.从UNIX或Windows/Novell发送邮件时都会用到/ ]/ }( X  F( C
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
" q% i. M0 {) c, X' X5 n& ZC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
( j7 J2 z( O( j- n! mD.PHP里用不到这个参数
/ B- ~& J& o% \9 A" H  F, I; R7 c1 C; U0 L
* I3 x" x$ Z3 f0 B7 ]
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
/ [8 N# J/ O- ^5 v9 }& m/ ?' G0 @0 m$ J* [) x3 z- B0 e- q0 N, \3 k
A.只有在发送非普通文本(ASCII)数据时
8 B5 r& N, X: gB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)( z$ z$ F$ {" k7 p" z
C.任何时候都可以用它来指出MIME的编码类型
8 a( {; w, G9 _, D+ g3 WD.只能用来指定特殊的编码格式(例如base64)
+ v/ V6 U4 t: o6 ~E.以上都不对
. }  y; n, Y- x5 O  c7 `
" ]7 Y+ U/ q8 u4 ^8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
% q$ q" [2 _; w& ?
* a$ Y8 ~9 U; h3 X. s1 EA.分隔符至少要8个字符
8 C. y/ I; O7 n6 I: hB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
! g; |1 F' p6 W! {# UC.分隔符在MIME邮件中必须是独一无二的' @+ u2 C$ T. y: m$ Y
D.分隔符不能嵌套的其他分隔符中
& E  O: o1 p: ~+ P  `/ T' tE.用什么做分隔符都无所谓! ]# v0 p$ i/ C$ T, v- f

6 v) `% V  ^5 _7 m0 F% g" D0 |  Z* H( }, b6 N! ?$ b, }
9.考虑如下E-Mail:
2 R( B' h7 T+ L! |. j/ D3 U
6 d1 }  o/ \- B( T8 QFrom: John Coggeshall <john@php.net>
+ n& ]5 l: X  J. c3 O3 rTo: Joe User <joe@example.comt>
$ `8 R: ^" X* e& W0 X+ T. g  cSubject: Hello from John!
* y! b% w" K( P7 Q% C8 YDate: Wed, 20 Dec 2004 20:18:47 -0400" w: ]2 r) ]1 C/ u8 M! s
Message-ID: <1234@local.machine.example>
0 Z- u% _: H1 p& v+ ~+ p8 fHello, How are you?' e5 \, C$ I9 N& d2 p
1 w, T# }8 A& S4 Q; S% n
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
, x) s" H- |' |, P1 T$ [( I/ P- S. |: y1 ~; ~* p$ _
A.MIME-Version
. w/ Z* T2 G/ D9 k# fB.Content-Disposition8 e- \; M) ^; v  B7 T
C.Content-Type
. _8 a1 V! d- g& z+ h2 w$ AD.Content-Transfer-Encoding5 u' t& f6 [- K& O, M& i. l" X
E.Content-ID* y" ]2 d2 m2 s4 ^0 T" D# [) Q
9 w3 ~& _; K( q; @5 U2 \. f. I& R

" l' f# ~2 H% l8 t; Q10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
! k) J$ q0 a% F  U7 z$ a( j
1 B! j0 K) e7 K4 {% S3 ]7 z" m- o# _A.multipart/mixed
" Y# X( A5 y6 tB.multipart/alternative
1 a: r- i* L/ pC.multipart/default
$ m, J8 z9 Y( D1 e3 G% S3 X4 h! oD.multipart/related
; y- j3 |: z# s5 }) pE.不可能用content-type实现
* J# h4 s& x$ q! C6 Y( _' p+ y
9 j* v3 Q3 J9 z4 \4 w  o# I: C% U* G1 T( b5 V  }$ C3 J9 S' {5 Q
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?7 O! N  L% a  S/ ~4 ?! ~
8 c% \$ F2 L* z; F# ]: ?
A.安装sendmail服务器7 h$ l  d3 J' C
B.安装Microsoft Exchange5 ]) i  V- i! \# U$ `
C.在你的电脑上安装任何一种邮件服务器
4 U+ n& L2 s) Z' {; K3 }D.改变php.ini的设置
" Y$ n' U: N# jE.写一个连接公共电子邮件服务器的脚本
" c! F6 j5 }+ m1 _2 d; }+ F
8 L' n" W, @3 d. R
3 C9 U; P4 p# q* k4 W% q% v3 k8 X$ `12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)4 _1 V8 `5 x4 m) c/ |  |, ~# b8 \

: x7 D; u: O. Y( K+ T: E4 YA.使用GET方式传值  N3 m( @1 y8 D: P, J0 ?
B.用htmlentities()处理电子邮件地址
+ m' m% W/ {" f" LC.使用POST方式传值7 r5 X" `1 \: Z. L0 ?- w3 @, y
D.用htmlentities()处理邮件正文+ A' g) h% s8 o+ R2 W+ E) B. i
E.确保填写邮件地址的文本域不能有换行符$ T0 J$ ?1 {, P/ }5 Y  T7 i
2 g) W- y2 u7 C- L/ i4 ~# C
- q3 C" g' i5 ~7 L: s$ G, h
13.如何将一个数组作为附件发送,并要能在接收后重新组合?( L) g" f$ S- K# S8 o: ?
8 W1 [% _4 v. z8 W
A.用serialize()把它转换成字符串,再用htmlentities()处理一下1 a( N3 V% h) e
B.把它存在文件中,并用base64_encode()进行编码
8 b" a: T+ q" i7 wC.用serialize()把它转换成数组4 ?+ U" [( i$ I
D.用serialize()把它转换成数组,再用base64_encode()进行编码
$ M; J0 f% `* b* l: ^3 @E.把它存在文件中,再用convert_uuencode()进行编码
5 \4 d4 W6 k- j* @& H. g' V$ H4 b4 O

0 }' B- k; ?5 m2 S4 f( z14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
" p) i& Y& _+ l4 F
' \8 }% J; L- i* y  p' `A.堆一个检测脚本出来
$ @* n) r4 J. s& @8 S: R) gB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
3 p6 Q5 S  G' IC.写一个识别文件MIME类型与内容是否相符的函数
, N3 W; ^6 J& U; w% {' C* m& jD.使用mime_content_type函数. Q3 Z" V" r% r5 c7 d" W0 ~7 \- X
E.把文件上传到外部服务器上2 {' E* v+ y& D6 l
/ Q2 {. i$ i: R. a+ N  f* p4 y
( }8 y0 ~8 z6 X2 M5 Q6 l8 |
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)" `( n! x/ h# R' h) P  B6 \
+ B+ u9 W# }2 D" H" k3 ~
A.添加一个From头信息
3 S: o( W1 g8 L% i* T! x. n, HB.使用-f参数, J) y% L- W/ S: C
C.添加一个Reply-to的头信息1 r& ?9 a8 a2 A# B$ ]5 R
D.确保运行Apache的用户有修改sendmail设置的权利
4 N! Y8 S  K9 \2 e" mE.确保Apache在root用户下运行  _! U1 A/ p: i! u- M, A& H
答案速查' c$ P  Y' K- r. ~
1:D
: k9 }2 l4 Z. _& s* P0 h; O2:AD1 Z( A4 |+ h5 W! W' z
3:E
) H: y( Q2 J/ G: F2 V- j% j4:Content-Type:MIME
# M) T$ {7 t& |, f, W6 i: L5:BC& K7 W, F) _! ?  G
6:A
( Z- P0 Q6 g4 f3 C7:C
9 V! Z( _4 S2 L& s0 ]8:BCE( n7 K# ^) _* \  d$ e
9:ACD$ n+ C5 D3 E1 Q2 M+ [8 \0 V5 e
10:B! \, D: C. T. k& Y. m
11:D
  Q; d0 b8 o) C0 j12:CE
% ^1 i: a; c0 B0 w3 M$ x4 B13:D
: o3 `. ?5 F  S14:D
( }& E+ w! d* A$ h, Y15:ABD1 T4 a$ A  ~" s( W' \: V

& M  u- k  j: o! c( Q6 u- a) T
4 Q9 G6 Z  {% ?- j6 e. x4 g# Y" F1 a0 |2 u4 A$ |" J4 P/ Z! ~
答案详解2 \( |* L% r8 E9 E- D$ e/ U6 Y
4 n9 f. d  ]" i/ O
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
4 s/ G' `/ u( Y  L, G" Z" ~8 r" n+ \
7 o% B( }9 h9 I1 ^6 [2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。8 f* r' z( z' U* q& X7 j! E/ S
0 B. F& ]( K% o# b4 e$ c+ ]
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
% C4 X) l( O! S8 t. V3 w6 G
' X( u- o7 D; _8 e3 q4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。+ V% M  W0 a3 O! S  a
9 w, ~" L* q3 k8 s5 z
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。0 K2 x" R" P; ?. q+ Z6 _

& |6 F$ w8 t. [* K: C' @: W( Q6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
8 {0 V$ i, |' O5 D) T# O' d
) b: q5 Y3 R& y9 @7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。9 e; R; A! U9 S+ V( w$ k

" h7 Q% U; e6 o# t: E9 G" B8 \& n. J8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。& y" |& I: }4 W, x8 b* ^& ~9 C; q. x
3 ^0 l; b# L4 d$ g! c+ D
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。0 i2 t# L! o0 [/ f+ Z* v. G
7 L9 \6 Y4 N5 L7 s" \) R+ @2 I
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。& y2 P' B+ z$ f% P

# Q$ n! n, O+ ]! p11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。3 Q6 v/ x, f) G( b

' F  K3 D4 g8 j# b! w4 H* n6 j12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。9 j9 o% X2 J! N% v% D9 A0 P2 ]
' p/ _2 Y, `. h; D1 ?& Z0 P
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
# M! m+ B3 n8 h6 B: \
8 Q5 \- L' H2 x3 C0 G# ^$ \14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。" d. h' `; F( W# k8 u2 M2 S
6 K6 G/ k$ r3 O
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2