  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
9 @# I5 G% M6 J z2 a; I8 \ s还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
! O! Z0 U% P# v; L/ j用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
) K* U, P. x- A
* U) G% o' p' @0 d8 G- _4 |! N- J8 m* Q- D. a7 z, t5 q) u" P
问题/ y/ J, d0 \% w" z1 f0 y
5 H8 ^ \: S: i7 H8 \. E& f, d
1.以下哪个不是合法的电子邮件地址?
8 L. T$ N( V" I" e! c5 X/ x0 ~: z
8 Q2 K$ E: e( V" j. X: V1 ~4 gA.john@89w.org c2 \$ L, |9 t, M0 r9 X) M
B."John Coggeshall" <someone@89w.org>6 F `& X$ Z- }
C.joe @ 89w.org# I; x( ~- W9 e2 O
D.jean-cóggeshall@89w.org1 A# U$ } } [' F9 s
E.john
; l; m0 y$ {2 q; Z; Q
) a0 s/ e/ q; r0 P+ Y4 h- s4 f$ F7 Z+ h
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
* Z' M& W {# Y V# l& Y( i* c3 f+ f( |/ z$ ?/ D, K; G
A.Windows/Novell不需要第三方软件的支持就能实现该功能: B* \2 `' L: D; E! U% Q
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。( }# X7 F# {/ j
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送+ O, R4 A* U, p7 H; W6 J9 T9 e
D.有可能完全相同,这取决于sendmail_path的配置1 \ R; N/ O* R% K( R( b
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口0 P+ U3 F1 m) O9 [' p$ _
, B% Y8 A- F8 T9 W; }1 [% f. v: c! j7 e* G: a3 d4 r( X$ u
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
' Q9 P8 h+ u- o: l! t2 o; G0 q8 g9 P P& X
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数' I/ K7 N7 k, n, ~$ W
B.用PHP代码,通过SMTP直接与MTA连接。+ l" m% ~& f! S; {& L5 r, V, @
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。2 J4 c7 U( X3 v0 ~& t9 Z
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
. M* b. e0 a; B6 AE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾5 u6 G5 ~) G# x( Q
4 Z2 u& i8 l' G- R% X
: _ t' i1 ]4 W$ e
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
; g/ x7 J1 S4 B8 V4 v i/ m* g8 v& `# b. V
答案:____________
. Q. Y: A+ S. Y% o/ i2 x
, j4 `+ P- Z {& p/ p& R v' }7 z" @
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)0 s% a( s2 g) m# J, p7 U
5 V! J+ }0 w" \: u' JA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
( g, P* E+ P* g1 ~; qB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
6 R8 k5 }* Q2 yC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID7 ~/ O& `0 x# E$ W
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
. n+ N- }6 }/ ^+ r/ fE.只有一个答案正确 z' b' a/ A5 y' {/ }" h% D
% ]3 f5 B* U7 D- D7 b# R$ i
0 D p& n3 R! c+ f
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
1 s+ T9 V9 J9 {- }
4 ?& K; T/ |/ r$ S) s5 vA.从UNIX或Windows/Novell发送邮件时都会用到4 y! Y% f$ ?" ~# h/ e
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
: ~' Y5 f# G4 ~: ~C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时9 J- Y" o9 l, W5 y
D.PHP里用不到这个参数. b5 L! ~4 M4 h
$ B+ k. ]3 D! _0 w6 r N9 F
" L1 j) u) E! k7 R
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?( B$ F' j% @+ i6 o1 S8 w4 l
8 k0 a6 l1 W/ G% S
A.只有在发送非普通文本(ASCII)数据时
' R+ i! _" {( _B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
6 B1 Q9 ^7 h5 @& PC.任何时候都可以用它来指出MIME的编码类型
- a4 f& Y0 d& ~( s' X k* w# aD.只能用来指定特殊的编码格式(例如base64)
+ Q9 y1 d- T; s. R$ [% g- O9 BE.以上都不对
4 H0 N6 @& P1 ^' c5 l8 m% H8 o- j
2 S8 ?$ K7 U+ i. P8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
: T2 @' l# Q7 `8 v& A# }/ e
7 `* x( C$ p1 z$ |5 HA.分隔符至少要8个字符4 n! M: L; I0 Z: z
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
, U9 I( |. R: H/ y8 ZC.分隔符在MIME邮件中必须是独一无二的6 i' r; S: v/ h, V9 T
D.分隔符不能嵌套的其他分隔符中$ p$ Q! J2 I$ O* {+ ?* N
E.用什么做分隔符都无所谓9 t- c+ ~. n' E3 [0 J" r; [' H
& J8 [9 P. k- B' J' n9 J% v
; o/ c+ m: x3 q9.考虑如下E-Mail:
+ j; B8 a4 ?* U: O' d' H9 K$ V' t7 M. G% m0 h3 E" E
From: John Coggeshall <john@php.net>
% `! b* Z: f& L* E* Z/ q: fTo: Joe User <joe@example.comt>
3 l& X; l$ P7 D# Z9 OSubject: Hello from John!: c) @! T/ y' F1 X
Date: Wed, 20 Dec 2004 20:18:47 -0400
; t/ a( q: C, n3 k( wMessage-ID: <1234@local.machine.example>
8 t' q# {( G' u6 w& _8 j; u6 A! jHello, How are you?1 i& Y6 c/ x, O6 \+ g4 J! j2 w
2 [" l& v! a* ~/ K) F; q& B1 [% W
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择): b/ V+ b& u3 z* l: s; d) u
" N" ^- V0 G6 N% G
A.MIME-Version
c) N6 I2 X" b. R( [/ CB.Content-Disposition6 \( Y7 G1 k& M0 b2 A. g1 l
C.Content-Type
' g' e# ^( ^5 I7 ~: D) N' I3 M U' _D.Content-Transfer-Encoding
2 x& k' }/ P+ J6 A3 EE.Content-ID$ C0 L( I, s! A1 b, ^
) q3 a5 L- f( [' j6 F( p
6 t+ f% @/ S; T& f10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?9 y P& p8 J7 F8 m9 e
# S5 i3 i4 h4 K/ [
A.multipart/mixed1 r. k2 m$ [7 K; |+ i/ g
B.multipart/alternative
5 Q: q: j9 u+ MC.multipart/default
, {! J$ O: M! P. I0 v7 t+ ID.multipart/related
' r- _4 V+ h: {1 }: F0 eE.不可能用content-type实现
) t$ Q+ O; O* O5 B- B1 V, r7 K0 l5 t2 O
' {0 ^ g0 K( m# R
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
) X ^) T# S& W% x. k" }& r
$ D3 Z/ I+ a" x3 y3 a7 ?4 S: y9 qA.安装sendmail服务器; p" W. |! k; P- j
B.安装Microsoft Exchange
9 Q! `( {% Y! p1 u' p, ~C.在你的电脑上安装任何一种邮件服务器
0 A2 V/ b" @ w9 aD.改变php.ini的设置) U y9 p7 g4 q6 ]0 h, y7 P
E.写一个连接公共电子邮件服务器的脚本
i: u* ]$ |' ?% z9 v4 b1 k4 O; n
% h1 W( C5 h# X( I- T# N' h! s) Y
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)# T" Y/ o% l1 H: E
) _* p; n9 g0 G: p# @( Z) eA.使用GET方式传值& o5 A0 ~" X# ~
B.用htmlentities()处理电子邮件地址
) t0 l% Z+ ~: v) M1 M" D; p, l1 y9 CC.使用POST方式传值: s) Q) y4 ^$ @5 l
D.用htmlentities()处理邮件正文" j% G9 ?" ?! ^/ M8 i5 T
E.确保填写邮件地址的文本域不能有换行符, o5 N3 T2 j/ z; ]( O
+ i% t9 r6 F9 s3 s6 I M- t( B% P; \+ j& _" C# H0 j/ l4 F" M
13.如何将一个数组作为附件发送,并要能在接收后重新组合?# Z' e3 \: r8 |5 z d- ]0 B4 E
2 E: H6 T$ Z1 _: ~. E$ u: d; gA.用serialize()把它转换成字符串,再用htmlentities()处理一下6 ^* s) G2 W! v2 f" T- _& y5 \) L
B.把它存在文件中,并用base64_encode()进行编码
8 g3 _+ |3 o8 j* u6 z- c. RC.用serialize()把它转换成数组
( y+ [' S& t5 _D.用serialize()把它转换成数组,再用base64_encode()进行编码3 d$ d4 {( g% G- ]; @1 t
E.把它存在文件中,再用convert_uuencode()进行编码
/ D* \6 p- W; B0 ~! l* C7 ]/ [5 b$ @; u
" |! r" f; _- y; Y, m; ]. }
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?& K4 u2 O' W/ q% D1 \) _, `
9 B5 U7 ^2 ]2 l4 k
A.堆一个检测脚本出来
% n4 D* w1 f! r$ aB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
$ V. E* x1 L9 ?6 p! g: Z; PC.写一个识别文件MIME类型与内容是否相符的函数9 i* I8 J& [! z& P4 F
D.使用mime_content_type函数8 L- X, k' J/ \8 N `. Y
E.把文件上传到外部服务器上( U0 l/ @; Q2 a6 g A* g% k
, `6 d- [2 l M5 _, X' P& ^( h9 {9 s6 n' `% S% K; R) p
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)+ `5 Q2 r; i' _* F" U
+ b8 ~6 U8 y& [5 x8 c$ q' A$ D9 \
A.添加一个From头信息
/ m* L \+ o- r9 h( RB.使用-f参数
. [0 |' o6 W9 M* M1 ~3 pC.添加一个Reply-to的头信息
% F- E; ^- @3 J9 gD.确保运行Apache的用户有修改sendmail设置的权利3 w( n. {1 T7 s+ P. k7 |2 Z+ y
E.确保Apache在root用户下运行4 F+ D+ {& E+ }0 S( ^& f; N
答案速查
# S- k! b9 v/ ]1 ?3 C7 m7 B- F) b; S1:D
0 p" f3 R# Q2 f, @2:AD
: ~; l' m ]+ Q; E# S! P3:E
0 Q5 w3 ?8 s# `' M6 I4:Content-Type:MIME
; i* ^9 j1 t5 |: ]0 j5:BC- u, Q6 Q+ x% s1 N
6:A
+ {3 P F( h) `- I e7:C
* O3 K% U% g1 M$ ~+ p" u8:BCE( v- u% o3 l2 }
9:ACD
' z3 X1 g5 h1 x8 N10:B
; I& e I" I1 E11:D4 R- \$ S/ Q ]; V" x
12:CE" I3 H0 j; E4 |/ p
13:D
2 }/ b' S. E0 H0 |$ O5 f14:D/ m" i& u& o: y$ E- f0 @
15:ABD
- Q0 H( E0 ]& ^2 K* z9 L( U4 B
) E7 P, M' S- D9 j
) \( |" f8 P: z
( s# y2 o+ p: C答案详解
( T ~% H0 ^$ A6 ~; I/ j; M6 M
7 w, _1 s. b5 R: E( O6 b1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
6 ]/ k+ U# q1 P# P) r
! p+ q9 Z! T* J7 J2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。( _! g& _1 O' i$ b3 M9 x; o' \% }
- A+ G3 C' N5 d0 A
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。& n! O$ k1 D) W/ F0 G
8 {# |3 \" m5 S5 L9 {4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
; g2 _1 m4 a9 k5 q# e) k2 i7 H& K0 a& l& D8 q. r; g
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。! q1 j- Q: g/ ?! E
& x+ Y" i" E; v6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
" f2 y/ l! o4 p3 x; U
) h" v8 L+ K# c) q0 |7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。1 N; U8 z/ z) a3 S: G
& X3 V! K! X0 k8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
9 x; i3 w+ \ A) J
! N/ _3 e; C ]& D9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。4 h9 r+ A5 C% Q" G. N# @& X' `, g
3 o4 @! Q! |8 v5 M10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。6 N# U* Y5 m8 e+ X5 h% M9 c
+ M$ e v0 t. g* |2 s: C0 V
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
. G: ^! E# u0 V' q: P
7 H* P2 g9 E8 g2 ^" V12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。1 [) _, |0 @" J
- E7 q; N5 @ A13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
( J/ h& J9 s+ k6 x
+ f p2 J. m0 G6 E14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。. `3 c- y- O! L
. t- Z9 [# r; i; `8 N8 {* e+ O15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|