|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
2 W- {6 x( C& v% z# ]1 H3 p% ]还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。; E) t/ s J( @4 m" Q" r; E8 \
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。# D, T6 W e$ e, h) X
5 T) k, n$ s* o! Y$ t, n7 u- [6 J M! l( O, N# O: N
问题' V0 g) |$ `. T. M; h) i/ p; v+ ] S
' |, h2 z$ O; x
1.以下哪个不是合法的电子邮件地址?& }6 W1 H0 J! F0 U+ Z
% d* _$ a, z& ]; h8 a# c7 j
A.john@89w.org
* F8 M" x$ n2 b8 Z7 L8 O; jB."John Coggeshall" <someone@89w.org>7 f& N( W. Q/ a& t4 Y( t( k
C.joe @ 89w.org p# D; F$ v4 ?7 }. W. Y& G
D.jean-cóggeshall@89w.org
5 R" }# J% J3 s; {% JE.john
f3 C+ O) @$ I% S7 p$ Y/ M' d' @
- ?) e% C8 z: T- u! L( z$ |# g* A
7 K j% t: m" K& ?4 l2 l2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)) R, @6 P; [$ p1 Q: g
4 M% V& p# t4 h; f# k6 h5 r
A.Windows/Novell不需要第三方软件的支持就能实现该功能4 D% v# q) J* A, Z% W$ @9 f, W
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
) Z: U* Z' p0 b+ N$ P3 ~- S3 Z+ h. zC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
, ?+ A, Y6 V) A, bD.有可能完全相同,这取决于sendmail_path的配置5 J* h( m; ~# n6 I' B. o2 `
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
8 D% f3 e# w2 L" _" I1 }+ j
: Q! x/ T% X8 q8 q
3 c" @4 N( D$ A) w/ L3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?) _% i, u0 a" b! h* F% [2 ?
( c+ ?. c( l/ q& a$ S$ L5 }
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
" e: O; R1 W1 ]2 F9 ^B.用PHP代码,通过SMTP直接与MTA连接。
4 V9 x: W- Z. E1 b, s4 VC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。" K# V0 S" l) {" z% \
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。; ]2 ` E; M6 O2 l5 p
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
8 }5 f9 L7 W- ?- X6 ?" w9 ]1 W" N
C4 z1 p$ d% |' [4 z
# ?4 ?( r0 p1 r9 Q1 z6 v4 J4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?! ~* v M4 L4 H, h& L* a
* z" l# X7 t& H9 r8 K: F答案:____________
: e9 k1 h6 u j& g a
( k8 |* e3 d ?0 l
* ]2 M, J8 l6 K% J z: `5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选) w+ `2 H. n5 F/ `2 Y
4 J- S( O7 v! E4 ?8 N
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
6 o9 z: v N n1 l' s- N. LB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片 x2 Y2 J" l" i2 z6 X
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID2 F( y6 I$ W9 W6 |- ?
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
- A/ J1 o; |5 k, h5 ?E.只有一个答案正确
0 v. n4 T. y, U) U h! V+ l" {1 A7 Z s& W* g
P7 i2 |$ D9 T+ u4 L- O
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?1 ]3 }9 z( M! b' W4 {# v
8 t9 ]0 l4 u/ W$ S
A.从UNIX或Windows/Novell发送邮件时都会用到
; S) P, s: L. v1 @B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
2 c# @. K* h4 r4 L; G% `: C& @C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时$ G8 j0 C# X p; x! i2 n' _
D.PHP里用不到这个参数
( i8 n0 C2 G* F' V
3 T% D0 a2 E5 d' l. P
- f0 L- }& q# ]7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?. Y' X9 u) f& r$ w! H
/ k# ^( M0 t) i( F ?- RA.只有在发送非普通文本(ASCII)数据时
n' q+ S U8 w0 m5 P: ^. xB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)/ ^3 n4 y3 V* \
C.任何时候都可以用它来指出MIME的编码类型
/ H/ g: d/ _' f6 _D.只能用来指定特殊的编码格式(例如base64)8 g2 D2 c9 k, |7 j! U" s
E.以上都不对( c2 a& P6 k6 l* H' i
* b# }) ~+ {& l9 V
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
/ t6 t! i2 I7 V& @. f
+ s7 f5 V7 C0 l# qA.分隔符至少要8个字符5 R0 J# C. \* {; u: R4 ~. ]* ?+ e, I/ P. \
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)- \/ o; l& A( i- b/ W6 E
C.分隔符在MIME邮件中必须是独一无二的! j9 {) A+ U: r( T. C5 N- X/ t
D.分隔符不能嵌套的其他分隔符中% Z( u1 A, N0 s2 v+ B3 A
E.用什么做分隔符都无所谓
, m0 i# U; C/ m4 _5 H! P4 R6 D* v: X% o+ u
- g' [! H4 U* y% h
9.考虑如下E-Mail:
8 h; `8 B7 L+ d5 G" F# t6 K, e
" k6 y8 S8 e$ ]' y) wFrom: John Coggeshall <john@php.net>
: n, H. r( p! g, M: v2 d, {To: Joe User <joe@example.comt>4 Z6 ?! @% W% g% J* w/ J: U
Subject: Hello from John!
% Q% i% K# r" B6 m8 h4 nDate: Wed, 20 Dec 2004 20:18:47 -0400- K) ~, R2 X( ^9 ]2 K+ ?5 a
Message-ID: <1234@local.machine.example>
9 A0 F. R; l- W3 l1 \$ V# JHello, How are you?: q9 i0 V7 ~* N7 c' A: `2 S
' y$ q# O. v7 J ^0 G( x在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择); z. F! f# @! a* p8 E
3 q/ g! ~- O8 a1 g0 ~: L qA.MIME-Version
- f+ d# d* T* E9 \B.Content-Disposition8 p2 r# ?& U* m" A9 I
C.Content-Type/ W/ l: |1 j1 n8 Q" ?$ N6 ` ?
D.Content-Transfer-Encoding9 r1 I5 e# ?8 O( e# O" X6 I
E.Content-ID
& Q+ _) r: c& z4 d! f9 @2 \2 |* W1 K1 p( {
|, N( U* R" ?10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?2 q5 i. i* f* V/ a
3 N/ t# [* O, I+ p; t$ n$ t
A.multipart/mixed
9 A0 N0 c& a, j' i! Y9 mB.multipart/alternative
$ V: d" P0 l! D V3 ~C.multipart/default- Z: y' h0 y/ H/ n" e# ~
D.multipart/related
; [' w$ ~6 ]0 z/ i9 T3 WE.不可能用content-type实现0 i8 v; i1 k' |# f2 ]( @
) Q8 E! Y$ b3 J1 q8 w! x+ ]7 `0 O9 u
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?( p# V0 V1 Y6 T8 w3 z1 x( n
! ^: w$ Z* _, c7 C; p
A.安装sendmail服务器
" G& {7 P$ j/ p) h, }- ZB.安装Microsoft Exchange0 m6 E) l+ `; x6 y3 m
C.在你的电脑上安装任何一种邮件服务器0 B5 q/ m) K* Q+ g( O* _! B- B% k7 I" ?3 ^
D.改变php.ini的设置
: ?0 O( s1 d1 E5 r4 V6 Q+ zE.写一个连接公共电子邮件服务器的脚本# I& b! _# @6 X5 X! s! U$ T# g3 ^
, t- X4 q# G/ n' ~* _! }/ P
; E; i# T v( f! k# ~5 X/ e12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
" O( W# G2 s) z& J
$ h" E3 g3 s7 @$ yA.使用GET方式传值
6 T+ U+ m% @, ^# i3 UB.用htmlentities()处理电子邮件地址: [7 s# {, }8 U) a% f5 d
C.使用POST方式传值
" V8 r ?% y: P0 C% J; wD.用htmlentities()处理邮件正文1 A. w6 C2 } G0 R8 h5 @
E.确保填写邮件地址的文本域不能有换行符2 }) S8 ~4 F! ]6 a6 C, S
* B+ n4 Q j- B8 z/ [8 Z- q, k, v: z2 \ ?( V k
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
]/ A. V, f9 Y* L/ l# K
) s; S) m+ }0 J% X! k% |4 m# DA.用serialize()把它转换成字符串,再用htmlentities()处理一下9 G( k7 T; o/ N" x
B.把它存在文件中,并用base64_encode()进行编码
; P2 p/ ?9 x# K$ V: J, i, JC.用serialize()把它转换成数组# S4 F6 ?4 c3 Y
D.用serialize()把它转换成数组,再用base64_encode()进行编码/ t0 C& ]. k* l: N( [* T$ L5 L- |
E.把它存在文件中,再用convert_uuencode()进行编码
J" Q# w" h- s1 _1 d
) x& k& ~% ]7 Q9 k; Z6 L* O+ J
3 ~1 K: L+ N" J& T7 W$ d. W14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?& p6 P6 U; L5 a1 A. v5 S- W
3 i4 r/ [' A7 ?1 h8 d6 ^) {4 AA.堆一个检测脚本出来6 }- s; d- e% m; e+ u: f7 |
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型! k- n3 z6 a7 \4 n7 ^4 n! h+ i7 h
C.写一个识别文件MIME类型与内容是否相符的函数; Q; q w* i% e- f ^
D.使用mime_content_type函数4 i, a# X. G: x T) r* z
E.把文件上传到外部服务器上
& N0 E9 c# t! ^* g! }2 W+ B" R& O0 `6 {3 c4 g8 X
: @$ s) [% G' y6 I6 |' G1 p, E15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
3 ^+ @% }' }% H* E; E' W. f0 y% O. \7 l
A.添加一个From头信息! _& M* [# S8 B" S
B.使用-f参数# D- R7 G/ k5 ~7 Y# q
C.添加一个Reply-to的头信息1 y5 |% D8 h- K
D.确保运行Apache的用户有修改sendmail设置的权利
* V" j s+ o, Q9 c6 t8 rE.确保Apache在root用户下运行7 a. k+ l, P8 U) {5 y7 t
答案速查
7 j* t5 m. j- X" T# U- q! u1:D5 A. i$ a) t* \, u4 ^1 P
2:AD
8 b4 \% X9 l* a& }/ u) U4 M3:E! T5 Q2 [" n9 {. ]% P% F6 \
4:Content-Type:MIME; N7 ]2 w0 e& k# F" m" u9 U& P
5:BC
' O J% p( W+ t7 k4 t& L6:A, ]/ K0 h* W7 e& i1 D
7:C
% H4 ]; p9 X& U6 G! H8:BCE
5 w3 t6 p' u& f d0 x9:ACD z# ~/ q1 M$ u. [* D% |1 M
10:B6 ~" @. V" F4 C; W- d* T
11:D
+ J$ c, r- Y- B3 U12:CE
! U a8 G/ b' ]' `$ z5 c1 W9 b13:D
* x/ Q/ x* R$ W9 Z3 a/ E) z! C14:D
e7 P6 c9 r/ Y! H( F N15:ABD% A2 a# ~- g% k6 r
7 ~) l0 g6 G6 t6 v5 c% E* x7 Y
( o' ~* g0 ]" s/ D S" K$ u( G- I2 e. [2 t
* u- G, m; S6 i- P: u答案详解
# E* m( \! i/ J9 b
; x) c4 P; `5 t. [7 s* Y l1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
% ~! b% N z0 L5 G7 G# J; ^; g ^8 ]4 X3 R5 ^7 f: Y8 ?0 R
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
+ o# Z) W3 c" T$ S' r- Q/ D7 L& G3 m8 _: _( @3 D
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。; B3 v R8 F9 Z6 J6 K! G" Y) l! {
; u- g- Y) d U8 W! [9 A
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
; p* C+ m P! f/ O% L8 O+ O: E7 R4 u( N
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
' _! `! w9 R4 t! |( ^
- O8 y. z( }& @4 Y9 K) F, K- h6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
9 O1 R3 O$ n; d$ n8 [6 E, Z0 |- Z" [" M1 ~, F, I
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。2 B/ H" Z6 o- i, m
. M) N- C5 Q F
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
w, z, n2 e3 ~
0 f4 Q6 C2 |8 e9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。- R# T1 O4 F' e5 q5 O3 D! ]
, O7 ~) @: S0 b
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。' H, j" ?# B/ s, {9 F/ ^/ E
r+ L7 w* v; [( ]0 b I11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
: G) Y/ {6 e* u, c' r" `
$ [+ P; l8 t4 x8 L12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。5 g5 D2 K- ?5 D, ~
0 M' J+ ]4 u* w8 W5 N13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。! B: R, @( a4 D" n; m$ B8 n% u
% r9 H2 A: d" ~! g. W; Q3 c; s& ]
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
7 E6 q; u" N# E8 x
) n: L" x& J) P. |; R( b+ T15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|