  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
6 u; D6 ?! L* I2 e/ z还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
& h o' B3 F% Y: m& {* m' _) p: R用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
# d1 r4 }- v/ z- m/ j7 o
) A7 L2 G/ g8 L% U5 A' R {, R2 c6 R2 o% |/ M
问题% K& _" C5 w8 m# G% ?8 d; C
& e* G( B/ v7 y$ L' ^0 p, o' g1.以下哪个不是合法的电子邮件地址?! k5 O: q2 p, p
# C5 a5 g- l: KA.john@89w.org8 C4 {4 @# `. z3 q# c( w8 t0 h
B."John Coggeshall" <someone@89w.org>- `+ p' c: K0 ]5 N$ Y5 f' v7 ?
C.joe @ 89w.org' t9 M7 u U8 g1 t: c! @
D.jean-cóggeshall@89w.org6 C! a6 c) Y( c) V( G
E.john( B6 K6 k; e6 w l: Q1 X6 R
0 @1 o! a: |. ~$ c2 s( Y; A, d
: [2 ^- \0 g1 Z: r" y7 M) m2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
2 M, g; @% I _
+ n& s3 y( ]5 w" Y2 p, `7 Y4 a7 jA.Windows/Novell不需要第三方软件的支持就能实现该功能
+ ?9 G* P# @) a; s8 A' dB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。' e( s* P4 [1 N3 d0 C9 f6 o8 D
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
' ~0 s. O( F7 w: j, B& Y/ FD.有可能完全相同,这取决于sendmail_path的配置
; \: Q1 {8 w6 UE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口' W( k8 g. k, E6 b! P- d
: I7 Q: U5 q' C, @) A) V
" Z5 N- J' i, c# m+ x5 F3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?6 N: H* u7 {' }) _1 d
& e7 R k0 H+ w1 n* q+ W
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
* {0 J& \! U2 D) V G/ OB.用PHP代码,通过SMTP直接与MTA连接。: u/ w, z# W1 t' N9 I) C. t8 X
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。) y" e2 n2 H$ A, |; q. b+ b, Y! b6 S
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。 ?' i, D/ m: e, ]# I% L: U
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
; J0 d% w5 b' Z
8 B+ ~1 ^7 _5 K' l* T3 o5 n$ a. x+ f
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?) a5 R. b' p; l! b3 m$ N. s
3 D, [5 Y4 j# q3 X/ ]# o2 U; w3 G答案:____________
) I8 s% `2 Z6 R. [
% a+ _( \+ y/ {8 W' P6 X
0 ~: e6 v- \ j {2 h. t; C4 A5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)4 b- w: S' f! [( R% F' M
2 H; i3 e& j8 ?9 E' u1 d$ {A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示5 S! r$ w% F+ g2 \9 F7 q _' w
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片$ r/ F8 s2 g+ t6 t( W$ e3 `4 T
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
V6 j, }, R. l6 [D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
" n! N, c: @4 M7 t$ vE.只有一个答案正确
8 H1 O. Z$ r9 W6 P% o, ]
: r- w, K& ^; }: X
( j2 h- [# o* c* a m4 p6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
" F I, B" C6 e7 a+ N
5 G2 Z( A# p/ ]2 Z# T& o2 cA.从UNIX或Windows/Novell发送邮件时都会用到, m1 r. a2 a( s6 x# }
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时7 X+ y8 @9 q& L* x: v" ~
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
! i2 d1 L$ q% R8 p! SD.PHP里用不到这个参数
% m+ D0 p7 {' j- v
; D6 f9 o! n3 r8 W+ f7 d4 {6 M+ G9 m" t, E$ S( P+ l
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)? S5 @$ Z5 y- v: T
! L3 B4 x. `! n8 t4 X5 ZA.只有在发送非普通文本(ASCII)数据时* @8 |+ i: B# T8 o
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
% Z6 F0 L t4 M& z4 [C.任何时候都可以用它来指出MIME的编码类型
9 F/ i. j( C0 u9 }2 V4 k; B& gD.只能用来指定特殊的编码格式(例如base64)8 A! E$ ^4 H6 ~5 @, ^+ o- R, V
E.以上都不对
# h2 y6 l2 _' p# u% y
0 L& d# u. q: y' F, O9 U8 G- O/ C' `; u8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)3 e" F3 @# X! C) q5 a! x, L; x
0 \. B* f' I6 c" X% ~/ M: M
A.分隔符至少要8个字符
1 W0 S# n. l, O: z2 _B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)' Q5 A. m4 ?( X# A; G+ m
C.分隔符在MIME邮件中必须是独一无二的
W8 l" b }* X! {D.分隔符不能嵌套的其他分隔符中' m3 L6 n6 Q: U# D# H* a
E.用什么做分隔符都无所谓
9 J% H, f2 t6 m2 C$ R) N
: t2 v, a; ?1 e5 o" A* L# j m7 B# Z+ z7 n, d# w% h
9.考虑如下E-Mail:
7 q/ |9 E& l" m8 |& v( [! C
% f v# [7 u4 B+ t5 s) l9 qFrom: John Coggeshall <john@php.net>
7 i& p c W6 Y1 a: tTo: Joe User <joe@example.comt>
7 Y' h0 _3 f% ESubject: Hello from John!2 {: W( j7 ~ n- k" k0 ]
Date: Wed, 20 Dec 2004 20:18:47 -0400
9 C* A; a4 r2 i i& t" L) rMessage-ID: <1234@local.machine.example>% P5 y% X2 H( D1 F; Q, P' E
Hello, How are you?
, ]& n7 j& U' V1 L- T+ M6 t2 ^5 S& Z4 q3 s5 y% F+ v
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
) E3 N6 }+ i! m0 D' C) f% I
0 ~1 j/ |* o2 cA.MIME-Version
' M, M& L# K7 P. u: K/ i/ GB.Content-Disposition
O. S @5 K) b/ MC.Content-Type
5 F7 B: J2 ]2 C; mD.Content-Transfer-Encoding
p2 ?" G# K/ J) j7 AE.Content-ID8 e# {4 p$ k7 r: w8 |3 q
) F2 |$ @9 H1 N! d* w
1 w8 S8 q% A6 E( Q( u0 k10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?5 _+ ?: d# W) P7 F
7 P# _1 n8 @7 |7 w! o9 E
A.multipart/mixed
7 w0 i$ L3 b }4 M) xB.multipart/alternative$ b8 v! m, h5 C, h' S, ?1 b
C.multipart/default; p8 j& W9 l p& v% [: Y5 b+ i
D.multipart/related- J5 l1 i7 G7 f6 m1 |) d8 P
E.不可能用content-type实现
0 G, Q& N' j' Y h1 \" x6 r: e0 g) P: L& s
. {9 E# E; u" j" g. {
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
6 L- T) {# O6 y+ Q+ [8 n6 N/ |
1 d/ R6 q2 `( w) P3 xA.安装sendmail服务器+ {0 a! K B1 |# N7 G& I# L/ ?
B.安装Microsoft Exchange1 f$ o, h) H4 b! X, m/ U
C.在你的电脑上安装任何一种邮件服务器
. f0 S' |1 ]" D) b; ? ~+ SD.改变php.ini的设置% {; p) z7 t; y' c2 p! \
E.写一个连接公共电子邮件服务器的脚本& h( e' I7 Z2 e2 `
9 i8 d' c) F: W5 r& O. _( d5 \' }" V" w9 ~! v9 s) L
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选): Y. e: [) B0 J4 z' Z6 E- ]( N& E
; ~, g a( V2 a. c
A.使用GET方式传值
- M" x' |3 K3 \0 P2 RB.用htmlentities()处理电子邮件地址
) x9 y* i5 G4 H; G% q& _C.使用POST方式传值
; @8 E8 q2 I7 iD.用htmlentities()处理邮件正文6 r9 p2 J! c8 Q9 j. f# [0 I) `) T i
E.确保填写邮件地址的文本域不能有换行符3 X5 y+ J D. t" b
8 {% t/ p' `' [8 ]
D6 g; |% J2 b% n. l4 b* m13.如何将一个数组作为附件发送,并要能在接收后重新组合?
/ G) ], w6 C, M
6 u& J* o3 M# H# X, O- N# Q8 ]) x MA.用serialize()把它转换成字符串,再用htmlentities()处理一下* @4 g; m/ J+ J( t* f- _9 x# C% f
B.把它存在文件中,并用base64_encode()进行编码3 ^# W1 _/ g/ y+ p e- h
C.用serialize()把它转换成数组
% _: E8 g! B: s! G/ p7 y) eD.用serialize()把它转换成数组,再用base64_encode()进行编码1 G! n$ A3 z/ ^2 G( Q. l4 K( }% N
E.把它存在文件中,再用convert_uuencode()进行编码
! l9 W& l9 X$ [: U; f; _; d9 {+ f. ]" _% H$ x2 m' T
; w* @, l% m! K
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
# @4 W* U f7 {4 }" v! Q; h7 `+ |' Y$ S
A.堆一个检测脚本出来
! C; z. A. O. t# yB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型1 j9 s; ]- }* s2 [, w8 L, ?. H. R& e
C.写一个识别文件MIME类型与内容是否相符的函数3 q% V& h, f3 c; Z- B5 @
D.使用mime_content_type函数8 }2 n% l) ^% G3 M7 c9 U
E.把文件上传到外部服务器上) |6 `" l1 u8 k }# {7 `* q- y
0 u S/ C$ v/ T. ^9 Y+ \& U' W, [
: [/ C% V# M# V" q- R' A15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)1 N c' O4 r& Z0 r' T
# y8 f* h" b) o- x+ \
A.添加一个From头信息
% g# M+ u1 V& i! U) e& rB.使用-f参数
2 I+ I" B5 Z1 N# m6 TC.添加一个Reply-to的头信息
& { O# c7 }) k* J$ `- b% N6 MD.确保运行Apache的用户有修改sendmail设置的权利
, U" b4 Y9 \- OE.确保Apache在root用户下运行8 q' w5 d. p c, s
答案速查5 Q7 u1 f) _/ ]3 s
1:D' k( S9 V L" X2 u3 K
2:AD0 Q' y o3 z0 d; k1 C% k
3:E
7 J& `6 P$ R; f7 K4:Content-Type:MIME
& D2 C! {3 p$ e1 D! e) h$ J. y5:BC- m* C0 G1 C i z$ L
6:A
7 N6 j6 q4 n0 @$ \7:C
! f* K% g$ S, i! p9 ?! M8:BCE
3 s; p f8 B4 u+ L, b; `9:ACD
& c) j8 }6 X% l3 e9 V8 C10:B
1 Y* p# H/ V0 E7 w. m$ @0 F11:D$ f+ `" G. H* I$ w! o. W
12:CE0 W0 j7 ^1 b, O3 E8 r
13:D
- I2 y- ~6 v3 P, @8 e2 ^14:D: D' R7 ]4 D% t
15:ABD" P; k' j. X) G3 |7 M. V& M6 \
4 G. o$ b2 O4 N$ p
5 v4 p G6 ^6 |" L5 x4 h4 h, N( M
* U" b- T7 G& E" D2 \) L, h答案详解3 f O J7 S) o( M$ F
, E2 L8 ~% i* F! r) F1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
* r7 v+ n$ Y7 Z: K
R" h9 x8 e6 B& y. e7 A2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。$ h2 s3 w& d: `2 z
! o* h3 g; O/ Q3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。 U0 P. x0 f+ n1 T7 b, {9 r
( l, H& x$ H5 H; `
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。3 k$ v' M7 ?& k! J
4 {5 Z3 `! n/ @% J( x: v5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
2 I( u3 g2 f9 A3 x
; S, J% W, M2 |3 m8 o1 K6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。* J4 b4 d* o% Y4 C+ r P: O: f
3 V8 G8 {6 X; f5 o6 {0 X. j% l/ m7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
( r4 p m0 _" }+ V' J# t
; Z- b7 H' w+ H1 a* G& P8 }8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。) U/ r2 J2 p# K
! R, Y1 v% z& l0 o, D9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。$ o4 B ~1 i) E' T+ j2 t' E/ o
& z4 P% }. _7 Y% f) @6 ^ k. g10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
: L( H' F9 b% D: j8 w2 Q
5 e( f7 Y+ I& k) P) _11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
2 C7 g. e5 O# |. v. L; n1 b
7 w T' e9 `+ w12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。, {# z1 s* F8 Y: D! P; ?0 o
: N& i7 J, v- ?0 f' x
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。+ i4 ?# n m( }
0 W9 m9 g4 b% ]. |1 H
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
, G& y7 P, v9 t( H6 r9 O: \
. c: u5 D* ]. v$ B+ T3 L15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|