  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。8 c8 a' d5 ?9 n* K1 n
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
9 p9 n3 d. d7 ~. `用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。7 b! }! u9 y" K4 o4 ?1 U* T
/ z; a/ G1 W8 G& U, b
( X# V$ D/ ^, A) f/ k
问题$ K9 L9 @* ?! m# S( p `
# c+ R! v* {# M; r; I8 A& C1.以下哪个不是合法的电子邮件地址?
; _: Z" I7 o/ @& p* t: E+ U
# ], r9 y' }8 G) H1 u2 o% CA.john@89w.org. k# J* W y& f$ W4 K8 R
B."John Coggeshall" <someone@89w.org>, r7 T$ C3 ~6 R
C.joe @ 89w.org4 o& U0 ]5 j* `7 v
D.jean-cóggeshall@89w.org8 A; B: C1 X7 E1 e* h
E.john
4 o# P9 c L$ h( W; X- T+ q) b% Y! ]
, ^$ A4 w; P! l( k
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
; ~5 V9 Q. v2 P8 U6 h; z' [0 h1 P* E x$ x a: G! N4 Y
A.Windows/Novell不需要第三方软件的支持就能实现该功能
8 K$ m% M9 M" H4 m: E) rB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。( r4 s, [' E. P( U. ]- B
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
# U g+ a7 n+ Z4 b fD.有可能完全相同,这取决于sendmail_path的配置
+ M1 _0 L9 g% u; S# l. {E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口5 L J+ U- ]3 A% Y
. g, n' ^6 P3 Y/ e) S. @) v
" i: O! M- I2 a- [# Q& b- }9 ~
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?- M) D2 o X' i
5 e; t, T+ f2 S6 m# Q) W7 G& T5 U
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
/ `; g$ {6 L; q" `B.用PHP代码,通过SMTP直接与MTA连接。& _4 F2 h5 I- F# g
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。0 B* e$ H5 r% N5 }
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。* n! }" ]( f9 c: V- ]* E4 G
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
# @3 f6 R$ U. u0 v4 B+ P1 y- q
, k6 ?5 @% {( M1 F" r& J4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
! P. r5 b0 I* ]0 i% A, C' a% b# X! l7 f8 t; n
答案:____________
* X( ]! {6 r1 y: Z; j
?1 m2 x! o( @0 v& L# w. I/ H0 a% g( O5 Z, S: @5 V
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)! N5 g0 V+ {/ r1 v- } p6 A8 t
8 t3 G# |& [/ i! E- _, R( M
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示* \: s- }: e% a' Z, i/ Y5 c
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片% s7 C" B% |" @0 M; d L7 g
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
1 ]/ h/ Y# m, q5 j& AD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
, c$ D- {7 m4 G, T; UE.只有一个答案正确" v' a% Y% y4 y* J' J3 F
8 X9 \) C$ F, ~" r
" U6 ]$ L' v& p, |" Q1 J; x$ v
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
" B# }! ]/ D0 [' g4 e2 c9 f: p& ~% R- F9 U. E
A.从UNIX或Windows/Novell发送邮件时都会用到
; j( g2 d/ J4 M: Y; eB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时4 @/ h/ r) [( s
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时3 Y. T+ I) ]* [/ g3 ~ c/ |9 w! W
D.PHP里用不到这个参数1 [: v' y" \4 ~/ b# i- H, Y) H
4 c- ?0 L9 m1 \& H& a' y6 T) ] l
6 ~% k1 ~9 b4 S; Q7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?, a8 X1 |1 d, F+ t( b
; Z; K5 U$ W7 q- l# T2 j- [* _* W
A.只有在发送非普通文本(ASCII)数据时
2 D6 z. d7 ]$ l7 r: a ]! _% hB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)7 j8 i. ~# h c, q e0 L4 O
C.任何时候都可以用它来指出MIME的编码类型
; L$ a' `! H5 y- t! a: _D.只能用来指定特殊的编码格式(例如base64)
' a. ~/ R/ g8 w; y/ J5 T$ Z' VE.以上都不对; L" f( P$ Y5 x4 @, V: G2 c
# R. e5 j0 d$ Q2 r2 @+ H1 n8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)4 O2 G% V5 N1 F( G/ {# s' f
" T8 J1 n1 a& P7 k
A.分隔符至少要8个字符
* ^! N: i. ?' |4 jB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)2 u: D0 O" n/ U& E9 o9 _
C.分隔符在MIME邮件中必须是独一无二的7 K5 C- g( v( s! \; L# c- W' V. E
D.分隔符不能嵌套的其他分隔符中& {$ F" g5 n& \& W4 L/ G
E.用什么做分隔符都无所谓; d3 `! A7 P9 g
- u8 Q3 c6 v; A+ T" H& \1 V. B
) U' O# `: G7 V3 m2 S
9.考虑如下E-Mail:" g1 w0 V7 u& e( o* w* T' R& ?; @
) S6 R: q1 Y% B( p7 D
From: John Coggeshall <john@php.net>7 R$ ~ y9 Z' w$ o& o$ u
To: Joe User <joe@example.comt>2 x2 |" x$ @7 {. S3 s) V9 W! q
Subject: Hello from John!
1 R. S8 S& ^1 @- b- |Date: Wed, 20 Dec 2004 20:18:47 -0400. Z: G4 Q4 [5 r2 A6 i! O! Q( ~
Message-ID: <1234@local.machine.example>" u/ X: m U" o6 F& {, c
Hello, How are you?7 T" g9 h6 ^6 B) C
3 y) g! Y5 o) i
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
0 ^. C6 i0 `0 J& X. V) ?' y$ e2 B' O" v- O
A.MIME-Version* ? |. \; H# P/ X- I# h" r: e& S
B.Content-Disposition
6 M; v" S3 }! G A" G% D# d" iC.Content-Type3 S. x$ C! G3 n8 O, P* i
D.Content-Transfer-Encoding# O6 l! q; _" V1 y9 g& z
E.Content-ID# h+ d/ x. T7 h% O) R' B. m
1 O; X* Z9 D) Y' d( L h$ |6 p7 O: S* ^1 F, E
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?- b$ J$ ?2 P) v E* w D$ ~
7 r2 D9 [/ i' ?3 v: i
A.multipart/mixed
3 |$ C0 g7 E6 b3 B H* v: LB.multipart/alternative, J; `$ X. _9 ?- v. G1 N5 _
C.multipart/default
2 C9 v ^% Q% i( G6 h. R4 [D.multipart/related
. a3 O1 F: n W* {! dE.不可能用content-type实现, T- n+ P3 m) Q
+ Q3 a+ | E/ m0 t/ X
( m% R& z4 ?/ C- }' n4 {8 g# m11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?2 C+ a4 A, j2 h! w5 g. ?
. T( G: u2 V1 V( d6 K1 @. W! P: gA.安装sendmail服务器
+ l4 ^4 B6 f9 tB.安装Microsoft Exchange! u* `/ h& d( P5 y, F# u
C.在你的电脑上安装任何一种邮件服务器$ t! A" N/ X: D( i5 A& X# M) h& V
D.改变php.ini的设置
9 i2 M1 b0 n v# h, ~E.写一个连接公共电子邮件服务器的脚本5 B7 m+ F; N2 h
/ N1 z% R; [7 P0 {4 K! i" T( e: D, _; O7 `9 p
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
- [" G9 X% S: I" U) D- i
; M, H& U% V+ N, X* ^4 }* A$ C! QA.使用GET方式传值
. D# l. E9 ?9 U1 d. S- iB.用htmlentities()处理电子邮件地址$ j- Q! C0 U2 h- l4 T/ r
C.使用POST方式传值
% z: q! ` T# M1 r+ I, {D.用htmlentities()处理邮件正文8 ?9 y' _. u7 @ Z
E.确保填写邮件地址的文本域不能有换行符6 {) e% L; L1 ]8 T8 s' W
5 ^" T( Z; Z( |& e+ a# _
+ n2 |) l* f E5 ~" m7 H6 a13.如何将一个数组作为附件发送,并要能在接收后重新组合?
" L; Y; j/ E: M% }& ?$ p) E }. K- N. W
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
) \! g! k0 X; b9 \# k; WB.把它存在文件中,并用base64_encode()进行编码# n5 L$ j' a( H X& e, ~$ i
C.用serialize()把它转换成数组
) Q7 ~7 B) B; X) I& r6 U- SD.用serialize()把它转换成数组,再用base64_encode()进行编码
! |2 ^6 F% q+ U- l( x PE.把它存在文件中,再用convert_uuencode()进行编码
4 ^. a) X F7 h. S. b7 P: r4 N0 ?7 d5 s$ B" R) ^. `1 P
- r/ a1 ~% H3 u$ \& a: f
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?9 ~: ]0 s' M# ]. B# @/ ?
. r* X7 v1 e G. Z2 A
A.堆一个检测脚本出来' b3 N$ Y! \6 h; I) p) s5 u' @3 c
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
+ {& K4 W( O0 ~: aC.写一个识别文件MIME类型与内容是否相符的函数
. q2 u& v0 W0 bD.使用mime_content_type函数. g6 l6 I/ Q* u0 J' Z
E.把文件上传到外部服务器上
$ r/ H% \: C! v0 `: y
1 a( K5 b0 D X4 u% \- H+ e4 F: j
/ M* n, L# X1 f4 _' @6 Q# w/ l) H15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
4 G; G6 C3 _3 M7 |; Y- J2 j$ U& ^# |" r; K
A.添加一个From头信息
, ]* a' d0 }; V FB.使用-f参数( |: _6 z$ d2 O) W. N! S
C.添加一个Reply-to的头信息( U* O, w, i G: Q3 N) ^, y
D.确保运行Apache的用户有修改sendmail设置的权利% `( @, r$ ?4 L# c* d
E.确保Apache在root用户下运行2 L H# M3 }, R$ ?( v
答案速查- m$ \) f4 K# D8 Q# R
1:D, m" I! \, N& n$ }" f- a' R
2:AD7 J9 n& C# C# C3 j$ u
3:E6 r/ H/ ~2 L: ~
4:Content-Type:MIME
D* i1 S& ]% A# \+ E4 N( d4 e( B5:BC1 U u* ^4 Q, J A3 | [
6:A6 ], i9 [, f9 B: J
7:C
; l, V+ K* r5 D8 \7 {$ `8:BCE
* S0 i3 U, ]. Y) L9 S P7 Z3 C( @9:ACD) ^( P# n U, ?! B4 y# W( \% B) R
10:B2 ^9 n0 e( M- j5 I
11:D/ ^& d$ n" t! `7 n& y1 z
12:CE+ y) `4 Y& m, T
13:D# n$ C. r/ A- x+ b) ]) m
14:D
% E/ Q6 c: V# T6 P15:ABD
# {( i2 X' t# w- R* d6 M* l; d, b# v& W6 D# R# m+ S7 L2 T
5 \1 f8 N! _, W" H3 L* p
; L& L: k+ Q0 G& F1 z7 L答案详解6 F7 q' Y5 ]2 |, g
: C& y- R% |7 @" n% ?% S7 s6 x( z1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
/ h6 w. _4 s; Y \: m" I1 D7 X( [" c S( K
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
% p Q M( S! z. }8 j" {0 M% x# K, W3 F2 k( u/ j; a* r
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
2 d8 |+ K* k. p3 j3 N1 J
. d3 x% X0 H5 V4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。" \% ^) O @& `) j
4 U# p+ j4 I! c9 q5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。( e. ^) R, k' w9 l
; d6 B9 d# j9 q9 I" r# Y* Z- }
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。, e7 A! Z! K# C( e J2 X
4 q' r( A/ Q" b7 l+ Y8 Q7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
$ Q+ T: B' i; O; W8 j" H* c8 ~
. W7 r$ q3 |6 t3 p" S4 C) |6 O8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。- ]/ j9 }* ^% h9 f
) `; Y2 q% H& S" p0 }
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。7 I1 N* V2 k0 x( M
7 ]+ g% v5 n# ] f" l2 y
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。) i# x9 {! W4 W2 I R/ V1 N3 {7 \" Q
/ c2 T. S2 X' N/ h
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
1 d# R& x4 s8 R: ]1 ^* J6 M# q# w. \, d+ U3 `
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。; f. X O3 @ P
1 X4 [* I X6 Z* |8 M, R* V13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。* u7 G5 l8 L+ g& W4 g
" |3 b' y- ~3 m: E
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
1 i' [! U1 j) k
9 x" _. a$ h! \/ ?15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|