Board logo

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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。0 A! \0 y7 S; Q1 z
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
8 i2 }& L$ d. y" x* K/ D4 Y用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。/ U' L7 C) D! x( v3 ?

9 G5 _! R3 M4 a
$ s% z& i( Z6 u) y问题
+ }; z3 }( t) L2 m
; e' F( z1 P' h$ O% h1.以下哪个不是合法的电子邮件地址?+ x- H/ L' ^6 @4 W) K

. K' f8 H* Z% p2 J5 e+ W% C( e1 R+ XA.john@89w.org, K. ^* _; y1 Z4 |0 q4 E$ H
B."John Coggeshall" <someone@89w.org>
: u5 s. i. Y$ r' U& V: QC.joe @ 89w.org
" ], J# H' I: L2 P/ U: G" g! ^D.jean-cóggeshall@89w.org- x- k* C. q% Q0 |3 x- U
E.john
2 G* a- F- O$ r( |) S" L8 k/ S. K4 g& B- u, n3 A9 f; J

- ^9 {' ?; r# M( \, n: z3 O4 W2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
$ e6 k; @1 ?% ]: v9 e
/ X1 n2 Z; U! h# _  jA.Windows/Novell不需要第三方软件的支持就能实现该功能; {( c0 D% F; D5 S( f
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
+ X& ^  L0 B2 }5 N3 h$ a* P  k6 n# B+ ?" oC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送% W9 l9 w- l6 ?- F, W3 E8 Y
D.有可能完全相同,这取决于sendmail_path的配置
: B2 f% r! F1 `7 g7 sE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口3 @3 H& n% C1 y- s: q  B+ u

% m1 M/ X8 E- M, `4 H6 F5 Y/ g
+ y' {" ]! }7 ]; o) G# T1 s3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
; q, n6 @9 o# ?: J7 z; s6 S# A( A, g) F' X
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
" G3 L3 x/ \4 [6 W& F8 cB.用PHP代码,通过SMTP直接与MTA连接。) _# D0 i% ?- c2 W: G
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
9 q7 j/ f% |: {- ^$ HD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。$ s4 o$ C! k% c4 T
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾- R( ?, ^& j- I  M3 c# U

, `( G+ n% W- Z- g7 Q( E3 O
+ E/ _7 e5 X2 C( `; [; I" E. l, ~4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
0 [! [3 @( l* }: ^9 ~$ ^
4 r4 c, M- n  c: A4 o答案:____________; ~$ L6 e0 f$ C
5 @$ |( f; d8 f6 f: `+ g8 j8 M" y3 [. J

1 o5 @4 y2 X/ |5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)0 |1 X" B; Z# T8 d0 ~- B/ F
1 D% H9 U1 F+ f# [) b$ D( B
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示2 c0 N4 G: S; P7 a; _
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
* g  A6 k6 ^" X* @  {( u; R2 i1 `C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID$ R. \7 R) S/ ^. x* F! v! Z( Z& X
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
4 n* y/ `* D0 ~, \: I- yE.只有一个答案正确' X% [. ^$ [  u9 A2 N2 P
# ?. n1 ]( Q, a; L9 N3 U

; G3 S' T0 A: O6 Z% y, p6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?6 G4 ~( |" D3 }* P0 u8 X+ A

1 g# o$ j) A% o1 D5 {A.从UNIX或Windows/Novell发送邮件时都会用到
; r+ F0 g$ F' t% x; e  n1 i, j4 iB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
3 s, O: X1 H; vC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
4 t# @# _8 h, l# h8 TD.PHP里用不到这个参数' R( J5 }/ _- ]) ~& N0 S  o
7 C; F, u' G6 I
& C1 o* l8 w0 K; G# O: F4 J
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?- a5 Q! N8 ^3 V8 k: V
9 F6 r5 s. I3 m( g
A.只有在发送非普通文本(ASCII)数据时7 P! v! H0 r; D, f2 Y
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)5 F& A# h- ~: |8 w: ?
C.任何时候都可以用它来指出MIME的编码类型
7 e7 z; j7 v2 l: f: Y9 B, q- @+ qD.只能用来指定特殊的编码格式(例如base64)- x* f( f! H1 N- q4 h
E.以上都不对
% w/ m( m  L1 z" E
3 t( y; \3 ]! o/ K+ L8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)3 l  E' y4 E5 l4 f  \" P
- V' P* L9 e1 S! B, u2 f% ^* ^
A.分隔符至少要8个字符
: J+ X' d+ R$ Y7 k. H- q8 bB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)% {' c! ]4 M5 {6 L% q
C.分隔符在MIME邮件中必须是独一无二的
% I7 g* e+ I0 L" N: {; ^9 D* @6 BD.分隔符不能嵌套的其他分隔符中7 W. A0 g  C) U; `8 k7 r
E.用什么做分隔符都无所谓2 q0 K4 E( O+ i- ]+ e# M

8 N5 K, h, @6 f& ?( z' _/ K& X% P* V) N
9.考虑如下E-Mail:
5 }8 m  I/ a2 P5 q* S* E
6 W7 w9 e, I$ f" ~. ~+ DFrom: John Coggeshall <john@php.net>/ f0 l  h: Q5 N9 M$ ~) D# ~2 a
To: Joe User <joe@example.comt>
1 q' d' d# w# J: _& nSubject: Hello from John!
" q1 M4 \1 v! z$ A& [7 ZDate: Wed, 20 Dec 2004 20:18:47 -0400; b1 e( w9 {: W; K$ B
Message-ID: <1234@local.machine.example>
. E. s5 J* T& C- F7 ^Hello, How are you?
8 C$ ~, h2 v. y4 t/ V0 R1 a3 o- ^5 Z$ C( e/ x9 m2 T
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)6 r1 H4 }& F5 o3 }2 q# R( P

& Q6 [/ f$ Q9 O4 ^5 |A.MIME-Version. ~+ d3 ^4 B/ ]1 N" `6 G( ]
B.Content-Disposition- a8 Z4 k; P( r! l& I
C.Content-Type
3 |: W+ g4 @5 l# BD.Content-Transfer-Encoding
4 U$ B+ \2 b2 W& Z2 h2 a3 sE.Content-ID
0 a( e+ b9 D8 T5 K$ d: U) M( g* s3 \& j( n& n, b$ V* }% g

+ n; g! V. j) o- g0 k10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
$ t1 z4 @0 t  a. Z: J; Y5 H7 U, U; N; K3 P' m$ P0 t( b
A.multipart/mixed7 D% T7 R8 f3 h6 K. n- a
B.multipart/alternative
: l6 v  u$ b' z' ?. T/ Q; Z! LC.multipart/default* e. I- Y4 Y* s3 O7 {: T1 T
D.multipart/related
4 g4 p/ T6 u+ e" @; O) aE.不可能用content-type实现
2 w; K1 K) B+ ]! `+ J
+ K" Y. k! K+ y  }- s3 k* A4 Q5 G' {  Q  L
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
* t# U8 A3 U: J: a/ V3 W4 K0 h" g# a3 [
A.安装sendmail服务器1 m% n5 b' l: G; [8 Q0 ^) p
B.安装Microsoft Exchange
2 t: ]9 T2 p" [- s* h# e  ~3 r' zC.在你的电脑上安装任何一种邮件服务器' W7 O; {/ K% ~" A
D.改变php.ini的设置& r' H' f! `  v2 @$ q! Y
E.写一个连接公共电子邮件服务器的脚本
1 z+ W- m+ @' q6 p+ z: f; P" r6 D0 u! r& Z- B7 [0 _
6 I  Y1 S6 n( L/ z0 B2 Q" s
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
. b% F( E% e& g0 v$ {. D- J6 j
9 r2 L# P- M( ^A.使用GET方式传值
0 t$ @2 c" P* y* bB.用htmlentities()处理电子邮件地址
  B% j, f& @3 jC.使用POST方式传值
# p% e" D# n! @! A% z0 C1 VD.用htmlentities()处理邮件正文
" W0 ?. S- y% Z7 w1 h) ?$ n( PE.确保填写邮件地址的文本域不能有换行符8 ]- n0 j, O8 _" }) ^
1 H+ I$ Q4 S$ V' ]

" \( `0 I$ V9 j- p13.如何将一个数组作为附件发送,并要能在接收后重新组合?
8 E* z1 c' d" G- X7 I
: F. I1 D! `$ ]) e" l. K- s; _" h8 K( N+ CA.用serialize()把它转换成字符串,再用htmlentities()处理一下( c8 y  N3 I' l& Y
B.把它存在文件中,并用base64_encode()进行编码
, h9 U6 i# X! P! YC.用serialize()把它转换成数组
0 b% y( ^1 K/ e* J  G" a( z* gD.用serialize()把它转换成数组,再用base64_encode()进行编码
8 `- K4 N6 r$ k* M: |1 |( ~( D$ KE.把它存在文件中,再用convert_uuencode()进行编码/ ~# h4 V! ^9 B! H# P/ r

; M/ a6 J* ?9 Q  H4 V) V/ @/ z1 {* F
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
% |# }. L' ?( i8 U& u# `
; o5 |+ p2 F7 X& G( gA.堆一个检测脚本出来
/ z( D+ [( A* f, S* W- @$ ~# y1 E8 k. SB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
& x' S! _8 l& G5 [7 q) H3 v( jC.写一个识别文件MIME类型与内容是否相符的函数7 @- \5 e* r3 I
D.使用mime_content_type函数3 U: m! ?% V" Z* ^0 }0 ]0 G) |
E.把文件上传到外部服务器上
" F# {% ]8 ]6 R& Z" m  m: p( }; T0 W# C! `/ r# w

: ~) o5 {) M% P9 S9 H15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)* Z: R+ G# z3 Z- h  {+ s
. C& f4 o; X3 R. y. O7 S) K/ H
A.添加一个From头信息- A! S6 [7 Z. n( W( D) j
B.使用-f参数  U6 N4 E: |. Y) y1 l" L8 G! f
C.添加一个Reply-to的头信息' k; i' s9 P5 m# c
D.确保运行Apache的用户有修改sendmail设置的权利
( T/ ?. D& D  K& M  i: R+ BE.确保Apache在root用户下运行
+ v/ c8 u) {# T- G# z4 Y7 U2 C" K答案速查
; s% l$ s( L9 O( u$ k$ K. A1:D9 X" D5 A& c- f
2:AD
: C& [" w0 Y& U& ]# Y  |% I3:E( u2 p; H" w- k+ w4 t
4:Content-Type:MIME
) \# ?: p  I4 X# ?5:BC
" Q( L! V' A/ r) G6 L+ w( }6:A
, d; x# v7 C7 X$ J' J# J, L4 P7:C
; h5 ~9 c! h: n0 N8:BCE$ t2 u6 l/ {4 n6 H& p5 u
9:ACD
% H. Y; g1 E# Y: [% e5 y$ _10:B
+ ~, P  c9 i; j' `5 {11:D% K2 X4 p5 C8 |1 y
12:CE4 n* Z1 y: a2 F3 l( [- w7 g
13:D8 a0 r3 d- K* \# C) \
14:D4 l# I- ]$ ?" I- l1 ], h: Q. v
15:ABD
1 G- E; J5 {. V, X0 O4 I9 V
6 V0 S/ x# `) ^& r3 O1 S! d
9 H3 s/ |9 N7 m7 \- b% J
! B  {& _4 N1 W) m& S答案详解  x/ ~3 A1 X4 d+ m
/ E% X5 N4 }+ R$ z4 O
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。; q5 Z( L7 r) ^: n) t+ u) M9 F
$ t! W- L7 l" q* f0 y
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。+ R4 e( Q; l/ N, r6 H
9 d7 g; ^0 ]% ?7 W, f
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。/ u7 W& |. k; \& E/ k% ~; |9 k3 @6 m

4 Q0 K: a0 ?5 \, o& f4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。' o1 w& v7 C- `( y9 L9 ]# }
3 p/ Y2 s$ A2 D2 [8 A) z
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
; t2 o1 F: U' T( }  E: V+ g, N7 `9 D$ @0 N
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。* {* o! F* a2 [* z% x7 v$ C9 ~" B+ c; \

  J$ a' v$ _" R7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。+ a& u9 U0 q4 r" e; F/ z

* |, k5 }, {$ [) [1 H8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。0 g: U5 u$ Y. }' v+ J% Q

( i" t2 B1 |- x, @7 z- x4 h" K9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。7 b- Q" r' a8 T

- R3 p$ o( Q3 t* c/ }5 @10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
2 w' F( l# m' _0 Y1 t  l1 a5 {! F2 O: q, O. u- `
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
) f$ z4 T7 [7 r7 @
8 I; V8 l* J$ j% l12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
2 g1 M2 K' X1 W2 e' C% m1 K, h
( j+ Z" n: J  u7 i+ c13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
. ]0 O0 {  c5 o' C6 C) w& z2 C/ Q! y  h6 S- O; G4 G& B' J* D2 t
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。  |( X8 z7 f- P$ w: h1 Y# B9 L9 C9 t9 @1 @
9 q- C8 C9 C( Y" P0 B
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




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