  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。5 j% U; A1 u2 W% l4 Q
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
; o- J3 ?, J: E+ d用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。0 e" C: I2 @5 m+ U, \4 K: w" \- V, [
! e5 j( }! k( [- @6 u
0 F) K3 O7 u E9 E4 j
问题
7 I. p4 L3 k F! D& N# C. U) M' M1 I( j; n) S1 B/ w- \/ T* b6 B
1.以下哪个不是合法的电子邮件地址?5 t3 i _7 P) `- G/ t
$ Z) D* D$ E, W6 q8 `7 Q" X/ ^
A.john@89w.org
0 z) t$ [# r# }" `B."John Coggeshall" <someone@89w.org>
4 C( l$ Z4 t# j" @, vC.joe @ 89w.org7 M3 m7 @% T2 J4 K% v5 g2 C
D.jean-cóggeshall@89w.org
* M! [% A0 W) R+ [: l* pE.john
8 k( H' ^* O' @+ I# F# J* L$ f! I, E( a' [
# E& R4 h( b {" Q) s( C+ a9 F2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
/ Q9 v) F5 b* c! o! @: F& F2 c+ U2 p/ p( o6 X- O
A.Windows/Novell不需要第三方软件的支持就能实现该功能
9 z- t! d* G: cB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
- `0 E D$ ~7 C* m5 B. H( mC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
2 j& p$ d; d; @9 jD.有可能完全相同,这取决于sendmail_path的配置+ M4 s2 t9 t" d
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
1 j" x% |. d" U5 C9 X" d! ~3 r# {$ [$ o6 J2 I+ S
^$ h) z9 U3 s7 m% E
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
8 H+ ]6 I/ M) {. L6 X0 z& I0 o; c" W; w4 S& ]% X3 p
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数8 O, w$ O' q' D- x* b
B.用PHP代码,通过SMTP直接与MTA连接。
( \2 ]" c$ z2 x+ |4 q: Q; j" C" VC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
2 K' ^4 i( A; s' h* |) rD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。* b3 I; y6 i1 C2 l' I
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾, t, K. O9 v/ G% t {! [
; W# \% u2 x; w
, b" F% p) p0 o% e# z4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?1 `9 a7 V1 b% N( ?2 J h
) P. @$ |- e6 Q+ }* S7 ^ `答案:____________2 f, T r1 w- [* i! P0 [
( | c4 S) d9 Y: ?& m2 a* _+ s" p3 A' t
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)4 _7 W8 ~& u) R
; `0 R4 O/ K h9 I' [4 oA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示3 I& }3 b* ^! i1 a7 d
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片* C1 |/ b1 O" l" C0 b p
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID- F1 t# o: J$ i& ~9 t* r
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
2 w+ T# x _! {E.只有一个答案正确
; |8 P7 K# ?6 r7 }% l7 Z( X& W; C/ k; T) _9 ^* ]* H
9 H r7 m4 i: ^
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
/ @1 y7 M. Y4 Z7 b" i* i! C, @1 l+ A* ^, M0 i4 p
A.从UNIX或Windows/Novell发送邮件时都会用到
+ U- ?9 s+ s2 b4 G/ CB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
1 @1 R c/ f+ }0 j, n( pC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时5 T- x4 `& i# d+ `; T- M
D.PHP里用不到这个参数
6 Q( a ^/ }4 u4 y$ U( }4 Z+ C) u* C. L4 Q7 [+ X" P
- X6 ?/ F0 q) J. m( W; L5 n& d
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
' {, u( i: z0 F9 q) {+ g0 N) |' H) H! A
A.只有在发送非普通文本(ASCII)数据时+ L3 t/ ]: [: V# n( |
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
3 ^+ o1 a7 } P( f4 |" V1 l/ [+ [2 hC.任何时候都可以用它来指出MIME的编码类型2 D9 S& i- k1 p! `2 U2 w" i6 T
D.只能用来指定特殊的编码格式(例如base64)
4 V: c, ?3 j" w5 a9 ~# oE.以上都不对0 U+ _; B, @3 q
7 p5 k$ v7 @" d2 a1 }
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)& s0 `. u! _/ k
R j. \, i5 u: NA.分隔符至少要8个字符
8 q2 v) z% n- L5 DB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
- r! a+ P; F# A+ k. tC.分隔符在MIME邮件中必须是独一无二的9 l5 u$ q# }* }- S/ O
D.分隔符不能嵌套的其他分隔符中
- I: O% e# ~( J5 Z( H0 @E.用什么做分隔符都无所谓- Z; g0 O5 f6 X
- Z7 A& n6 k: S1 M8 `9 l- J" x6 o. Q9 ]* n6 H$ K8 P
9.考虑如下E-Mail:: j: B4 n8 E; ~
1 r0 s ~5 e" O) B
From: John Coggeshall <john@php.net>( F; S! d. k9 C- \# T& [
To: Joe User <joe@example.comt># o" ^) I6 y; {, T7 ]) k+ c
Subject: Hello from John!9 V2 X6 x+ {: C# Y1 R
Date: Wed, 20 Dec 2004 20:18:47 -0400* C4 c. t7 f( G J. y
Message-ID: <1234@local.machine.example>0 @7 ]3 E+ ] [4 N! \. l" ~* N% {
Hello, How are you?/ i+ J) {- w: ^0 Y5 d
8 z( S2 t4 N, F) ^1 l. u
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)- d$ S4 E( h) V& y. q
5 p: K% ~; t' J& _' Y P& c) P+ l
A.MIME-Version
- S5 X6 z6 U) M1 ?" f1 }B.Content-Disposition2 K- t8 P. _ O& ^
C.Content-Type2 S& M5 k3 Q2 H, t
D.Content-Transfer-Encoding
7 M- {, \, L/ [8 r7 M5 TE.Content-ID
?0 R: A/ [3 f: e4 r
3 \9 S9 P; v ]/ E8 x3 Z1 t4 p% r/ l
. C% s8 E4 C! C- E10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
: C6 ~$ V J3 N7 E. }
3 |* _! u9 |, p. iA.multipart/mixed4 O+ q4 _9 _& @! R- N) g
B.multipart/alternative
3 }6 L f0 j, ` {7 ~C.multipart/default
3 Q: x& W6 r& |& h& }) g; sD.multipart/related
4 O2 |* Q8 Y% n/ `E.不可能用content-type实现9 r, a* K. i: [
+ \+ d7 p7 W/ l! B7 T3 M
7 j6 M* P, a/ _- p$ q11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
) r: b% J+ ^' _/ I) h
( f/ _9 h+ c4 [, r% \0 S4 i3 s, F& PA.安装sendmail服务器
1 q/ K" f$ z7 u- C' g+ \ \B.安装Microsoft Exchange
0 O6 t m. C! [C.在你的电脑上安装任何一种邮件服务器3 C- O7 J+ R5 `5 J! T7 E
D.改变php.ini的设置9 u& k, O% Z! |6 C2 J0 J1 C
E.写一个连接公共电子邮件服务器的脚本' j: j$ K s' `. A9 p* w* U: @
8 E% o& e8 b3 v* r: P, f; C2 q2 [1 d
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)! G" O9 M2 I. m' H* Q
, \1 ]6 G8 a$ [# ~. F' U! X2 @
A.使用GET方式传值
7 l6 ]% _0 E/ sB.用htmlentities()处理电子邮件地址9 [2 z3 U" n: x" ?8 G( P8 i
C.使用POST方式传值2 h! {2 A% f4 K: w
D.用htmlentities()处理邮件正文
- @- x" P; T& [/ B0 }$ YE.确保填写邮件地址的文本域不能有换行符
9 q3 g9 b4 r* j/ d# V
# a* U1 F, J4 z; t: t% n8 m- K' f6 p! F+ s- ]
13.如何将一个数组作为附件发送,并要能在接收后重新组合?% |* L0 _7 A& r7 \
' d: M- a2 I4 G$ C, u
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
- b8 w7 s% N! J" G2 D) dB.把它存在文件中,并用base64_encode()进行编码- k1 z; i* Q5 i7 ^ F
C.用serialize()把它转换成数组
* X0 X. Y7 a3 A; |D.用serialize()把它转换成数组,再用base64_encode()进行编码2 U4 d' a5 j" W* q/ P- R1 f
E.把它存在文件中,再用convert_uuencode()进行编码* {, B0 [! J+ F5 V
( d0 M9 A! f1 e; N) g% |
7 n; W7 g! M2 Q) f! P14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?! B4 Q6 C8 k( x3 n' |6 a [' T. k
+ s( u4 y1 i" I5 [A.堆一个检测脚本出来
, n/ d/ ~8 |! O( E! EB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
5 K$ I" m, Q0 wC.写一个识别文件MIME类型与内容是否相符的函数
! u* x5 u0 z; C" HD.使用mime_content_type函数
' ]& U5 m. k0 k; [1 BE.把文件上传到外部服务器上
2 g4 D3 `; G/ [$ l5 Z5 W- t$ ?; c. ]4 x0 h2 {& b
0 Q5 v5 {( y8 M! L4 O; Y4 d15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)5 S* k! i T" @7 e
9 v6 C- b1 h# FA.添加一个From头信息
9 R( F3 `* {: g3 {* ?: ?" h' V8 aB.使用-f参数
: U, v0 x. o TC.添加一个Reply-to的头信息9 A7 g# E9 y x2 u2 |. G
D.确保运行Apache的用户有修改sendmail设置的权利
+ p6 s+ y( n% E$ E/ FE.确保Apache在root用户下运行& t `) u* V8 v
答案速查% j, u$ B9 U3 v; K T% Q, `! @+ H
1:D
' G: [# w# r% f; x2:AD( w% M+ I% v4 K& M7 J$ v/ Z
3:E& z3 D9 U" @) m4 j- l
4:Content-Type:MIME/ c$ x3 Z5 O# P% G( b
5:BC
! A9 d F. {3 p; K- w6:A k2 G$ B* x. K" g: y, J
7:C% Z4 s8 y* `9 s! j
8:BCE/ Z! l4 A& J1 i/ u [5 ?0 N/ h8 |4 A$ K. s
9:ACD
' h! U: ~! w1 U, M# b0 Z* M10:B
9 y3 g, K+ L( x3 {7 Q11:D
1 d8 f: j6 i9 S9 R12:CE
% T) c* B; q+ F8 k% g) e/ \13:D9 T x0 r- Z4 k+ ]+ _4 f; ?
14:D; t- x" x; U( ]* F
15:ABD- f% w# n: _& g& Y( g. e
; W/ E h' O7 j0 P( ^
7 g8 v0 t7 b. s1 X1 x
( S# U' d% D; F. e
答案详解9 y& ~+ I. g4 o0 n X
! p( U4 d6 C$ g( q' r) Z" L) N8 \1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
/ D6 S. q& c2 _' V* p1 j" Q
2 @9 A K" p, A* w# l& a5 q2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
. ]1 M& f0 E6 s, ]
; [# `$ b& F4 f3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
) H. B! x9 e- |/ Z, |
" f3 o D H# k X9 I& P& H- f4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
( ], K1 @3 t8 |% V
8 m5 Y/ Q5 p' z9 Q5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
$ o/ l: n! M3 T5 f: U; N! S C4 S+ a+ P5 s, ~! P
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
0 N0 F7 ^, m& m' E7 h- S# `7 f" ~7 {/ w: F( N. [
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。8 i: z9 s8 I; K7 i M+ N
9 e8 w! k' o7 ~, r# J, j8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
. }7 k2 g& L; x) g+ ~& @4 k* A6 i: z7 a! X* x, X2 b
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。* L0 L3 X$ a2 _! N
5 O& }3 B* O) q* \10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。0 f5 y0 ]6 m0 D' m/ o" C
3 [! u9 L U7 q$ H; i% i
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。4 K1 I! v6 g/ \
- y& ~, b5 f( N6 U P8 _( ^ f
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。$ F0 O% [5 x/ T) L
" n; t4 T2 A1 X2 u: O! }" r
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。5 @2 W; R/ [1 z2 R7 L
' t9 G l9 C) Y14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
% L6 U! E7 W" B6 E
& b/ n0 @0 g# c; ^15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|