  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。3 G, X* k! w; V2 i( n; A
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
4 Y$ L: N. @" l8 Z用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。# `" f: S7 X# o" k
2 Z( O6 i: _% j. F e+ P% O0 o' H
$ x; t! K3 `& S- z& r7 S9 { W6 V问题" a, @# T. q v
6 u1 H+ q- k% t; J' z) L
1.以下哪个不是合法的电子邮件地址?
$ g! i5 x3 u2 e6 r E/ Z2 H7 U+ p2 S& p. J! ^) V6 @
A.john@89w.org3 ^' ]( L4 [* A
B."John Coggeshall" <someone@89w.org>
' h1 @- ?/ o, f0 UC.joe @ 89w.org
f) E, O2 R* n$ B5 N! B. S4 X8 J" ]1 SD.jean-cóggeshall@89w.org
4 X' f- d" `2 b1 _* @- YE.john- W9 [9 E9 w3 Z" I% V' B
/ ^7 U" J2 j, x) b! N, v& E7 J
7 w( P3 G3 U' Z* n# A# [2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)* C# H- p: y6 [- s
* r, y- v! `# V9 A% z/ `" P9 t6 R: ?
A.Windows/Novell不需要第三方软件的支持就能实现该功能2 ]2 ]( `2 J' Y
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。" h9 N+ P/ N# l8 f5 t3 |
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送) c* s8 P' g" X) N7 s8 I9 Y
D.有可能完全相同,这取决于sendmail_path的配置
5 Q5 m/ V+ N9 A9 BE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口8 z; L+ R$ k- T# |* {0 B- l. v
# K B {4 M' X& d
, b9 J8 s% e1 p6 _3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?8 V5 q* l' b I8 T3 S6 Y/ k
2 D5 g; k R j7 J. w- }' ~8 [
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
/ t6 k. a* x1 s( rB.用PHP代码,通过SMTP直接与MTA连接。
, @4 T7 s1 q0 W3 k8 T5 i' r' mC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。4 P c U( F9 n y
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。% r& d4 F* X1 `+ {! C( r2 y& X6 r) ]
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
# B& D5 y6 b4 U
/ t8 t( L2 ^' K
1 ?0 Y3 n& K4 U$ U5 c4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?" P9 O F) F4 c/ m1 r6 V' l
1 l& ]# B7 @& K9 w2 a+ m
答案:____________
Q$ t( O. Z7 M5 l5 }! U& ?
( t9 k9 h4 b2 I7 F; i3 Z: q7 C9 M: j \% B. |# {6 [
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
6 P/ B7 O j3 X/ ^, b
' r" q2 V9 a' h9 J F6 T1 yA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
" h' b4 y! ?5 KB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
; R5 A$ I% Q% |- o0 @C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
2 C9 U7 P; p/ ^5 W" W% Z. U2 x! SD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名) D% ~* ~2 Q6 n4 c- G) f. h
E.只有一个答案正确+ h& b) z0 u, g, V5 ^3 j. K% P
) r4 v7 m; {! Z& ~% ^9 a; t
# Y! X2 u/ A2 r+ q3 h$ b: ^, ~
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
0 @+ w: ^8 g! w# O- c% a* ~' B) T& v0 r/ a
A.从UNIX或Windows/Novell发送邮件时都会用到, o1 T5 o+ a( z; {
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时$ C8 G: n) O+ ?0 ^: r$ Y
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时0 l/ _' p. f- E/ ]1 d0 v* a
D.PHP里用不到这个参数
2 e8 t- A+ M0 m2 R$ U* Z8 N/ ?9 H. d( H3 ], q
) v/ f+ f1 e/ {- Y7 Z4 t; \4 W0 W" J
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?* @2 e, X! S. q6 w% c3 ?" O
3 S' g8 t$ n: r) P% c% f& n
A.只有在发送非普通文本(ASCII)数据时
9 O, j9 b" m2 I; W3 d0 ~; x# P/ WB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)4 x9 W9 s, c; e
C.任何时候都可以用它来指出MIME的编码类型7 v3 ~# l. C' u2 ]& o
D.只能用来指定特殊的编码格式(例如base64)
5 S( Q- O) o; J2 ^E.以上都不对* k$ _3 z' K ~0 u: i! M
- \' M3 b2 p) g: y
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
5 t% ^1 O: [" P: `6 T/ T" Q$ X1 M
; `! y" D& j: r4 r/ g- RA.分隔符至少要8个字符
: b Q2 ?7 D; G, q, z9 wB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)2 `4 t5 a) w4 J ^8 [
C.分隔符在MIME邮件中必须是独一无二的
% p9 q% t/ f3 O! ZD.分隔符不能嵌套的其他分隔符中
+ ~+ y+ R+ K! v# x% T" [E.用什么做分隔符都无所谓& }. w% [/ J) q- V
' i7 M+ t9 ^0 O' Z g
- i) z* K: E# z* }, r* ]9.考虑如下E-Mail:- D/ k/ ~; ]" k4 A% F# m$ q
; F+ ?1 `* H0 \/ DFrom: John Coggeshall <john@php.net>
+ w, f2 _+ I! f- v( cTo: Joe User <joe@example.comt>. \, m2 |: o p8 Q* j/ O
Subject: Hello from John!
! d; x" ^+ g2 v) Q7 c5 {Date: Wed, 20 Dec 2004 20:18:47 -0400
* X9 M" a+ ?5 s( P' s, H! u" JMessage-ID: <1234@local.machine.example>7 X" W8 D6 q3 F8 J: Y/ b( {& b
Hello, How are you?
! N. E, j; C3 @9 l- |" V" j1 S. v5 l' m" z
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)$ r/ d, i& [& b0 W& {. i. r: u) E
@0 s# [* P5 vA.MIME-Version8 B( R; c$ z" x+ `! y, B1 `$ R7 X
B.Content-Disposition
& P3 b t% J/ G# J4 }* LC.Content-Type
8 z4 W7 W/ p6 R. N$ A5 d' i) }D.Content-Transfer-Encoding
( \' r# k$ X7 n- L: J- S: o- ME.Content-ID
. c5 B& [8 i g& h: [5 a2 ~0 d# B1 a q+ {" w! \; F9 C/ f3 ~
% ]; r2 R0 J7 ]3 F Z% C, H
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?+ x/ w, j# t; ~9 c/ j9 M. d
( p0 n* N; f. O/ R
A.multipart/mixed+ ]) L% U* K' R5 Z: F3 w
B.multipart/alternative/ F- E; w: `+ J/ w
C.multipart/default
5 |! N0 F: l `, U5 ^% H9 aD.multipart/related
1 N7 k \8 ~7 Z) ]8 a7 @( LE.不可能用content-type实现
3 `# V) I2 I( A8 b7 b5 l7 D+ n8 @7 A. m
) }! E, N' ~: u( D9 E11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?) g6 U: H* i Q- h+ q9 o1 `
2 O+ G$ u8 L2 q* p VA.安装sendmail服务器7 m& h+ L8 a( y
B.安装Microsoft Exchange# V/ n! p. d( I& F+ e8 o- ]
C.在你的电脑上安装任何一种邮件服务器% |. b# K7 x# [$ F d X, T3 r: u& }
D.改变php.ini的设置2 }: H3 b/ j5 }; b& a6 M3 u
E.写一个连接公共电子邮件服务器的脚本3 _1 _/ o4 r6 d. f \. j: |
9 E1 c* H0 R [' F; K
' G- o8 R. t) O' h, _12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)0 l' L# ~. S" Q V: A+ t0 \4 ]
6 m! I7 a# S0 T9 i- J( `
A.使用GET方式传值
" E; q' M4 r' M; x0 m5 O# j6 Z+ aB.用htmlentities()处理电子邮件地址
9 c+ h& H4 b! kC.使用POST方式传值
( s+ L: ]4 J9 Y2 I% YD.用htmlentities()处理邮件正文
1 s3 Z7 }( r9 M, ~' qE.确保填写邮件地址的文本域不能有换行符
, m, o3 A, N) A( P! ~( {5 {' h; z( H, D# g- q [' a8 f
a/ F. [" j7 t& P: |
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
6 ~( b2 ]" r$ u8 R3 c8 y/ { ~5 K: y
A.用serialize()把它转换成字符串,再用htmlentities()处理一下8 G9 n' r9 p2 K: p/ n
B.把它存在文件中,并用base64_encode()进行编码; h) p6 C V$ K. I
C.用serialize()把它转换成数组
$ K0 D; o/ Y. F9 C4 Z& i0 m" [D.用serialize()把它转换成数组,再用base64_encode()进行编码
! V7 m! T6 L# KE.把它存在文件中,再用convert_uuencode()进行编码
8 X# @' e4 J+ _ O7 y2 j6 a i
5 ^' v+ f4 I0 U9 C! L# O* W+ T1 t" p3 }; U& Y6 K1 C4 L
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?3 e3 r2 n9 v9 U! T/ F1 {
% u" c" z" g0 G" H4 dA.堆一个检测脚本出来
0 V! Y2 o5 o9 i- q; L( R- b: fB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
9 y; }. B( H% zC.写一个识别文件MIME类型与内容是否相符的函数
) c: ` ?. `) P% [* Y1 L) m7 q2 lD.使用mime_content_type函数. O. l7 [& B3 p) ]2 q- G5 V9 b
E.把文件上传到外部服务器上
" n0 E& B" b5 x+ L9 n# K, ?( E, _: I6 d/ U8 E& A7 J6 P+ U. _
- V! S5 t" a0 a
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)/ C# f! M5 q% A; a# o
7 @# @6 T+ r9 _- g; q3 c |
A.添加一个From头信息2 P4 C& f# `1 y. F) f4 f2 @
B.使用-f参数. F$ e+ X' ~) y- f' S# \
C.添加一个Reply-to的头信息: L9 k* \! `, n- O/ d
D.确保运行Apache的用户有修改sendmail设置的权利
. R: d; z. W I5 M& F& pE.确保Apache在root用户下运行$ G9 {; V' `! v! F/ a; I, Q
答案速查
/ S3 d1 T/ Q, l+ }4 ^: S1:D
% }( [3 |- T$ V8 W. ]2 u2:AD
* h2 [' v' J2 B; y$ r/ N8 T' i4 L3:E
9 v. b( g; Y2 |9 Q7 t4:Content-Type:MIME
( U# `5 Y U; \2 c8 j5:BC0 n2 D) v. _6 y. c, c
6:A
/ W O* t. N3 _% D9 P O! I7:C
# Q3 e7 M' L2 B+ s5 p! D1 g+ f8:BCE
* j* s) Q5 \, x# p$ T9:ACD+ y% }# t6 p, F: u, a6 Y' p- P4 M; X
10:B6 l* j5 ~* K2 ]! w; c
11:D. w' K. c! ?% M E: Y
12:CE! ]- H9 z7 |3 i& {* O
13:D
+ G/ L9 j' T0 R% A4 q4 s( H14:D/ ^- q T$ O5 r# r+ L0 I
15:ABD
~, l& X7 |( M/ @3 j
/ O# [7 ?. j. |( P) ]+ t) v( g4 T0 B
5 o! y' m' P: N8 y- y答案详解( ^. l, j% H- A& C8 W4 ]2 n6 S
% E' l# T, |6 r1 o' \7 Z6 v
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。6 z, L+ G9 U( i0 G2 |$ y
- y* T/ J% s7 A2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
$ F+ p2 C, W% J4 l$ x
6 Y) N( o$ [- f, N/ Q! B: R& {3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。( V( }+ b$ d8 S" i$ G
0 Z1 L. h* [- \& K
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
* P! H2 a" w. \: `* V2 N! K
8 f) s7 h" V- Y [( C* u$ M5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。0 H- |/ ]5 k9 e! t- T) Z
. P+ `2 D; [( ^- O- t. r8 s
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。* P8 h" A7 g) d: @$ h7 `
( ?5 n( u$ Q0 i' o: \9 L$ t
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。+ V6 e. m3 Y; e2 {# \9 ]2 L4 H# g
- e. h' P) @' ] ^2 [( C3 H0 D
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。% L: a a1 U+ k. x5 D1 [
, ] ?. [! Y! ^5 ]9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。1 Z" q" A7 T" s; e& H: `. i
2 |7 P$ e0 R" L9 _: X10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
0 G2 _# O' I* [ X" M; H: O% D* W# R! {- B& W
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
$ m: |+ M0 L2 y8 P$ b& I' x
! ^0 k. j! r% M12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
! p( D0 H8 F& x% `! f# d& D" o! b
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
+ Q4 b9 j+ p2 n" b$ J! A' {2 ]& f
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
3 Y8 K% s: x: r, F; A# N& b( p1 l- {- a( h
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|