Board logo

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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。" K: d2 l" E$ L$ {- |
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。1 S$ K- @( I( @2 a+ u/ a  M7 \
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。, k8 E4 q( L/ U7 b. h. D0 [

. Y, P) @9 M/ x7 F0 F
$ K- R& M3 J! i1 P问题( u; ]0 Y2 \& l7 g- @/ w
$ l4 n1 ?' o& P6 i7 U  ~
1.以下哪个不是合法的电子邮件地址?
1 n) L/ N; _. E) M8 L+ b5 f5 E: \4 C, Q! Q) W$ Q
A.john@89w.org
3 a% G0 S7 z8 EB."John Coggeshall" <someone@89w.org>
$ S7 S, I1 u+ A+ G$ UC.joe @ 89w.org. g. e: S- w' b& w0 {1 v& z
D.jean-cóggeshall@89w.org
, d0 n* }8 ~  z# ]7 V  o/ \E.john; D% \% o) d7 T, O' q9 A

4 d& G. a  O  l3 P& Z; S  \& _# b8 ?4 M
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)+ c" H2 d; ~, |; P/ v- M

" i* G3 r6 F. q' NA.Windows/Novell不需要第三方软件的支持就能实现该功能! k5 `' [. [: y8 l
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
5 x2 i  e1 m. E1 P/ g( X3 C* wC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
$ I9 \* h. Y# o: m$ ~D.有可能完全相同,这取决于sendmail_path的配置+ X& g$ y; I1 b0 J/ r4 x
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口* b; [! V8 b6 X: U6 }

' c3 l& p2 x3 `7 ]: K
& Y5 z* y# o6 _8 C, E3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
! v; ~5 W+ ?) i- a6 T! i& ]7 B, l, ]
3 U$ u$ g+ x1 b0 n* n% V. GA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数7 Y+ i7 ^) {; W& a
B.用PHP代码,通过SMTP直接与MTA连接。
7 C6 B# K% x/ t: vC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
2 b) h! J7 U5 f4 d6 D7 o9 o+ G; lD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。- N5 l, |( I  b! {
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾0 i5 y0 A# ]7 H9 K7 i# \7 |3 d

5 R" |2 d3 I8 ~; l
, `1 L& {) O* o5 e: H0 H3 T4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?' v( S/ f( O( [( }

8 j' n8 V! B7 P- t* n' W答案:____________: S/ D4 z3 U7 Y, l3 n" E% N
  ^4 }' x$ N8 e+ C8 E7 u

  S  h) c8 V, [# ~5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
5 S! B( C  j2 ^( a) W5 g* D, k8 c1 U7 j1 G, q. o8 u
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
+ H& j( ?# a# T4 o/ wB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片4 ?- k3 Y% q( a1 L
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID0 c  P1 [/ X; i, T! d% B% ^
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名5 Y+ S( w: a" v4 E2 ?. ^# n
E.只有一个答案正确
) C' O& O9 N$ _
& }9 W( {- f+ ^) D, X* K4 k( T6 }( l+ [3 g- ?3 N$ `7 i
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?1 q( E, U: p' Q
4 Y/ s) z, y( N2 a* Q
A.从UNIX或Windows/Novell发送邮件时都会用到/ G% L5 ]+ F( H( X+ N, Z8 g. P
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
- q( L" G5 M  R! T. T" g( y4 i+ FC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时: T  ^) r6 F$ ^
D.PHP里用不到这个参数7 ~" a. r( t- ]! s
% K3 j1 W; H7 c4 P8 H; q
6 R: b( Q) w" C9 o0 {( k
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
+ \5 @  m1 F  H# ]; G. D& F) K/ p: r# w' b
A.只有在发送非普通文本(ASCII)数据时
4 l) ^  q2 R2 I/ }  |B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)4 d- e! H- _% K* L: V  D; W! ^9 W7 P" l
C.任何时候都可以用它来指出MIME的编码类型9 [- y+ M2 C% n
D.只能用来指定特殊的编码格式(例如base64)+ `  ?* Y1 r- w4 d" S4 Y0 t5 i% @4 }" t* C
E.以上都不对, e# F; q$ |& L- Z
+ R' p5 b7 \4 K  T
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
* Q, p! }0 o, ]6 M1 r% m! e+ s: w  b& b
A.分隔符至少要8个字符
/ d) M8 u0 w3 T* s6 nB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)6 H# v) y9 ~3 B& E/ R6 f+ f
C.分隔符在MIME邮件中必须是独一无二的# c" Z0 v3 K: v. T+ @) n3 K3 c# x
D.分隔符不能嵌套的其他分隔符中
/ E( H* m, @9 E! r' @% {4 B1 _4 d' n/ RE.用什么做分隔符都无所谓
) a4 j8 w5 \1 o  \- Q' s- Z: o$ V. F8 @9 H3 h, I+ e* m

8 l' W, o* x9 c9 b, _# q9.考虑如下E-Mail:
. z9 @+ X; Y6 A0 C5 }/ o: l- Q3 |' T0 ^( d( Q5 P( ?
From: John Coggeshall <john@php.net>
; x$ F' [0 d) }* sTo: Joe User <joe@example.comt>
. D6 s6 h7 h4 uSubject: Hello from John!' U. H) D# T! u/ k$ X3 N
Date: Wed, 20 Dec 2004 20:18:47 -0400
( r6 e1 z1 F3 K. r7 x) n* ZMessage-ID: <1234@local.machine.example>( s& }: I4 O8 j( I4 m- R6 ]' u
Hello, How are you?3 v8 z  u" `# ^7 E5 X: B2 i

; Y3 p) |+ T2 {' t- Y在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)7 b+ k4 @; g! `0 H: B1 _
0 p  b  u# `% q+ k) c
A.MIME-Version  o4 G4 O" N3 o) e  V
B.Content-Disposition* E( |' |& g9 [; N& ?8 \
C.Content-Type- n/ Q* m: W) G' d
D.Content-Transfer-Encoding
, j6 \& X$ k9 b0 R# T& v: YE.Content-ID4 C0 X; j- G" e' Z) w! K$ \
7 U% \+ X! s$ b% L  b% U
& }4 t, Q' Y8 ?4 N
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
! V  `2 c2 \+ \* e' V9 E% g1 t9 F) X
A.multipart/mixed, \# I. ~! H* o% F! @$ x! A
B.multipart/alternative
+ h/ L0 x( p! _: T3 M' J8 lC.multipart/default
4 L( m5 w8 S" N! r. W3 ?; R9 `D.multipart/related5 v& f1 L: T5 `; a5 C4 y$ ?/ i" v
E.不可能用content-type实现
# S; [6 I7 N8 }$ [  t, G
2 @5 b! ^3 ~2 E4 @4 i
+ Y+ e5 K9 N% X. d5 W# Q6 t11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
6 J- P3 ~) ]# Z) a; M
# r6 e0 S( V0 M+ P$ u  ]A.安装sendmail服务器  G: ^, I! K0 f1 Z* P  ^
B.安装Microsoft Exchange
: a  z( C; q2 U/ \0 XC.在你的电脑上安装任何一种邮件服务器) S' O) f# l  }( W3 s& B
D.改变php.ini的设置
8 D3 j6 s; A( R) D: [. jE.写一个连接公共电子邮件服务器的脚本
% o* h, o0 _% a  m
9 ~0 M) L8 B5 ]( A% ~6 j) M6 |) O9 B6 J8 D. u: B
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
3 e* e; o& O% J# M8 s/ o" i  U0 E
8 {5 H$ M, T3 w4 {A.使用GET方式传值8 s$ X. D$ Y( |5 y. J
B.用htmlentities()处理电子邮件地址9 b/ k% f" T0 i
C.使用POST方式传值
8 U  H% L& S. {6 ?6 E5 tD.用htmlentities()处理邮件正文" D7 d9 D( M+ x/ d) R
E.确保填写邮件地址的文本域不能有换行符% Q# \4 Z8 M( X0 b+ k

- ?' ?  s+ m" V& _
; i# L4 y3 w: W! H' H13.如何将一个数组作为附件发送,并要能在接收后重新组合?
. e2 I3 n9 c6 y  C+ ^  B- G' o% L/ Z. o9 y
A.用serialize()把它转换成字符串,再用htmlentities()处理一下1 C' M/ Z1 R$ N' {. X8 n
B.把它存在文件中,并用base64_encode()进行编码
" h! n  }" m. R1 h8 P# E' kC.用serialize()把它转换成数组6 c0 D+ _& N3 }% t5 H/ v; f1 D
D.用serialize()把它转换成数组,再用base64_encode()进行编码
" u* b. f/ M9 W$ ?E.把它存在文件中,再用convert_uuencode()进行编码2 t+ E8 M* Q* ~7 L

- j- W, H5 G* |+ \( K. y
* N3 C2 a6 h/ j# e5 b2 l14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?7 ~" C3 o) e# A) H

! y' P9 M: Q7 s6 b0 Z5 dA.堆一个检测脚本出来
& o: B# P+ j# p# [0 B* T2 lB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型2 }) q3 G2 f& e/ ?8 |/ Y
C.写一个识别文件MIME类型与内容是否相符的函数
: ?- d8 y, u. ~5 U5 d; {& W6 @: dD.使用mime_content_type函数; r) N" e( _. \5 ~& D# J2 @3 S
E.把文件上传到外部服务器上
7 p6 b9 z6 n8 L9 D) D
: c) y& M) l; S9 n( B; \4 X5 P! G: S+ q; g& L. Y& `  j# O+ Z6 M
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)' r  p8 y" b6 n. K4 @

' P; u1 J6 d2 ~/ b* u# E5 T0 J+ QA.添加一个From头信息0 }& F1 e, K1 f) H
B.使用-f参数
: F* H4 _' H+ Q' H0 W6 _3 s1 d8 r4 ^C.添加一个Reply-to的头信息
- b1 y6 t$ t% N- `, `2 _8 e  I" ND.确保运行Apache的用户有修改sendmail设置的权利1 d2 J/ f5 b7 M* d, U8 H! ~2 ?! Z( {4 Q
E.确保Apache在root用户下运行
1 M* N( k; K; Z+ d' ^# Y; V0 ?; h' A3 r答案速查
8 J0 b9 F: X' L- k3 b2 z' a- \1:D* m' o" r# X: I2 L
2:AD3 ^: b# Y& K' k3 P
3:E
: Z% I& x% z- A$ [4:Content-Type:MIME
; E. a& t4 w* e4 {8 Y$ m5:BC" I4 K! c7 a& ?& ^2 N$ h# Z# o" x
6:A. y9 b. I- M( K2 |* r5 g
7:C
, d9 S/ b  n0 F8:BCE
+ f- l1 }6 s/ N9 X$ x. L; V; p9:ACD5 j* G2 l, U7 g
10:B* A! c/ c7 i/ }4 M" f6 d- n
11:D
! D- ?3 k  ~1 j' z4 U7 e12:CE  b$ E% l; K1 }' ?
13:D
7 x: b& t0 C1 P14:D
% L4 K" z% T2 D) I3 I! |15:ABD
& K8 E+ `+ M+ ~4 M+ M$ `0 H: e) w; J) S6 _9 \/ |

) F2 C  u% Q1 _/ `. G, {( m$ j" B; H8 c: T& l1 J
答案详解  e. E6 L: s; [5 Y& m
1 E& P' o& d0 |$ l, p
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。+ d& y. X1 G  D  ~' ~' t& W" D! F( J

8 J/ d! l) _% U3 ?. t6 Q" E2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。8 A5 {6 Q% \8 `, X3 S. U  |
# J- F, \' D9 U, W1 [
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
! f' j" }8 C) e; }$ C
2 d* c( T' a* j% D% s" d; d6 C# }$ z4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
. f0 W/ U0 n$ p  B  p4 M; k% q: ?* w, z" s% l8 ~
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。5 J9 n4 Y+ H+ x5 l7 @2 ^
; a5 X7 w5 ?* m: ?, D
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。, }) F  ?, ~3 H/ Z+ ?2 G

% b4 ?/ G$ S" J6 n% `7 L7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
& ^+ {7 H* ]/ M5 ]; H( x
+ S) [' R- @6 I. [& H* H8 n% Z, x9 ^; W8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。  u3 j( }- ~  C# C& o- L

5 b) t* Q- @: w5 u, w9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。& o7 f: P! `& e

, Z& a: y. a, f% r/ l' J/ t  l10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。! K& v+ G9 _3 |3 L
8 a- N9 p( E. H$ U2 h4 X
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。, R0 L# l" [. `0 ?' D: K
) T0 {# P6 H1 }: t' _
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。# ~7 O7 \( |6 E- }% L0 d9 a4 g

$ e* j: B& Z9 F13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
. c  ^1 K9 S5 [' H5 H7 r: [# E! T8 D- E' X) A2 O
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
3 @* c- c1 _  \1 d) I3 i! d' q" W" L0 Y4 [' j/ W/ L
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




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