  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。% C1 D5 D/ M) |
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。/ c) ?7 n: b! w' a1 t
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
) ^- H/ j' P4 m- P3 H$ B
: }! J* j0 j. J3 Y& a( U1 B" V/ |( q7 _ h0 w3 T+ j* Z
问题3 Z9 e- q5 B4 J/ S, \7 N P
$ j' c+ M( f4 Z1.以下哪个不是合法的电子邮件地址?: _7 `& R! u# L# _& ^. ^; T1 ^
, c" W$ m" k, O4 x7 g+ [
A.john@89w.org6 C6 S' S, H$ p
B."John Coggeshall" <someone@89w.org>
; k8 X3 @; q( i: lC.joe @ 89w.org
0 Y9 `% x! z \/ X: }D.jean-cóggeshall@89w.org" E6 l) k4 S# C8 A: n8 D
E.john) S6 D. e( }0 Q6 X4 H7 l' l; \
3 [1 F7 _" H: T( f" x% a$ O4 y/ h$ e# T8 A! n
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
) W& f) w- `+ j0 F: B/ s, }1 E; ^0 `* ~5 {) l
A.Windows/Novell不需要第三方软件的支持就能实现该功能
& Y v: T) w0 [* {B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。' B8 E" q1 Y% u/ e) ]% x; `
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
$ b) t# V- d+ q2 e4 M( c7 ~ oD.有可能完全相同,这取决于sendmail_path的配置
7 m" @% u7 x! C6 D+ yE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
F* e9 g5 Q& o: s% u7 ^
( ^- q2 N" d: ~6 Y6 C7 H6 D8 W7 Z0 ]
; v, d f) H. v3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?. x2 }& c5 w8 c
) F; f* c3 s. B1 X6 i/ N- ?) oA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
5 g* |$ L1 ~& i8 @B.用PHP代码,通过SMTP直接与MTA连接。/ r$ p( I. D# |
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。# F1 D G, g8 M. ~6 A1 W6 c: m7 W
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。* U. U% |) B1 n
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾; n7 {' t9 Y) e0 ?! q0 U
7 ^% `# ^: y: g D0 c6 }( b) B9 S1 v% Q9 I
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
+ \0 A; n5 e2 C) V+ M* ~
+ O1 i1 G2 e2 i' {, _$ |# K答案:____________
- s& L) I) T* ^1 V3 q' A* C
1 { F/ ^- U7 L
& D. j' o$ n" C. h8 A5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
( c' E. J9 ~2 I, `
6 I( d( p0 w9 \+ i3 D5 ZA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示8 B, i2 n, l8 M7 V* a8 t. L2 O
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
: y: B) c& t$ _0 QC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID% N4 w- k: S# l9 W
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名$ C' c0 D3 M. O7 }0 ~3 C. |
E.只有一个答案正确
; u, o$ i6 g5 H" y( ?4 e9 W# L4 w6 o# G" F- S3 t) Z
0 |8 @7 V# J" y" l5 L( i" s9 p0 O
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?5 o) m: l( \5 s5 r% I/ M* m
6 u7 x4 ~2 n2 u1 l2 j
A.从UNIX或Windows/Novell发送邮件时都会用到, u9 O0 E$ a. I9 R# j G, v0 A
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
5 j3 e( f- Y. e, r' x6 `# `6 N0 f1 w; AC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
6 _/ d5 P S C6 ~4 dD.PHP里用不到这个参数
- a) ~2 z F( `- d4 l
+ _+ {( N2 L+ G/ } [( E/ l% T- |" {/ f! R
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?' ?1 r- d* Z6 y# f f3 F: m$ G
0 w- P0 {5 [# UA.只有在发送非普通文本(ASCII)数据时
/ z" Z( z4 J+ mB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text). W/ h% o$ z+ d* N$ U0 O
C.任何时候都可以用它来指出MIME的编码类型& H) _+ I/ P$ Y# f& o/ y1 n& m. Z
D.只能用来指定特殊的编码格式(例如base64)
m* o% Y1 F2 ME.以上都不对
; Y, [5 S' D" ]
- m- j. L. \& Q4 @/ L8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)% \# y, B% S4 G5 a) R& s# [
3 f) Q! o' y! o0 Z" L) D$ W" bA.分隔符至少要8个字符
6 W! S+ W; O2 x' g. U' b1 qB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)* H% a# _, S' N- D, J
C.分隔符在MIME邮件中必须是独一无二的
2 u8 L4 H( z% G. i7 N8 QD.分隔符不能嵌套的其他分隔符中6 E q. i0 V' t4 L# ^' O* R( i
E.用什么做分隔符都无所谓! d3 Y& E6 j1 h/ X1 D& }
* v& h9 C3 g& J/ X+ P4 ^( i0 q& U
, i5 A7 ~6 l$ t3 [
9.考虑如下E-Mail:9 Y$ [+ C4 W7 [3 P* }8 C! T
" l$ C& z. N3 D$ G6 H( D1 k$ @
From: John Coggeshall <john@php.net>
6 S2 n2 n* |& l" t% M% ETo: Joe User <joe@example.comt>
3 F, G( U/ A0 ~% RSubject: Hello from John!
2 s6 B6 h5 a+ M7 Q1 T' L) u* \Date: Wed, 20 Dec 2004 20:18:47 -0400/ ?) S& q, \; z# E) r- K/ p/ n
Message-ID: <1234@local.machine.example>8 h+ A2 j z7 q- O- M' q% u0 v
Hello, How are you?
4 E% S$ ^+ @2 I2 u/ K* c
1 Z/ |" C7 H7 r; v2 m6 l- ~- B在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)' Z5 ^8 `' ?3 \ [4 {' \! U
3 P& l1 A+ j+ F1 ^# y
A.MIME-Version
8 C {0 O: z$ f! N7 r1 w7 dB.Content-Disposition9 ~; L, z" {- w3 n8 M3 u( G
C.Content-Type
7 d) |2 F0 J+ y& \ n w9 bD.Content-Transfer-Encoding
2 E: [' B2 {" I) ~0 d" s, YE.Content-ID
* G' y7 L' T- Z$ Y2 T* R4 Y. N! {% {$ z X' d( _
% C3 m p8 B2 R" F9 E C10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?) [" G- ~. m9 u! Y; c* B9 `
g; O- F8 Y1 K! v& LA.multipart/mixed. y( Q- g& L: b6 m/ S2 @
B.multipart/alternative4 [* o$ v3 w0 z/ o
C.multipart/default- e& f" F: `; \
D.multipart/related5 s; e$ T$ n( A' X3 l
E.不可能用content-type实现
c& Y; l2 U0 F: b3 r3 n* A/ G3 U1 y
& u: \# B( E4 ?- a
" L* g. M5 L7 _& M) w- x( [11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?& z% f1 F9 ~0 t# c' E
) f* O$ e9 ~" o" m3 U/ K) @! TA.安装sendmail服务器! a3 l/ u5 T: t; N1 h6 T6 F, d
B.安装Microsoft Exchange
( K4 E8 S$ o0 J. r3 d& Z$ ?- ZC.在你的电脑上安装任何一种邮件服务器
3 `! u( @: l2 x+ YD.改变php.ini的设置- \0 d) g/ C* u* P e* `
E.写一个连接公共电子邮件服务器的脚本" e8 Q: C0 g, g/ S, a) U
5 f. J# H' X6 ]" a5 y
$ E5 y& E: J6 h12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
% Z6 |2 n6 E- F( F
" s/ R8 V% n' O. yA.使用GET方式传值' l6 M: \: r9 h C' b- g
B.用htmlentities()处理电子邮件地址
# P% s- P1 Y: ~& G) z! IC.使用POST方式传值2 T q1 i I3 @) Q) V8 t
D.用htmlentities()处理邮件正文
: F( s3 K: F% e. I8 p: t Q0 }E.确保填写邮件地址的文本域不能有换行符
+ b x6 V) p3 _; o3 ` C. `
" o7 J% @+ L; i& {
# O7 ^: ?7 [+ E& q3 l13.如何将一个数组作为附件发送,并要能在接收后重新组合?% N6 M/ a- e) y% f: q8 z
7 M: S( H p, q( C- H* H+ r- y
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
; H2 \2 f( F" ~: LB.把它存在文件中,并用base64_encode()进行编码
% G+ }$ ^9 V0 e* ]0 ?( XC.用serialize()把它转换成数组9 g. j$ X. P4 g. V9 ^: J
D.用serialize()把它转换成数组,再用base64_encode()进行编码8 X. G/ d, |3 ~9 x0 [$ e
E.把它存在文件中,再用convert_uuencode()进行编码
$ K6 y; u- G5 ?9 @
) o: G+ v- c; r# O; X* u
' a/ ?" f9 K) f- A0 k0 a) R14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?6 y/ I7 V+ v# O
( b+ V( b6 B/ O2 ?+ v# q; a$ U q! MA.堆一个检测脚本出来
+ s4 n& C9 I+ H. u$ @B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
5 @0 {8 m9 P4 Q Q% zC.写一个识别文件MIME类型与内容是否相符的函数
: ?0 S7 h" t b8 N$ X, V; l( e- ?D.使用mime_content_type函数
# M; m0 C4 K# f/ _3 DE.把文件上传到外部服务器上4 D/ x+ x. ~: N' T2 h6 o
9 p0 {* m4 O3 C5 {- P
/ G* E, d' w" q$ {! \3 c- |+ ^0 z% A15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)* O: z. r& W( `' _' w0 {9 Y
" }! C( m. [5 G! xA.添加一个From头信息
+ w+ M2 j& L. f$ l, S$ r2 g; dB.使用-f参数
5 c( `! r" r% UC.添加一个Reply-to的头信息
S. R+ J5 Z# g" p7 [0 T+ SD.确保运行Apache的用户有修改sendmail设置的权利
, R: c6 j- g5 A& qE.确保Apache在root用户下运行+ ?" `6 k0 A# m6 x# G% i+ m- O5 H
答案速查
; {# x ?) H7 Y5 p8 Q0 \1:D0 p n1 S1 @" w9 V! a& z' c+ |
2:AD
( G' x! T& j+ h% R6 @! I: b3:E s+ x* {* `6 P) u: {4 w
4:Content-Type:MIME
% \; k# U3 I- V4 f8 r5:BC( o) O' x8 m# U4 t& E
6:A
) ~" d: H8 Y( I2 M5 l7:C: D- y6 s% `( [/ ^0 z
8:BCE
\ k: F& E1 S0 R0 P' s; f9:ACD
) j, q7 S+ e4 |2 X5 l10:B7 \2 r' L; |& s6 @
11:D
- P* ^2 M3 b$ Q, P# m12:CE
4 v- ]* G2 f1 E2 t4 j: ~13:D1 M% t2 c; v7 Z2 H- P
14:D
1 `, A9 [6 i4 Z ^15:ABD
. u: ]1 _3 t( u6 ~5 S7 N, M5 B$ h6 g% l9 }/ b
1 p$ `. v j* i, k
7 t/ ]; E- ~9 H* o答案详解. m% i H3 b1 A* _$ w
+ \: E; o% Z; T5 X) ?1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
2 u5 x2 ?3 f1 N
3 D. q! O B1 N8 F4 O0 ?6 M: t2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。+ J L- _0 u! P7 v
5 j9 |$ B1 @" h: X2 _* Z
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。& f* @8 i, T" a* p3 \7 m
4 N" X' I! k7 F1 Q4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
; P% q2 Y" M& _; H3 S
: p/ g9 R- D. T1 p+ a' f5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
: m! e X0 b* T: w/ I) Z. c/ X, A
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
' \* {' c, z/ m) M' I& \
% r1 V- @' P7 L: j& N7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。+ G3 {, ^0 |- Z2 t: w
) B4 ?* w/ H& L w/ f8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。( _; I: V. ^& E1 h d9 a; e. R' b! N$ a
$ l% o8 [: Z+ U; I1 C" r
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
' L6 |) ], E6 ~" X4 v8 o* J7 p& Z- i+ X2 \% w/ n# U- O ?
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
5 M0 ~0 U o: ?9 [+ R% u
; [" L/ D6 U$ ^11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
6 ^9 Y+ h' c! _/ G7 Q2 x: Y, z4 F3 a L$ G( X- g3 _
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。" h* D c& a) D$ g+ G! _9 b7 u
& C0 S3 e2 T' k) l
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。7 U5 M5 s, H! y$ b! C
2 F3 c: j9 {+ `; G+ q14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
/ b! \7 _9 d! b K2 `$ R ?; T7 L+ `# E8 \
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|