  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
: g6 T% T' Z1 e还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
/ M; f( r* |' x9 k! u1 W用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
: Q& J, `8 ]: c0 i0 V7 ^5 j$ M! K& o8 d2 \' u
- W9 x. @" P5 T问题
' g" L0 v9 H* K/ W' ^! ?7 P" }, P# d0 U
1.以下哪个不是合法的电子邮件地址?
. H `3 z% Y0 _; s/ _2 u8 v1 X
- V: y0 [5 G2 z9 E f0 CA.john@89w.org' Z r1 S4 s s% m% i. E6 C
B."John Coggeshall" <someone@89w.org>
" H* Y- g# F5 ~C.joe @ 89w.org2 S" A( q, r) n! Q
D.jean-cóggeshall@89w.org) O, n$ Q; N- t3 ^
E.john1 q3 l2 M @& Y. W7 F
9 H t2 B3 l0 [9 f% h: C- [) R5 t2 Q( P! ?
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
( t+ U0 Z: p2 Y( E4 S$ t) E
! X( {# }& {* g1 cA.Windows/Novell不需要第三方软件的支持就能实现该功能
8 s" G8 d" O" j- Q8 G: h2 V! `0 RB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。! x c, s- a& ^6 {+ {& @0 q
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送: u2 h `9 q% b8 a H
D.有可能完全相同,这取决于sendmail_path的配置" y! d% S$ M5 R' z8 s
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
9 c3 Z5 y/ F0 A- g0 {2 ]8 }3 F3 m. s) F: j1 Y
! }$ y4 Z: p& E/ b! E' T* i3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
& ?# P2 H1 L) @9 m# [% ^2 s' H* w" |" V* X) G
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
1 {" b. C% R, Z4 TB.用PHP代码,通过SMTP直接与MTA连接。
( O! [3 V. V9 CC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。$ C/ d# }3 S8 B8 I
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。/ D0 f$ A+ g1 F. k9 e# K8 w, Y
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾1 q2 `! M' K& W8 Q
& G. c D' y5 c. D. f2 A( q6 X, A( K, {' }/ z& W
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
3 _* G3 r% Y0 L% l
/ X- t- z# T' |. H答案:____________" ~/ T/ g1 i5 z3 g4 X
3 t' _6 [8 U9 v
% {" P' Q& `6 f5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
$ R7 |, Z0 o3 H# [! }$ c: n& U6 l/ M; l& Z
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
$ y" l- ` C$ VB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
: m8 N2 @% P# X! V' z4 zC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID2 G! h1 }6 _8 C' F+ C$ M
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名0 h8 [8 q! ^% v! ?
E.只有一个答案正确
# d6 J% I/ [1 E: j8 Z4 ]" _& J% `) E3 o( i1 n
( Q- r* V( C: E" R3 B7 c6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?6 p& Q1 k; U' b
" E+ X! x( @+ B2 h6 K; ^: IA.从UNIX或Windows/Novell发送邮件时都会用到
I# C' J) y: Y6 {) i3 L1 ]! DB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
* ?5 E& O* E, y# O) ?2 c7 n& lC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
& B' R2 ?3 Z9 ` Z* A' _7 C* ?; hD.PHP里用不到这个参数' ~: W9 z2 o* G4 ?
O7 t( v1 }6 @5 _6 J6 d; u$ c% ]2 \# c5 t1 } T7 Z% C
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?2 Z8 V3 `8 _) A: R, V6 K( M
8 C* R J( \( x# M b0 ?
A.只有在发送非普通文本(ASCII)数据时: A4 e7 R! X) ^! S! y2 f( m5 z
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
: N( s5 [, h" M2 ^2 eC.任何时候都可以用它来指出MIME的编码类型; k) L$ H( E4 {- C
D.只能用来指定特殊的编码格式(例如base64)
- u' X+ |7 v+ v. j4 [& EE.以上都不对
( N) q4 z: U: S- y4 S6 P; l; \8 {9 ? |4 z
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选). b: `* f9 f0 Y+ N
D! V" {; L, H1 w9 O+ VA.分隔符至少要8个字符
4 F% D5 a7 ]* h3 ?3 AB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--), \( ?; T d* G8 B
C.分隔符在MIME邮件中必须是独一无二的
+ p- D, a Q, w. ED.分隔符不能嵌套的其他分隔符中6 N3 n, q2 R5 E# B! | B
E.用什么做分隔符都无所谓
0 g2 u) h: p! J
. `7 v( \7 c% I% y
/ y) `$ x- ?0 f5 J1 U! r9.考虑如下E-Mail:4 R. h' V8 y! N; D% Y: M
4 m- h9 {, I9 N' d( B+ `
From: John Coggeshall <john@php.net>) h8 K w4 l9 w
To: Joe User <joe@example.comt>
% R% }! J8 S5 L% u+ T( k0 eSubject: Hello from John!* ^) n4 \6 l+ U2 K# m
Date: Wed, 20 Dec 2004 20:18:47 -0400
; f/ L% p, H& dMessage-ID: <1234@local.machine.example>
" P4 l: D& o) ]& VHello, How are you?8 R) \3 }. w9 U, }
3 I! k7 N+ Q t% L$ I( |
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)1 l8 A" e, K; k
0 S5 ?4 k, f8 W& g! k
A.MIME-Version
$ C# r& k' p2 l2 }B.Content-Disposition4 i6 j6 C/ u$ e
C.Content-Type$ v3 f. C4 w. {, e: }) E2 S M
D.Content-Transfer-Encoding
& X! V( R/ V1 i: TE.Content-ID6 m) O5 W9 Q) Z; d! S- \3 e
8 @- m: H) P6 j9 Q& o: D
; {# m; b3 `6 p+ A10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
\: f X; L; L( E. B% w* R. O9 @$ z+ X% c4 Y. g& T' S
A.multipart/mixed
( s+ @) R( U7 Q" i) }, w oB.multipart/alternative& }1 j! E& U; S
C.multipart/default
* b1 [5 p9 [; P# d, TD.multipart/related
" [9 j& }$ @5 l9 R0 B3 ZE.不可能用content-type实现! k# P, \) _0 R$ G1 _7 T5 L
* l. n% v# c, N# l9 ?! |# X3 y) j. }) Z" X# W$ s9 ]: z8 h
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?! i0 ~( e: F3 H6 U8 Q- d
H: ]2 p0 |2 s# T- e0 TA.安装sendmail服务器
/ N6 N2 _! G7 o/ xB.安装Microsoft Exchange
6 F* K7 l; g1 L2 R( zC.在你的电脑上安装任何一种邮件服务器
" C: X* K- s$ G6 u( t6 o( VD.改变php.ini的设置
) d2 c! w+ b7 z5 VE.写一个连接公共电子邮件服务器的脚本2 u+ ^* o7 f- Y; v/ n
% E# L. z; x$ z; l8 j2 k
R& s) T; e1 o* x, n' Q$ x3 X8 Z/ m3 E12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)& @5 G i2 Y- r6 a+ ^! c3 H
$ N# k2 y7 N- a
A.使用GET方式传值
/ z q" f0 l: _8 b& f2 ~+ FB.用htmlentities()处理电子邮件地址/ J# O) W$ M" l
C.使用POST方式传值) H) q {) B* [* b, e2 e/ H, D% N. i' X
D.用htmlentities()处理邮件正文
7 S! x% o) ]+ i3 E6 LE.确保填写邮件地址的文本域不能有换行符
- v5 N; _% Q' Y% E4 l
3 Y4 a$ y& f6 Z2 v
/ g" D/ `$ H7 Y13.如何将一个数组作为附件发送,并要能在接收后重新组合?
- M+ h( n: e$ Y3 M1 K
' L+ y" O3 i9 V, JA.用serialize()把它转换成字符串,再用htmlentities()处理一下
$ ?3 b: l: i9 Z$ g. ~/ ?B.把它存在文件中,并用base64_encode()进行编码' B8 z7 i' M m& F1 o/ w
C.用serialize()把它转换成数组
( g% a0 k8 a. c9 G- RD.用serialize()把它转换成数组,再用base64_encode()进行编码+ ?, B4 b" B! D- _
E.把它存在文件中,再用convert_uuencode()进行编码" C, {; B0 P+ ]4 s' Q0 T
, }' Y; D9 Z4 L2 L) @7 M k2 n" ^" F7 _% }2 ?% @' `
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
5 Z' W& P1 D& K) j2 @ F) Z; z8 D/ [
1 `! o4 x B1 J: }. I/ YA.堆一个检测脚本出来
% {7 I5 |/ s& u) Q# X3 s2 HB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
1 V6 C: J) f& t ZC.写一个识别文件MIME类型与内容是否相符的函数
+ f( _8 K- h6 `# ~# {9 B# S3 KD.使用mime_content_type函数
2 e1 o9 P! o2 I! J2 [9 R2 e0 PE.把文件上传到外部服务器上( _& U8 u2 I3 i" n! I
! j3 K: [2 o9 P9 p0 A; M
" o" {( W9 Q3 u$ p7 J
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)7 |0 j" |/ D' x
v7 o% e2 I, C3 G6 w% b+ |
A.添加一个From头信息
" [$ h8 O" n, RB.使用-f参数! ~0 P' |0 p! d4 B; x; z+ T
C.添加一个Reply-to的头信息+ P7 z% b9 X+ ^
D.确保运行Apache的用户有修改sendmail设置的权利
g- C% a/ h8 {' }3 RE.确保Apache在root用户下运行$ w( r% @6 y1 N
答案速查
7 o' j' Z( V% k s9 s1:D
1 h( f. O( b" a9 d2:AD
) h* n6 h( Q4 k" o9 v3:E" z& f2 ]7 P; f0 m8 G. F @
4:Content-Type:MIME/ w$ {) {/ I0 j& v$ e( @* U* b
5:BC, |' U0 J5 e# B2 W0 W, N( C) W; h B
6:A6 Z' d9 j( X. O4 P
7:C
+ f6 E+ F+ @" o5 w8:BCE1 B6 J# m3 W1 j: w9 n
9:ACD
6 x( P% o) @3 {& v Q$ ]( `4 t10:B
: t- p4 {% G, A0 N& F11:D
3 s% ~9 |" g+ Z3 O/ r/ c12:CE# z8 X' n9 w, b6 }$ O& _
13:D- d# ^# O6 H6 R
14:D
$ @0 o5 M" g j& t% I15:ABD
6 r- w) d3 S6 H+ E( S/ _. z: U/ d- W# P, [. C
! Y* ^ V6 p% o& E) f/ u+ C8 D. P
1 W7 W& U3 ~, o) k, w' t答案详解
. { e" |. A1 s5 m' B2 Y9 J: c n( J0 U, g0 C8 x
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。0 y( H; Q- H. R; u) E8 ~( s- s
3 W( A! m# V9 g
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
; P8 c" j6 Z1 w: N! ]/ }6 `8 ?: ^4 `6 W; S! M. U
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
, l" G$ Q8 X- _$ z8 N& m
9 X; n* t& s0 Q" ?% X& d3 |4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
: B0 s+ T# B/ r M1 T! o8 `. G" [5 f2 q
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。) S' [0 \3 B2 a# i9 S, |; I
! X; M* z( g" j# p) ?! C4 d
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。0 n* u+ L( d' `! Z+ p' g3 l# f
N& p: }3 z8 q8 Q" a9 y: H2 y7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。 t: I+ |* z6 f5 V, K
& t. p; T. ~3 o* J$ F9 w8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
$ U- P. M ~. {' n- ^1 [
2 w- k G$ S. {. K9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
/ f N" F: T. P8 p8 L
6 f. Q. y8 z5 Q+ j10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。) v* n# @* c8 j. }" q( ?
, E7 @6 K1 }, A& e0 u11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。' z5 j E- y/ I9 T3 {: y3 R( I% x
' g' T& q/ d* U7 A# F2 {7 T
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
) }4 w8 _/ u9 H8 _ d7 M& ?: [- p2 y* A
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
0 k: j3 X+ B& l0 O
. K# e) D6 k3 Q w14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。) v @* c p- o% U3 }$ Q
: r1 }$ g- C3 w7 a* j4 f
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|