  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
. I8 M1 B n! q9 v还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
( D1 s& Q+ O3 y+ ?& |* w用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。& Q% K5 j' G& Y7 f
' o, t% Q: X9 s1 j$ M2 S) T/ P
7 V& g6 c/ v9 @" `* i
问题! H* Z1 @8 j; S: s1 R/ N6 L% |* C
" [3 X3 v. A D5 q; L j" ]$ v& b
1.以下哪个不是合法的电子邮件地址?
' \% D# S6 [5 @) q# Y0 o# v3 O1 m! Y) K! t ~
A.john@89w.org2 [& N2 v' ?' D& H
B."John Coggeshall" <someone@89w.org>
" L E0 j" E' r5 G" uC.joe @ 89w.org/ Q9 j! i+ P* V Y; E* K* d$ p
D.jean-cóggeshall@89w.org
$ k6 J3 m& b, }5 H1 S$ DE.john
( H1 L* K; Z- P
# ~6 M" ]5 O; F+ F' S" o1 j% W8 K w" ^1 ?6 ?
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
) h8 ^2 `) u% `3 `+ L! ^4 n4 `/ D" ]; n9 N! m* G
A.Windows/Novell不需要第三方软件的支持就能实现该功能
8 I1 |, C% E# M: ~B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。9 F( _4 n$ Z, G- B
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送8 Q; \7 U. @, [1 r" g+ I% [
D.有可能完全相同,这取决于sendmail_path的配置4 P, s7 B6 i, a8 D) X2 j
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
% O, r, O9 R, p! S9 N: |5 D
3 B) c" @" o* t8 q! N% ~1 Y3 _- V$ }$ B9 ?. q t" |
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
/ J" f. K- P( ?' p- u+ }, V) ~# X0 [- \! I' S1 Y9 B8 P) ]8 ^
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数$ c x* |) @1 L3 ` O! m, K
B.用PHP代码,通过SMTP直接与MTA连接。
! a) b, j" ]' z+ YC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
' i+ L7 b8 |9 R6 o7 |. A s' RD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
% i f( |+ U4 lE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
& H! l% b! |+ D0 @9 f7 ~8 R' R7 f4 f' @. ]
" T* m# d* |* {: }! P8 Q9 o; r; M
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?2 G9 V' @1 ~! `" W
, K( h% b# I- S+ v
答案:____________
w$ |2 C) ]0 Y6 Y- X: Q$ W K7 z, w" ?
1 _& K G$ l3 F" C0 n. w
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
: } i$ c- m, G5 Y3 M8 f; X7 u) k) F
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示5 a& M+ d& c( D. w/ K* C
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片3 z! R$ T1 E, f
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID9 }7 a j% f) Z5 T# B5 W6 b. W
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
- ~ o+ {! m9 Y* v& SE.只有一个答案正确
u. @) f- J5 W8 ]5 ~2 j1 |7 V o/ L" ^: Y. c
. u! p1 p5 Z% z4 r
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
( l2 S$ K5 n! [7 d; Q: w+ s7 _1 N9 x; S- T
A.从UNIX或Windows/Novell发送邮件时都会用到
) j1 o5 b! F1 E# v+ @) @B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时7 w0 A* e P5 @1 ^% b, K% P/ J
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时( E$ b9 L! o- A7 n8 [, Q4 u) `3 N- \! Y
D.PHP里用不到这个参数; Q% L! {# O4 X( E$ N2 ~" ]2 b
G/ J# V$ M' x6 ~: Z5 z) {1 ]
% ]( p: e% I$ C8 r6 \8 \
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?1 B- m, o' {* i2 @- M
. |) `# B' q v5 I1 Q1 ]
A.只有在发送非普通文本(ASCII)数据时: \6 w/ \+ f, m6 f) W8 n
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)1 \# I9 }/ C' ]0 ?% T, z
C.任何时候都可以用它来指出MIME的编码类型
- V8 O+ `. p+ R4 T) ]5 Z9 G" Y. \ yD.只能用来指定特殊的编码格式(例如base64)
- G8 _. V+ u( x2 ?% G ZE.以上都不对
% u. c( y4 ~% s! {- [1 Z* X( R* `; x& i4 ]
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
2 p: Y* N E" R% b. W4 k# p! b9 Z, y* h3 x, R) |8 L
A.分隔符至少要8个字符; Y0 T9 F7 F' i
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
/ Q& O j! y# K( @( I! IC.分隔符在MIME邮件中必须是独一无二的5 B+ D6 i. x! t) d6 M
D.分隔符不能嵌套的其他分隔符中: N9 n7 T C( n9 F7 v) P
E.用什么做分隔符都无所谓/ y8 p+ b$ Q, _3 I: h4 ~
1 {, [9 g7 N* \: M |! w, Q( o* ~( ^+ T. F: y# f
9.考虑如下E-Mail:
1 l, S: v6 D, F" m) `
, W& ~' N' \' J) @+ NFrom: John Coggeshall <john@php.net>! V/ k% H; B5 Q. w5 p0 V
To: Joe User <joe@example.comt>7 T* D8 R: D3 x1 R9 |) z- r
Subject: Hello from John!
' G! {) u& c, J% |) L, gDate: Wed, 20 Dec 2004 20:18:47 -0400: |$ X" ^5 @+ y' t1 x
Message-ID: <1234@local.machine.example>2 O* g) e4 \/ f0 S2 q4 ?, f/ k, I
Hello, How are you?% s* _# R: Q. g: W5 e
$ F5 U9 m) M5 ?) k/ \在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)1 }: D6 m+ c! H/ r7 ~
7 A( _0 L; B" D) V! ^, C+ W7 n5 S
A.MIME-Version
, a, n9 w8 `& M) m8 i" k1 gB.Content-Disposition
+ R$ y5 ] f/ Z3 NC.Content-Type+ L% ]6 G6 p- F+ z: w+ X( {( b9 H
D.Content-Transfer-Encoding4 C2 { F, \5 _+ e) D+ X
E.Content-ID& o3 X5 s% X9 v' R7 u" p7 r, z2 O: J9 F, Q
+ i! D2 C, h! t2 p+ X% x
: E& ]3 ?! B k5 \; }10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?* o% [6 U. U# x
1 \; W# j5 f. |2 y; i0 B; N& ]" I
A.multipart/mixed
( {' t) A) j% x( d" H5 }B.multipart/alternative' `( D- O$ h- J5 U, X
C.multipart/default0 \7 `. H' x2 n4 o. I; t* p/ p4 d( \
D.multipart/related
( m8 x O5 ^$ L7 E' Z6 ^$ x) yE.不可能用content-type实现
2 A$ [- s, L) \( \+ t3 F
! O+ j0 X% z- c- h: B) A6 l1 t& q4 D- u+ q* B8 R) C; J, k
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?9 B; e4 V' M8 j8 F. L4 P- E
5 e9 c9 I3 G: ?; l$ C- M$ r
A.安装sendmail服务器
$ x) Z/ ]9 H( _' K% w& H1 @B.安装Microsoft Exchange
0 R" [% n A4 j8 G$ V: `% b$ S$ wC.在你的电脑上安装任何一种邮件服务器
& y$ j6 l; }) j% f" i# Q9 x0 j% fD.改变php.ini的设置5 q) ?' a8 i9 \8 i& t
E.写一个连接公共电子邮件服务器的脚本
; S5 `7 E* k+ |' ~; Z8 X B- j* } U6 ^3 t7 C6 N; X; ^
7 F; J5 w& M U# u$ V- @: S# ?
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
% n& s8 p$ Y0 x& Q6 s- R! q" Y+ R/ N+ H& i7 f* }
A.使用GET方式传值4 }% l( t* N* g% O
B.用htmlentities()处理电子邮件地址( v0 W% f9 `1 D( K9 e* w6 g
C.使用POST方式传值
- O; Y+ p* \* C/ j: dD.用htmlentities()处理邮件正文
3 W3 T& f& O7 cE.确保填写邮件地址的文本域不能有换行符1 J3 d& G+ w. I. F9 \5 ~ N
: O& ] A3 A) p0 z
& c d+ T$ U7 w# r
13.如何将一个数组作为附件发送,并要能在接收后重新组合?( y! x- p- r; |( U
0 J3 j+ ]8 ~3 o& t9 v
A.用serialize()把它转换成字符串,再用htmlentities()处理一下; n- A) r/ [, X- z [! B; D
B.把它存在文件中,并用base64_encode()进行编码
. I: w9 u4 A6 Y% tC.用serialize()把它转换成数组
1 ~3 {9 f6 [, FD.用serialize()把它转换成数组,再用base64_encode()进行编码
$ e/ j& ?6 {/ I m4 e# jE.把它存在文件中,再用convert_uuencode()进行编码; ^5 F7 f" |* P5 A; Q! a* q
) X( \: I* g8 O4 R7 Y
5 s' {1 H" ^' m; I14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
. G# ]# P2 e. S( M2 F
! r& j, e6 e1 VA.堆一个检测脚本出来
2 V/ T/ [/ F; g$ L1 V5 Y- q" ]B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型5 h! c! f* w8 v2 \( e, H
C.写一个识别文件MIME类型与内容是否相符的函数( Z: X/ C5 D2 v" U2 K
D.使用mime_content_type函数' ]3 P4 I6 z* [8 U/ Q# N l' L
E.把文件上传到外部服务器上
7 D0 m6 U6 q" P5 C' Q) d/ { B8 l7 X. b1 Z; m
+ }' s! L% [- v! k
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选): C' b' p" q; _6 T4 k
8 O8 Q) t0 P- ^. B, |: }A.添加一个From头信息
: ~/ l0 _1 J* I) J4 r CB.使用-f参数& D' o; k% ]) h' D& U
C.添加一个Reply-to的头信息% J" ^$ A! `. z* {: j; f% |& a
D.确保运行Apache的用户有修改sendmail设置的权利. G; ?- u& ^( o. t" H
E.确保Apache在root用户下运行) f! w# |5 E" h4 A4 |1 \) ?
答案速查
1 q* ]7 }" G D1 v$ A1:D
D3 y/ V# @/ j! P+ j2:AD
9 Q* s* u: ?' N, S3:E
( [( I+ p, k1 j8 a& F8 ]9 G4:Content-Type:MIME
; o+ e# g9 ]+ Q) c- U5:BC
' {* m, E. ]* h- T' [2 j: @6:A7 C. [* d9 c& R# K
7:C
# u( l) r! _- W0 F" j8:BCE
7 c/ v0 Z- E' |$ n9:ACD+ ?4 H: s# C/ t! i& ^( g/ I
10:B' p: T+ U. Q; p. A! W4 m
11:D) e0 q4 i+ l3 Y8 {4 E
12:CE
, u. c& D$ d# c* W13:D
9 I+ i9 r% n5 |$ S7 q14:D
+ m; s. ^0 R5 r% |% t1 X15:ABD0 m# Z% {2 `+ ]7 I' A& f& @
% [' G2 Y" m" e
# S" K3 S M1 J/ G' e
2 n& Y$ T& S) ^7 {/ a
答案详解
" o/ {3 _7 Q8 x3 v* }' o; s2 S" e1 V. V: E0 H* `% o
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
2 J$ q) n' _ t9 |3 o& ^$ H b
/ P0 r% R4 A% a$ g- k2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
) ?# l X; Z) m" D: N j
* G2 _9 E: p2 y3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。, q5 X) n9 L- S$ Z
; ]+ r! n. ^5 P9 I4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。, _0 g4 P) j8 m
' w$ h* R9 S. I3 s6 X6 u# p/ z
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
3 p5 y, |+ L1 ]" ]* F$ m; U$ [8 x# O+ s6 J' V: a2 J/ p2 o- B O
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。4 r3 o8 ^! t% `# U( G7 H% Y |, {+ H
* |+ V `5 k5 k' ], w7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。 |# v8 g. e1 J `
- S* X, C# Q2 F" u8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。* ^- ~8 v* ?/ L) D; @
/ ?' X K0 n! A) A! T
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。2 u9 V2 X5 x! U4 A% A
) Q- u4 [# n* S! N" d2 I3 F, v, g
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。' K5 c9 E a5 c# W) U. |
% n+ y5 Y1 t( u/ S5 ` w11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。2 O/ G6 E1 S. u3 z/ f' d0 c
1 W9 I( H0 p& f8 F5 A+ d* H12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
% ?9 [4 s2 O! @7 D3 }4 U" y) V& w" R- m+ ?7 X7 b: z
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
* n* ]* S2 e4 K; B0 a5 [0 K8 d6 F, X, I5 @. }" E- b
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。) K8 `7 A7 y. Z4 s; _7 s- v
9 H( `/ C) d r4 F; L15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|