|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14347
- 金币
- 2459
- 威望
- 1647
- 贡献
- 1407
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
* `; p7 x/ B. \+ g0 n还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
1 J; a, N# n9 X0 J8 \用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
5 H* ~1 X& n" w, N$ p( M2 w2 s! K/ S1 k
- V* F6 f# M9 o1 u5 p- \
问题3 t. g- P2 ~! @. N( o# P
, R0 S- _# S7 Q4 M1.以下哪个不是合法的电子邮件地址?
7 J( }3 w0 ?3 }: Y0 g) G! D% v% A" }* ^2 [
A.john@89w.org
( t0 V1 J* m6 Y: y5 K: Z& v+ c( r& BB."John Coggeshall" <someone@89w.org>& N7 Y) Y1 q/ ^+ c- ?) N, g
C.joe @ 89w.org
6 ]* S4 f1 V( e3 QD.jean-cóggeshall@89w.org) ~ Z+ k& @9 k' S$ @" b
E.john# h2 ~9 d. T, x; o9 K }* ~' T
0 C" A' B8 ?+ X" M, Y1 `8 ]! ~, K, ]: C* H1 s7 Z/ T3 B
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
2 G2 Z3 V: A3 _' X3 e* R* `' t5 F; H; h- c
A.Windows/Novell不需要第三方软件的支持就能实现该功能
9 z2 J+ _$ |+ L8 @% |( n5 m. hB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。* k$ l( s) o/ Q g1 J8 `
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送$ }! h: W/ Y* L# S4 I- G
D.有可能完全相同,这取决于sendmail_path的配置
( G1 Q `3 Z" t8 @" T4 {1 v' i2 ~8 nE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口, T, A6 s2 H4 S4 [9 X% f
7 @& j( b! z0 Z2 u4 r \5 y6 L
/ N) K `9 I5 q5 W; ^" Q6 @, N
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?1 n9 ~4 @: d" G" a$ s z/ X7 `
8 U" K- W, v8 _- c' H
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数$ e1 _. `7 t( ]1 `( w
B.用PHP代码,通过SMTP直接与MTA连接。
* ~1 N# ^) \, g* s, UC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。" o0 X3 ] G% @# q
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
6 z0 z% ]7 l4 A& w4 QE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾) B/ u7 p: J* m7 U) ^
$ N( H+ |# t g' y
+ S! n7 F/ a" g) L
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
4 F# L$ @- h Z. } i+ i: y9 c0 a" B. Q/ f. O/ A
答案:____________
5 [, R9 [* d ]% M# n; a: z" N8 k2 Q! I
- S. r; p9 \# P- M0 ?& o3 G5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)1 s7 ~; G+ B. g4 I
8 f4 a' f7 P1 l5 `3 o, T% v! H; C- T
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
5 ]6 o- m$ S( z" {- c' b. VB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片% T! ^% p6 E* m
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID* m L- S! \& t. T- k# w& U
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
! Q& {+ }! }8 R+ {+ e* I) iE.只有一个答案正确; V' K$ T' q% }( ^9 Z0 Q; V
9 @' s, ^3 \. h& C. ~: e+ g
0 j( h- E' P" H6 B
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?, `' _ u' S; Y) I3 O
* ]! y: m2 ?+ G2 T; L: zA.从UNIX或Windows/Novell发送邮件时都会用到
$ e O# }5 P NB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时; B1 X8 b% r- J/ V: ?
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时0 u; D( Z6 g! I- Y9 L. d# T+ W
D.PHP里用不到这个参数/ L! H! Y& u2 A% @1 j
Z3 h8 q" {) w# C! v* a c
; d" F2 s2 I- A, e% s7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?, ~) v: z. ]7 F& o
& D+ G# V% T% e1 S$ @A.只有在发送非普通文本(ASCII)数据时& [9 M4 y; w4 }! t5 |" C% E' v
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)2 Q" j7 ]- y0 ~: {3 ~
C.任何时候都可以用它来指出MIME的编码类型; J2 L* N, }* [
D.只能用来指定特殊的编码格式(例如base64) f) l7 `3 i& t4 ? a! A. A5 I. S1 ^
E.以上都不对
! P, w; j5 t. o& l* i1 h5 |- w+ D. @9 R& G
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选): `9 \, T' T4 p, c, V. G
( F9 f. E; ~7 w% F
A.分隔符至少要8个字符
M' r/ \' ~; Y. L* JB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)7 B) h5 H/ e3 n3 @# y0 {: Q5 g# v
C.分隔符在MIME邮件中必须是独一无二的! W% }" b- ^( d0 Q; `" W
D.分隔符不能嵌套的其他分隔符中6 G1 t% ]/ k4 ]/ q v$ f& q9 s
E.用什么做分隔符都无所谓
# j* D% j, {* A+ t
$ P( N9 @0 u/ |( K" T K' S; d5 e# N1 u8 J+ u" p
9.考虑如下E-Mail:
1 s) d+ s) a/ \$ h, ]+ b
6 U& x, i; G5 G0 k. sFrom: John Coggeshall <john@php.net>& d; u0 {9 J, g5 ~
To: Joe User <joe@example.comt>1 e# f" }3 O2 C4 q' E+ O
Subject: Hello from John!
5 g+ q% ~% |' P8 H3 lDate: Wed, 20 Dec 2004 20:18:47 -0400
+ m; A4 Q+ X4 d# }6 N2 d; M2 eMessage-ID: <1234@local.machine.example>
7 g+ m8 Z* i) D1 F6 v8 U( J) i; ]% [Hello, How are you?; I1 \8 p2 U- i1 }
$ i% h- `% c# {" p& v7 t u1 U8 {- [" A在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
4 U6 C5 u0 K% c7 u$ l+ z- |$ {( V" d
A.MIME-Version
% ]: Q Q" _+ ^' u& pB.Content-Disposition; q7 T. h6 f) e
C.Content-Type6 |4 {" N- c- K# I4 l
D.Content-Transfer-Encoding" `# M* d f1 F
E.Content-ID
3 u4 U) Y0 Z0 O+ v. n: n# R9 B& m0 ~! \( T P/ X" T5 l
+ L! P, s& f$ H# z4 o5 X
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?4 C2 |9 [# g- `2 b' R
" v) [. ^0 ?8 R. sA.multipart/mixed
1 C- ?1 _, G8 S" r3 t3 `% DB.multipart/alternative
3 g. Z2 S. P$ TC.multipart/default
, m% C1 I* {" O j5 C+ \D.multipart/related
2 ^* {7 z. k* P* vE.不可能用content-type实现
! w! R" B! `) _2 b" q) N) _1 D+ i/ f
$ q5 \ b# P9 Z' \9 w# H ~+ S
$ M7 X* v5 K1 i3 }! {# T3 ^11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
, d9 @0 S! f/ b0 s: F ]6 y
( _' P4 O- K# }0 Q% r- C7 J5 L9 vA.安装sendmail服务器
% `* G. t; x) }/ e6 O' L3 ZB.安装Microsoft Exchange4 u: V# Q" l' R- J/ u
C.在你的电脑上安装任何一种邮件服务器
. u6 @7 Q, {. n5 o3 u) xD.改变php.ini的设置3 A: {& v0 @5 Z s& n
E.写一个连接公共电子邮件服务器的脚本
+ s9 R" ^; y0 A( I$ ?4 s, w! d2 j8 T" z7 x; g2 M
; w3 X) W9 W) d4 J+ ?6 A( `
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)3 Y7 ?% E+ t. P- Q0 g& H
' d2 L4 x( X4 D( {; b XA.使用GET方式传值
- [* O! [5 y' Y, B& B: b" }/ pB.用htmlentities()处理电子邮件地址
7 o0 l/ _; F2 U5 {3 A# K4 Q4 S0 yC.使用POST方式传值
+ L) v& h5 m2 b2 n, ^D.用htmlentities()处理邮件正文/ _5 E0 o- C1 r+ y7 j7 K
E.确保填写邮件地址的文本域不能有换行符; s" o( P" o' ^! j$ P" d
+ W3 Z# d* U# t* c% [
7 A5 R/ m% T/ H
13.如何将一个数组作为附件发送,并要能在接收后重新组合?) H( S/ P! _ z: ?
9 J, x% }# O* J3 y Q
A.用serialize()把它转换成字符串,再用htmlentities()处理一下+ E5 c$ Y0 b* `4 m/ l+ @; N+ X
B.把它存在文件中,并用base64_encode()进行编码
h3 J* V! r1 xC.用serialize()把它转换成数组
( f8 g7 }/ B9 K4 }3 AD.用serialize()把它转换成数组,再用base64_encode()进行编码
3 d1 H5 i" {, ?1 u3 SE.把它存在文件中,再用convert_uuencode()进行编码( T n8 o7 f* T. y: W. A5 L+ b8 d; t
4 u% h8 \6 ~# N$ Y
6 x# Q. p1 \0 u" {
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
" Y6 l. \* W& i. C& |% V( z( c V+ x
: |$ N7 u& B8 F6 KA.堆一个检测脚本出来3 |. J w- n) B8 f5 p5 E& }
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
& X+ P3 W1 o; P. Z. pC.写一个识别文件MIME类型与内容是否相符的函数
$ U( a# b% r% |2 y8 vD.使用mime_content_type函数
1 s7 M, }' }/ k# m" u: ^E.把文件上传到外部服务器上0 A& z* p0 f7 l' A
* u0 @( `! N( x) a; G3 L7 e! y0 B( v$ K/ A. {6 ~
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
; z) w# W( [6 g1 X. w) y+ u+ m) W9 Q+ t+ E5 i. w% d; [
A.添加一个From头信息
+ e0 `! [0 D! n1 b6 GB.使用-f参数
* \" W" a7 v ^( I2 Z) m: n4 I9 PC.添加一个Reply-to的头信息; q' R7 j M. Z2 l5 ` ]# l; R) G
D.确保运行Apache的用户有修改sendmail设置的权利7 N9 |( m& Q9 h; N7 Q5 s% l
E.确保Apache在root用户下运行* ~; V9 z: t% h2 ^
答案速查 a; h" I, q( t+ y- I
1:D5 h* O8 g6 t% k
2:AD5 _2 \8 n! x. P( N9 h1 z$ N% y
3:E* {8 m, J3 C9 y; X0 y' F
4:Content-Type:MIME
/ u- J" T+ k3 w5 {, ]4 b5:BC
8 S1 M8 h- X0 z7 G4 r z6 r6:A
. y# l/ P1 M: m, M, f5 p- T( U4 s7:C4 x% H! n; u7 o% B
8:BCE# O8 }, |2 s7 Y1 R) _' E5 S
9:ACD- `! _8 x$ [! K1 l, M ]+ W
10:B
4 ]# l% @6 u: `* v1 P4 X11:D2 f1 a* v' B6 o% O5 A% M
12:CE' v4 t, {3 ]1 z# @" `7 [
13:D8 o: D+ R& c5 r1 ]0 m) ?6 {
14:D' l7 A) `* a; I5 q
15:ABD
! v2 J/ E4 h: z% L& a) P
5 y4 e- x! ^( u/ p m4 `, n1 \8 Q/ o5 J/ G; G: a0 I& ^+ j7 z
: F9 a F6 G6 A& S答案详解
% c1 Y6 A! j+ u+ |$ d8 p6 a0 l/ J7 S+ A0 e7 F
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
' d- I; z0 ^8 S( K* H. u
) ~; I; \3 N1 B7 f+ C( K; i2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。; T# b4 W; ]# _$ T) u9 }1 Z% J
% {- z9 z% ~# L: J3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。: f+ m f: L5 ^5 T
1 G: p5 O! a) T
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。9 w& y( F( |2 g6 j% f9 y
4 P7 a% x% v8 I5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
+ R$ t( N5 Q; _" z( J) L! q/ g: v/ ^: d; S2 s1 H
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
# q' _6 K& S( c, g; E3 k8 T
0 x2 Z8 `" O! I* T* O. C7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。$ M; z/ M$ V) G3 j/ e
. {- r: ^( p7 S: P! X: i" d; j
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。0 H% n% u {1 l# P) j" n9 S* D r
6 G5 a5 l% ~5 I( E6 h
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。2 }5 D2 `7 e: h/ L( b. F' [6 {, f8 p
' a0 S( n V' p& b9 |
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
0 M: g" j9 A0 e
% Y' Q1 o! x" u/ h7 a. u. z0 j11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。* F3 ~$ b5 x+ }+ [; W1 J4 M
5 v2 Q+ g/ P" h
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。4 ?; B7 w. g. z
0 Z. O4 i" P, j8 U2 K/ _13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
2 |4 l" e7 ~: j" k- r5 g& l, A3 Y7 x; ]8 T5 Y" I
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。# k/ u. k' S) k
( c0 S0 K8 W- _. {6 J
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|