Board logo

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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。1 W$ c+ j8 W1 C- A% W5 n) i9 [
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。% j+ m5 a8 _( J5 `/ Y: l- d
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。, ]1 e  m6 g- w+ R8 @
" c; {* B# V% J1 R3 t
+ w" [6 I' D! D- G$ P, P/ `
问题
7 a, u1 u6 D3 h& K! n# Q- a) ?; O
1.以下哪个不是合法的电子邮件地址?3 W/ {% W2 P$ W4 i

" c9 a4 C$ {/ c) x9 fA.john@89w.org( S3 Q" B2 g" U6 q* z3 Y& X$ v2 x
B."John Coggeshall" <someone@89w.org>
* e2 n4 F. p( R3 F( J0 ~1 HC.joe @ 89w.org9 @% z, }* ^$ s
D.jean-cóggeshall@89w.org
0 Q  j* W/ a( H  x9 d& LE.john
$ e7 ~* l8 C6 t/ e& ~+ o, _. E  z
+ G' `. \: {* ^+ P
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)8 L! [* o7 |/ H6 u6 z# m

) |$ I5 Y1 c2 F7 _, v, o/ wA.Windows/Novell不需要第三方软件的支持就能实现该功能0 U' s. T' _9 F1 s3 {- Q8 ~
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。8 k! K$ o9 J9 s; E
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
5 Y3 M+ [; u+ [( G; xD.有可能完全相同,这取决于sendmail_path的配置* \. v- e6 o" d4 _5 ^% i
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
3 ~% j9 N" e' D$ u1 |( ~6 _
+ Q' \/ X( u* \; \' n& v
/ d+ t0 B" ?/ `3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?# E8 I+ M6 E" M- I( @( i
6 F$ _' z6 M) `% ]8 g  O9 z
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
2 D3 b( E( Y8 ^4 H& J* AB.用PHP代码,通过SMTP直接与MTA连接。* z* P) i6 g# x) }; i1 W
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。, |# n0 a& i' ^7 K
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。2 ^" Q$ k6 x2 B- z
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
- ?( v7 F* q6 Y) j- ?, Z8 N, Q
/ m4 Q+ Y) E; I( V' `% r. I5 H$ b
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?1 L( Z3 D& z: _( ^! F- b9 u6 {- E/ l1 X
7 a7 j/ I3 d8 m8 v3 }! a
答案:____________
3 J- A" E/ B/ O3 ?7 W
0 i  |% ^* P6 l0 ?9 p% |3 t$ c/ o# P! P4 j4 |2 v0 ^5 k
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选). h& z7 c. V; A! g3 K9 f
3 f0 q- g& a1 C1 @! k$ O% \
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
! G; h# G6 L/ V; ~B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片: s/ D  c7 s0 D
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID% s1 i6 Q! G; g# B8 j! K
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
8 x" `( P$ w' F8 l9 K( gE.只有一个答案正确
7 F+ I4 p* d1 c
( z; ?8 g( d# a
7 l/ W1 P# H' y# h2 Z: Q6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
2 E$ k- @; `3 x/ d
. G* N8 H8 }# m+ r' S5 \4 qA.从UNIX或Windows/Novell发送邮件时都会用到
0 y# D" i+ K" @( h: }( l3 TB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
7 k$ e" ]+ r. g- zC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
; a+ C$ ]3 Y- ID.PHP里用不到这个参数
& ^* e& b8 L4 Z  x
6 m' V5 f- g3 f; @9 y1 U8 H2 ?' T$ m% ^, D# e" p
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
$ a5 g0 P/ v* i" P5 B. M  U2 D7 P: e% P$ P" G. [
A.只有在发送非普通文本(ASCII)数据时* F3 _9 Z2 W* {3 p
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text), |6 O& A* b; n! e
C.任何时候都可以用它来指出MIME的编码类型
6 ^6 x' O8 z4 W' g5 |6 H! yD.只能用来指定特殊的编码格式(例如base64)
2 R5 |1 I5 @4 n3 g$ UE.以上都不对. R8 n' J, I7 h4 ~6 }

$ |( _2 N3 D  S& T1 a8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
2 U8 g& w8 i- i% i6 c# ^0 }
& J2 l/ C. R. T( f/ e5 _& ]( qA.分隔符至少要8个字符
5 h" q8 J5 H" G9 lB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
4 W( y$ @5 h$ GC.分隔符在MIME邮件中必须是独一无二的# G- G, G7 V" }2 J5 \
D.分隔符不能嵌套的其他分隔符中
5 C2 o9 j- y4 N: E& i" _E.用什么做分隔符都无所谓* ^) z, M3 h' c8 f6 S* [) M0 p$ z
% R  J$ o/ R5 w& |/ ~: t

2 u2 _# O6 u" n. v9.考虑如下E-Mail:
" O/ E- G8 I7 y. F. W' ]; o# P6 l/ n6 n' @' c3 V6 T5 s
From: John Coggeshall <john@php.net>
, Q- E: e/ z$ x/ gTo: Joe User <joe@example.comt>/ q2 g) X9 F/ r. R9 q
Subject: Hello from John!
; U2 t( g# X: A! UDate: Wed, 20 Dec 2004 20:18:47 -0400# v" R0 Q  P9 @3 u" V3 j( D/ l# y
Message-ID: <1234@local.machine.example>/ l+ n( r  @/ A  z1 L0 E7 z
Hello, How are you?& L  [5 V. J7 R3 {) a
0 b% O1 W: S" S$ M7 k% Q# v" R
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择); `( z5 h6 B" a4 @' B2 V; e

, j( ^1 L+ W- r9 j+ k' `A.MIME-Version) C1 \. u* ^6 c( Z! w% p. c- C
B.Content-Disposition
3 F8 m' {, X- x0 w; H8 hC.Content-Type
% A2 U; Z1 _9 z9 t. u) N. QD.Content-Transfer-Encoding
; C' [/ Z8 l' t( BE.Content-ID
! {# v% j1 k  ?5 F( a+ f3 B# z8 R1 D
; D  `# M% m6 ^( d2 ~& F; ~& @
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?! r4 G7 W- d, R; K; Y
& E. f  ^5 i9 J$ K8 z- b
A.multipart/mixed
& O" j/ c' d, j) x" c9 F9 R5 UB.multipart/alternative$ B/ X! F0 @8 @9 [/ c, E2 ]
C.multipart/default
4 s# D% |* H1 l$ t, yD.multipart/related
6 c5 b, b. q( WE.不可能用content-type实现  u/ y+ l7 ]6 M- y4 Z

, l' x: [1 |9 W. ]$ z7 L+ B
: F6 i) s! ?; ^4 c4 A$ e* O11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?3 M2 h9 L7 e  n2 u* [0 [

5 E# J- w2 O8 F& Y; I. hA.安装sendmail服务器
: ]& L" c- o, F9 a9 EB.安装Microsoft Exchange
3 L3 g' w: F( a2 B3 V, ^# G- fC.在你的电脑上安装任何一种邮件服务器2 v- h6 }; G/ V& X2 h  h! w
D.改变php.ini的设置
8 S; X9 F) ]+ n1 |E.写一个连接公共电子邮件服务器的脚本; v# {3 D; F4 ~# h) ?1 U

' G( ?0 ^- O4 s0 `* Z% H: f) f3 v$ ]9 v. i7 Z8 y( Q6 m
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
( A. C1 D" g7 r' c/ [! u4 C9 q- V7 Q8 U( E  x
A.使用GET方式传值/ ^. K% F! N) L4 `5 Q
B.用htmlentities()处理电子邮件地址& q/ c) n/ r  ~* p: N# j
C.使用POST方式传值, Z0 Y, [; d9 S
D.用htmlentities()处理邮件正文
. M6 {2 l5 Q* Z2 b$ q1 \, [! E, `E.确保填写邮件地址的文本域不能有换行符( S4 B' B1 V/ v  _
' `+ n3 M# u' b- S+ H+ g& ~5 k, @+ j

8 e# g+ i5 s) z13.如何将一个数组作为附件发送,并要能在接收后重新组合?' d1 {. L$ Z  z, d; ?* C9 ]* Q& ?
" t: d) m8 I3 W, ~" W" T- {! ?
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
- ]3 k8 h  M1 [& Q/ Y  q9 eB.把它存在文件中,并用base64_encode()进行编码! J2 C$ A. Z6 h, }" f( D+ a
C.用serialize()把它转换成数组, Q" W" y6 E  e5 |9 r
D.用serialize()把它转换成数组,再用base64_encode()进行编码- z3 f0 ^$ _0 s5 w7 n
E.把它存在文件中,再用convert_uuencode()进行编码
. M6 [5 ?! |* ~8 c# ]* S; x- u& C  H% a( N2 b6 V' Q& I4 m

. c+ G5 d8 |* `5 z3 e14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?" j; H& ]. T/ U9 I

. u! L& O6 l4 \! `' U$ i0 vA.堆一个检测脚本出来
, S4 n( ?# y* N9 sB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
6 _7 T$ w5 x. l3 T6 w  A& yC.写一个识别文件MIME类型与内容是否相符的函数3 n) {; O9 H' J/ r5 r% ^
D.使用mime_content_type函数
( I0 q: i7 f. c' B6 T* S( M" KE.把文件上传到外部服务器上
0 y, l( e, k8 T' @! T
/ S% j0 j6 }$ w. L- X0 A( u1 K) a# i, e% ^# F8 j+ i. t- i# u5 W
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
8 Q9 Z" u% Q3 g/ ?9 l
% O& ?  s: H$ a& fA.添加一个From头信息. Y! {  k$ K( p& e9 n/ b
B.使用-f参数
, a4 v1 }/ }' I3 RC.添加一个Reply-to的头信息
! |' Z8 b" {2 ?9 ?9 {% eD.确保运行Apache的用户有修改sendmail设置的权利
1 n% q7 g$ o' ?  o* O& \E.确保Apache在root用户下运行0 Q6 t% E* o0 q' M
答案速查- B) i, X! p' y- e* a& W' k3 }
1:D7 @0 F2 Q  L( X1 e
2:AD
# @: g9 e2 |+ C! F! h. |2 Y# d5 r3:E
3 `% j/ r6 J, \% ~6 d) V3 H* F4:Content-Type:MIME
, U- M, V( Q0 W2 g1 l5:BC4 b& b0 I! o& p& _
6:A
( @; L" v0 d( [7:C% I+ f6 _# N' ]; O, J
8:BCE+ B* s4 z/ ?# y$ W( Z
9:ACD
, c( i) h# {; n4 a$ d10:B
  F9 Y9 J- i1 p- F) S11:D1 W! m" J0 t$ e" G# O7 S
12:CE
4 F# @9 k) j, C( `13:D
+ |! ?# u, O1 c, A0 t/ Z" x( U; L1 v14:D& }0 G0 I" Y' ]! U$ ^8 _
15:ABD( k0 Q# u$ H% x2 L

# d% q# O  F$ u  a: }( [  G0 H8 b! p+ @) w! R

3 P( h$ ~: u# j  {: X答案详解
/ B7 Z8 l0 {2 g7 Z7 A' t& E6 X5 t6 h6 c3 \& f
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
9 U1 E  s5 ]- d& s( {: ]9 K% U0 H* [  u3 i: W( r* e
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
2 k' h  b0 [$ j# h5 r% _5 n
5 k1 x/ z' i3 y3 A4 Y( q2 Z1 H3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
" T/ F3 V9 ~# b% c- P& a0 s
" ]; r. T4 g4 o& o+ F4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
: j% ^) l. v  r' Q6 L( N8 T
7 K  e: O* x3 F2 o0 N) o5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。# I* c1 h( H- u" _* ^

. S, I8 r/ T1 ?  |& f$ b$ N" a6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
/ u4 x" x! J2 I& W- Q& C7 n3 a' A& O! e& z/ W0 i
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。" d7 `9 g  F1 m2 R6 B

% B6 }, J& k6 H( h5 [- V0 L8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。3 ^6 `2 z" R+ `7 ^6 u# g9 T
+ x3 j* Q7 E" U
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。. Q' k9 L. f0 {- u
( v2 y  z1 i0 e. U4 J# w+ E3 D1 p
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。! }# r2 R! i- I- o7 U
, v  k3 F% I$ }. s1 |% l7 [$ z
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
7 C0 b1 T; ?) f, {: ]4 u  p
! E& V( X+ a3 _. L. H) P12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。) ^% y  r3 P2 _9 U" p4 I
( k, A$ B/ B" u: `$ Y
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。+ P6 w8 m7 F- o' l% f" Y! w
' w7 c) x: Z* z* L+ M
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
9 _1 M6 {2 D5 n. I: `5 `9 ~4 T  I7 F2 v0 x% c- A
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




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