返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。4 _/ e% d4 p0 o! f& E
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。. t9 U7 f4 N. N3 C4 o- S& i
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
- o5 l2 V' S" f, q* H( r+ d" G8 x! n% X( ?
7 N+ T/ ^# F. [. d+ ?9 o/ f! L; I
问题6 r) K9 q2 ]" c+ r/ E7 U

3 H/ O2 ]5 U# @$ |8 i! y1.以下哪个不是合法的电子邮件地址?: ?8 |: ^! K' E  z3 _

) ^9 b+ j3 X1 Z" e- NA.john@89w.org
: h1 L) K* Q9 U) ~( `; bB."John Coggeshall" <someone@89w.org>
/ f  B7 ]) m  l7 L: L2 ^2 q9 p# ~C.joe @ 89w.org
4 r8 c0 U9 b3 l$ R; YD.jean-cóggeshall@89w.org
) j* U. s( w* O8 d+ C7 c/ HE.john9 w! X; w. X5 i: v2 ~8 O) a4 s
! U3 c" G/ l9 X9 @7 g8 L
" G3 x5 z% K8 m$ d
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)+ I% v+ g" J( |% |% P
& I* \) m0 F+ ?& s) i
A.Windows/Novell不需要第三方软件的支持就能实现该功能( q5 s, `1 }5 Z+ |& c' ]. W
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。5 H1 H6 @; r: a( {
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
# a2 k8 P) M8 V) CD.有可能完全相同,这取决于sendmail_path的配置
9 i) I5 I& \9 h0 R8 ~3 w. dE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
) @5 z: l- \9 c
; k9 ~( ^: k* Y% i# w
0 a3 g/ w1 `9 z3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
& R0 u/ d) V+ {4 J7 e/ K# C* P  P1 e. @2 K* {" m$ b8 M
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数% C- w( \* `) T7 ~7 B
B.用PHP代码,通过SMTP直接与MTA连接。
1 t( ]6 X$ C: WC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
* u& M3 q! Z) x3 q! I4 T5 nD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
6 d" n) u* E& H7 D0 O9 XE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾* I3 A6 t  _8 y5 P# X/ f4 e+ ?6 Q
1 T% w. _# D. d/ k$ r1 X

$ C* S/ p% G* U* e( v: k4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
0 Z8 c9 ^$ ?% }4 j" l
0 _/ Q8 @+ Y; p& l  e" o答案:____________
' G; R. K& D( b% u
) d( z( n" a! b  z; G/ G$ T+ ~) u& b+ e& W
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
" |4 u/ A" e. T3 K! K& o- C6 a! k& {2 u8 A
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示' X. G- a& s) l! K! I  t
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
, Z$ c3 X8 L  r9 b) UC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
4 w% f# R% U) V8 V" C7 f7 P9 i1 ?D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名. n1 q& o" I% X6 l
E.只有一个答案正确
  \; b( ]( Y4 [: b2 l$ E3 \: V
" Y) o" z# S3 ~# O
, n) A4 C" I9 ~0 I4 H# j! t5 h9 }6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
0 G7 o( Y" q" N4 l' H2 Q
% c1 z+ ?3 E& \A.从UNIX或Windows/Novell发送邮件时都会用到
  `+ g3 J3 x1 R8 |. d' H3 p! _B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时5 U( R! Q, P3 m' ~9 a. Z! R
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
/ i+ ], y' n3 p9 AD.PHP里用不到这个参数) A: i. ?1 O% G- t/ h( a% b( R
4 A8 }5 T+ c. y, M8 }+ W
; M2 n4 C9 i: K% X$ n
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?& j5 z+ }: Y+ k% Z

+ Z- }  ?" Y  u1 P' u+ D+ B( dA.只有在发送非普通文本(ASCII)数据时
1 ^2 }7 m1 C/ RB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
2 D2 E. Z3 Q- t6 KC.任何时候都可以用它来指出MIME的编码类型
) t9 B1 U1 _. Z, K+ h# a0 _# LD.只能用来指定特殊的编码格式(例如base64)
; V3 W1 x2 a; v% @& U5 w- PE.以上都不对
7 t3 {  \, L  p; D6 i
. ~3 u  f# M2 t; G8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)* Y& W3 g1 u6 l% g# B% A* w7 S

" t: v5 _' ?6 B4 e5 D- P( e  ^3 w- s! |A.分隔符至少要8个字符
1 ~, p7 q8 B  f% G" d4 y3 `B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
& L  K3 v. q2 B$ D) b3 z( T( @1 P0 ~C.分隔符在MIME邮件中必须是独一无二的5 [0 u! _- I! x5 H
D.分隔符不能嵌套的其他分隔符中
4 j& y  X+ _3 @% R2 i  bE.用什么做分隔符都无所谓
/ V9 r4 x/ S7 ^# T' J( G/ S4 R; f& s7 f0 X
- g) y7 w% ~. C& Q) g3 A
9.考虑如下E-Mail:
  Z0 {3 I7 E0 C7 ~7 a' m/ ~- l9 a' v6 {
From: John Coggeshall <john@php.net>8 h' t' I. B# n! w; c" J
To: Joe User <joe@example.comt>% V0 v. a# D0 D& y3 F) ?
Subject: Hello from John!+ S# C; V$ w0 [4 H# {$ t
Date: Wed, 20 Dec 2004 20:18:47 -0400. T/ ^2 V' D' {
Message-ID: <1234@local.machine.example>
; C7 k4 {% A. R2 DHello, How are you?; l4 j4 d% D8 k* a/ Z

. `$ w6 w1 y' F在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)% N1 b0 ^9 m  E+ h2 U9 Y; T  a- e1 ~7 W

4 q) ]2 H2 r: w) @' w/ WA.MIME-Version8 v9 A" a# d: [/ r2 O5 f
B.Content-Disposition
9 i- ~5 E  m, d9 `C.Content-Type
/ P! c8 W! R! \' R( GD.Content-Transfer-Encoding
0 p/ s3 u0 ^+ O1 P4 b5 vE.Content-ID
1 |( p' ?3 [) U8 e  B; V% K9 z# z7 q/ x' R% v3 j( X

1 M; D2 h) c$ L. a1 f10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
' f9 j3 ?$ M6 _% L$ H: b* p
8 J2 S* W7 {  V% H+ j: E5 \! zA.multipart/mixed. P; l* m1 z% k, R0 R* \# |
B.multipart/alternative! |( o4 A/ U4 |5 H$ N! a7 b) R$ o* X
C.multipart/default$ w" f% @# u' Q# k% {9 R
D.multipart/related
# G# L# O- ^6 p6 j3 ^2 j$ W  yE.不可能用content-type实现; M! E, b$ T0 }8 w* [8 y" e1 W
8 J4 f; w$ {6 _/ P; v" M

7 z' [6 K) j# J/ S11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
+ j5 h+ x& P( X0 ^
0 I+ I8 S* t& o4 e+ M7 lA.安装sendmail服务器
  S7 I) I# E1 zB.安装Microsoft Exchange
4 P9 f& ]* }  V! n- zC.在你的电脑上安装任何一种邮件服务器
( I; a9 s4 t3 y* F8 ID.改变php.ini的设置
& L8 X2 b: d. \+ Q- HE.写一个连接公共电子邮件服务器的脚本
& n2 w# E# S( C; `6 q
1 D% r: v. [# `& n5 W7 r2 H
" X6 j6 Q4 M& E, a12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
: v+ t+ @  d. S2 V( Q4 e" j0 Q8 W/ _" }% t) b. N% Z
A.使用GET方式传值( w3 N! r' s% B
B.用htmlentities()处理电子邮件地址; ]2 O  D: `' U. I: d$ d& M3 c
C.使用POST方式传值
1 ~. X% V; h* ]8 a. d3 v5 R$ mD.用htmlentities()处理邮件正文
4 x5 T6 z1 L2 {E.确保填写邮件地址的文本域不能有换行符
8 g' L9 ]/ F: o, O* k
! t3 l' g; q( c, T- k# v2 C6 j9 C1 Q; W. W- d
13.如何将一个数组作为附件发送,并要能在接收后重新组合?/ Z( b. }5 Y' X# a& @
" C9 l  ~* p) Z' ?: q
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
! I$ F2 f9 i) pB.把它存在文件中,并用base64_encode()进行编码5 A  j  o9 A0 c& t4 a8 x
C.用serialize()把它转换成数组+ M$ j: n8 x( x$ P
D.用serialize()把它转换成数组,再用base64_encode()进行编码
6 e7 \, M4 e# G7 K. P1 N/ h0 t( GE.把它存在文件中,再用convert_uuencode()进行编码+ H8 z# [* W; y/ \& Y. U% N- J

, j4 t( m. p. m8 z  U$ d( w
" I3 X0 J3 {5 p& a* J' G. V3 Y( c14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
0 _+ L% U  D# v6 _8 W9 x- E
4 v" A3 `, T% g% FA.堆一个检测脚本出来
. W9 @3 X3 X  X) o% IB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型8 L: g1 j1 N& q# c" Y; ]
C.写一个识别文件MIME类型与内容是否相符的函数
0 G+ R) Z# P9 T8 e- bD.使用mime_content_type函数/ @( d9 l0 N9 |
E.把文件上传到外部服务器上, B- R' l) M' E% O% s
* `/ x9 ^% U* e4 r( {! `5 T- e
& F. y/ G) x: n
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
0 D& V, p2 E4 U$ ~- E; A4 Y: q- Y
- G) W0 Y+ S5 X# ]& }+ XA.添加一个From头信息5 E8 h* d0 @+ z* o8 J+ ]9 K
B.使用-f参数
# t( [" \/ J5 ]) W) Z3 KC.添加一个Reply-to的头信息" b3 d8 i& z& U3 s& ?
D.确保运行Apache的用户有修改sendmail设置的权利- K! I5 n3 l- D5 ]
E.确保Apache在root用户下运行
6 F4 U9 t* Y! n$ c答案速查* l, ~; [1 p" _$ E% @
1:D
! e7 @9 w! g- i2:AD
. @& {/ _* Q0 }4 u" P* ^3:E
- a1 D# R; C7 ~- u% J% O8 [4 a& n4:Content-Type:MIME6 C. X3 B0 y: @: Q! ]/ B5 B  K7 ^
5:BC  E9 Z$ _8 \! O2 u! L5 N" |
6:A. t1 p& A& p! z
7:C
% q% n3 E0 O4 v8:BCE% `* f$ q2 y+ T+ p
9:ACD
- U0 v1 v7 `6 F  P8 |10:B
" h5 n6 t- m+ b) U  Z/ x11:D
' `: I: B2 v3 x  R0 N8 n7 ~12:CE1 ~/ V/ u; F: E6 F
13:D
/ ]( x; x7 o. N5 z14:D+ o, I" T( V" o% V' ]
15:ABD
. Z4 }* o5 y! ]( j) M' x) z3 z/ [7 D3 }) c; ~5 C/ T& ~

) C& q5 m, j) F: i/ x- y1 W. k/ @! x2 i8 Q- W$ B  D: A3 u7 u
答案详解
7 c% w$ e7 K+ {
  \9 Q4 n) @; e3 k( O3 ?- b1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。7 M% f* {/ |* h% i: T4 _  g) m
* o0 \; h* R" n2 C% v0 B
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
- `: g; s$ S4 n7 s, E- R) t: U# v
8 [/ T- o) W( X9 G3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。; x9 B+ K, y1 j$ S# @+ {0 [$ c
4 t* I4 ]# O# ]/ B/ U' j
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。0 |' B) `' {3 V2 m0 x* P' c. ^: G( z
7 S2 x1 y- J! y$ [
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。, S8 {7 Q( V  s0 m* g

1 Q6 s/ Z5 A9 `6 i6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。& P2 i6 [: Y. D9 s6 a8 b/ G! k
, Q1 {0 Y, ]" Y& N+ i
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。! w% U, c9 D7 C5 q5 b* T9 N
  a; A# ^  N8 G+ e6 t# V2 a
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
5 x3 q+ C( O$ j6 m+ g* t; n7 C
! l+ w5 j% q: ~- c$ |" @7 G9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。! q! T/ c! ]" [. P
0 I8 A" L: u( `$ R& A" k4 F
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
% U; s, J8 d4 O
7 N; Z1 [2 F7 h2 |) h! X- ~. d11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。: }- n7 ]! U' R9 f( ^) X: n! |

# Z' A; r/ H) W2 Q12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。4 f' c8 K8 n, k

5 b' Y- |$ i$ W% ^/ Z& W: S8 [13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。8 o. o" `% t5 B+ `* `' z9 l

8 ~/ z* D  `# X, l+ ^14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
  A% Q! q, c7 }" U( C: H- t+ j( t1 {8 M- g
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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