|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
* `' I3 B- d6 |" e% j还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
' D3 u# c/ f% ^; Z; y+ Q S1 ]用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。! a' J* v$ p* A
% z8 F9 T9 C1 N& ? F& k/ k3 E4 Y* s3 ~# |7 i
问题
& [3 ~) Y( x4 T7 X( p, r7 f3 W
* N, z: d v9 S1.以下哪个不是合法的电子邮件地址?
2 I% o: }5 R, Y3 {
$ |* S! v0 s- f1 G- i, |. mA.john@89w.org, `* D+ x- ^# U1 }" I! O z+ t
B."John Coggeshall" <someone@89w.org>& ~8 l5 ^7 f( H" U; _
C.joe @ 89w.org( t' o' v' w, _- h
D.jean-cóggeshall@89w.org
& `5 D3 H+ [# K, w/ n3 T& g& RE.john
9 b0 P8 n/ }, L0 B) i. S
7 |9 z7 ?) L5 Q: `1 Y0 W
# T& L8 [* T( a g' f( V* I2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
; W) V! X: q: a; B5 O: B, q! T( S$ g& N4 \5 b; e1 m0 u4 C
A.Windows/Novell不需要第三方软件的支持就能实现该功能
0 L& v8 S# H; e6 _, X2 YB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
) K* u( m; e; o# l, MC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
/ b8 `1 A/ b7 ]; BD.有可能完全相同,这取决于sendmail_path的配置
2 B7 {7 n+ @: a: i9 z2 n. b; \1 [E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
4 w8 D! U: H% J! Y/ T/ H" M+ `6 x
$ j/ N. }+ z* R% C
/ T% \% H4 G, [1 f3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?: r c$ E a7 @) _% i: g/ a) X
! R# v. ` g" Z8 e9 o6 k; UA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数! l4 ]' l' y: H ^6 J
B.用PHP代码,通过SMTP直接与MTA连接。% O8 }- }( @8 M5 w* n7 D
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
# ^. z. Q/ d6 P7 _& q& h4 JD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
# v3 C& {: Q. v/ C" {6 R q* a XE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
( n0 P) t4 _5 U! I4 D/ ^# [) t0 F1 D0 f& `, w8 r, d
) n7 t r' a! g- l) @/ f6 K; |4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?; O0 \( Y" Z0 L S% q
0 G x, \* `! K5 J! O7 N" C* u
答案:____________- i& W6 q& j* f4 W" \1 ^
% ]) I" N4 S& M) D. Z/ D- x* S% I3 a
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
+ o! y8 a, R( _! k
6 q" f' b; |, A4 c, D, k8 q. O, ?3 vA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
: T2 i: j% f! `" n) g5 ZB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片5 y Q# f) |( ^6 @& _1 y
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID' }4 B4 i0 ]0 l+ h
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名/ s7 z: h' ^7 w. v5 @
E.只有一个答案正确; P y( ~8 w; u B8 Y
6 z: A6 k* L" P: D+ z. p; l0 `1 F/ t$ ]: f) X1 b, ~) e
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
) B/ A' y1 E& G5 S' f# v. c5 b5 Z' _5 E7 C! {! \7 X0 n
A.从UNIX或Windows/Novell发送邮件时都会用到; V& y: N. Q! n) F* \, l& F
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时2 G( F5 @# _2 p; A! w' u. C
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时( \9 Q" u/ d" H4 I
D.PHP里用不到这个参数$ s( u7 y0 C6 c/ n: _3 T
m# p. F" O7 {8 \) k W, P' \: P1 P2 v! v
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?; r% b$ g( b8 b; V3 J; j5 P
. E- m4 |/ B& @1 D6 J
A.只有在发送非普通文本(ASCII)数据时, J: e1 v2 v( a
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)* p% s6 R; v1 M: O# l1 x) W' f
C.任何时候都可以用它来指出MIME的编码类型1 { A$ V. q# [
D.只能用来指定特殊的编码格式(例如base64)1 u6 @& c- o6 b/ C, T
E.以上都不对
0 w. D4 u# m. L7 C
# Z2 s( g4 F1 r" {# T8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)1 @0 u+ v! e6 y& ]
$ p) m3 q' l# y3 k7 Y, QA.分隔符至少要8个字符
8 q' X1 ~+ a+ m+ dB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)' g" m. O- w! W" C% B
C.分隔符在MIME邮件中必须是独一无二的# Y" K# o. s/ {- N3 a" b
D.分隔符不能嵌套的其他分隔符中) A1 N1 q3 o# @8 |3 n* U( X
E.用什么做分隔符都无所谓
7 n6 f' Y+ T! v- z* H6 u9 d+ k- E3 x. ?! u
( _4 N7 E; ^" G% ]) @9.考虑如下E-Mail:/ O0 b( n( ]% J
/ O0 s) d* d/ `0 q+ i2 O* g8 YFrom: John Coggeshall <john@php.net>
) t9 F8 l8 V* i- X, zTo: Joe User <joe@example.comt>2 O8 Y( \8 X- C" _
Subject: Hello from John!2 Y+ e: l* e8 `- |+ l, N( Z2 k2 H
Date: Wed, 20 Dec 2004 20:18:47 -0400
3 U% s% b* j2 t9 c2 l# hMessage-ID: <1234@local.machine.example>
2 _1 w& ?5 T% \+ R5 vHello, How are you?
0 N) V" {- r) g* I5 ~, a- P1 X
% a4 G8 \# h$ x% l6 B# `4 j5 w5 @0 m在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
1 K& J5 Q r9 N; B2 {, }: t- B* p9 y: J
A.MIME-Version. | Q( `6 Z+ J5 P; f
B.Content-Disposition/ Y) A: j; H Y+ p+ _5 U
C.Content-Type
[) a* H' T( WD.Content-Transfer-Encoding
- K4 ]% t' {# V/ j2 b' o+ ?E.Content-ID% F/ Q G: k! ?3 k& M7 T" T: @
1 d! S: n' y6 k+ e0 F6 H# b* M
) K. H! M/ b: W0 Q10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?2 l% y# H2 F. |$ `
0 G# \9 _; P$ e. h8 A
A.multipart/mixed
2 d8 r% D; ^- G0 c/ c m3 s: ZB.multipart/alternative
; W; j W7 L; n y/ h8 T) H8 |4 c. S% l3 YC.multipart/default) Y2 n) Y% x7 ~: X1 p( e% T
D.multipart/related
: s7 y- w f% [5 D/ B- vE.不可能用content-type实现
1 x5 \3 `, I+ v, T8 G6 `) w3 _( g- y' Q J
5 |' j; V. ]' Q I
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?6 t* i P4 N) G+ {4 n4 v
: w3 c. q8 E; [
A.安装sendmail服务器
4 K4 X! I& D) [1 _7 W; {, JB.安装Microsoft Exchange& c' t7 j" K0 U7 O& g
C.在你的电脑上安装任何一种邮件服务器
3 j$ i0 M' s, { ^, b: fD.改变php.ini的设置& {2 Q5 @. U" z( _: U7 o8 i; z
E.写一个连接公共电子邮件服务器的脚本
; A2 m+ b' w: h" i& q9 x! Q- \# l3 O- G" m8 P" c$ q i0 ^
$ m* n9 \% E8 ^) w5 H4 Z/ j12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)' v8 n% w8 ~! f3 g- d' _6 C
8 C, }3 z8 G& sA.使用GET方式传值
$ i& U0 Y7 P* c: G4 O. EB.用htmlentities()处理电子邮件地址' U- d9 `. D @# ~; `$ M
C.使用POST方式传值
: t% r2 a. d8 u( t: }D.用htmlentities()处理邮件正文
+ m" }( G" N' h/ A# vE.确保填写邮件地址的文本域不能有换行符
1 W5 a. X" a1 s+ `7 |
# Z0 y! {) k6 T+ {: N" `
7 ~7 q+ i4 B9 o- N13.如何将一个数组作为附件发送,并要能在接收后重新组合?
2 A$ ?7 G0 n+ ^& R) o. {5 T' I6 D$ A7 [: h
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
: G0 B. r! o2 |3 Q+ M# z2 NB.把它存在文件中,并用base64_encode()进行编码
2 ]8 A9 c' i, Q: {C.用serialize()把它转换成数组
! ^. t5 } N" w8 l2 t* hD.用serialize()把它转换成数组,再用base64_encode()进行编码8 d/ A. n; Q2 w* b6 J& [
E.把它存在文件中,再用convert_uuencode()进行编码! q* C7 s6 w$ A" w# e
8 `& X, ^: d1 u/ n$ N
$ n5 p; C& P' C5 K5 O* u14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
7 q; J S! A8 ~7 L( c( s5 a1 A Z- j" c" J. T/ E
A.堆一个检测脚本出来
4 _3 v1 {( t2 sB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型0 A' y6 h* k: u. j: T3 W
C.写一个识别文件MIME类型与内容是否相符的函数
) o0 r. ?" \6 K, KD.使用mime_content_type函数
# e/ \: n& r$ AE.把文件上传到外部服务器上
/ t, V+ O$ ~; `
' X8 g, W q: P" w( _2 e
+ Q9 u4 s0 D3 t# G9 u5 K15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选): N; n! A3 B1 l6 x* M4 s* U
- f1 K( L8 l, H+ ~) F
A.添加一个From头信息' K; A3 d- M/ ]! F% h9 a
B.使用-f参数' F# ]7 B' a# k J8 R( g
C.添加一个Reply-to的头信息/ @, a ~9 a0 t
D.确保运行Apache的用户有修改sendmail设置的权利
8 [; ~4 H# B) }) v% i0 SE.确保Apache在root用户下运行
" J, h1 M& m: Z! W S i0 @答案速查
- l7 q( y1 [/ }+ K, E1:D/ h$ O3 r1 x- X- s6 L
2:AD" t1 R. c" X/ e* V& N1 c# G
3:E6 q* v' _8 L- g8 v% z
4:Content-Type:MIME
1 D$ l |/ J8 L, @5:BC
( C( e/ x8 n8 m' W% t- `6:A
, Z* I7 u( u* A7:C7 A S: x; d4 \- b' _
8:BCE1 V6 a9 E( b; v% y% i
9:ACD
% A9 D- w: v0 u/ Y% }10:B
5 Q2 s9 ^5 T0 K3 N8 U11:D
$ R# j3 h) y& T1 G6 v3 _: G12:CE
4 ?1 D! C: O! N% {13:D' L" y/ k. a8 {" C" _
14:D; w9 U; k5 }) Z) _4 p# C& a
15:ABD
9 K* C( i4 N* ^1 l6 a% o+ `; |; H/ J3 T; C* [) T- D4 b6 j& o
( W9 d+ ^( r0 P1 K {8 R' Y1 z. Q
$ Z( U) S4 |+ k! d' [5 L- n5 t答案详解
* ^% `7 L- f1 T+ P# S
+ }3 ~; h5 K4 |( U; E1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
8 h2 o# v; b; D. l! U' A a6 z4 J$ c( d# z$ [
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
' U3 B* U* n% o8 v* u! j0 U, T/ R+ `( R$ v$ o7 e, H6 V4 m8 ^# i
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。4 l9 E5 R/ `9 g: W% z- y# a
& [- L& d7 C# J$ o. s5 `% z" {4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
8 x, z5 P' w+ r" p- G# z
7 n2 y# e( E0 M8 d g& \5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 ~4 B! h! A. f) C, p" @) n$ l' f0 }
! A {8 h0 G1 Q8 j$ ^$ z6 N& v6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
4 x. m8 X/ p$ \3 j) g2 N7 v2 D- J6 c+ ~$ f
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。; K$ ~. }% }; k- s$ |
) b; C" r3 M+ |$ ~% Z+ e) X! M
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ A: P7 L7 C6 D
" {5 U* T2 q7 m6 D4 M9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。2 }2 Z* c$ w" ]* h( c
% _0 ~% S$ P, k3 ]5 P5 i0 G! o
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
" K& ^+ ^+ W9 o6 v1 s$ C. z; f( W1 ]: h% q
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。' m3 [" ^: S) E' Z$ |3 L
# F4 n& g s/ s/ t, A8 `" p
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。0 `, J) k& P! @9 d- Z/ F$ t
K% [4 a1 ]) B( |% ]13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
5 D- j; f6 g- }, P; L$ l: p' G' ]1 \
6 r( S& \4 _( N9 N6 ^8 W- t* ?9 s- d# {14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。, {, J* d4 S5 E5 C
# r* w2 E) e2 R' D+ P- Y
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|