获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
" W; M3 D) u* g1 Y" k& X% y还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
' z+ N, e) g$ |1 I" j6 G# c1 D用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。& D% X0 G  q; p9 X- S( D
9 J$ r9 z  m8 h  f. w( d% y: q9 e

% V/ p* J7 r* N# @# b: T问题1 ?; I0 _3 v' w
3 {3 l8 `: u; L' D/ g
1.以下哪个不是合法的电子邮件地址?
* h9 S6 ^: Y3 e( ^6 |* U
# x0 k, p; u7 \- {  B# VA.john@89w.org
2 r! p! p5 R7 l1 K! V8 ]) w' S2 XB."John Coggeshall" <someone@89w.org>: o; h0 i/ S! ^! @. L
C.joe @ 89w.org7 O( g- l# V) I3 i0 B1 @
D.jean-cóggeshall@89w.org4 U+ C* W# ?# H6 H
E.john
3 N+ U' M% {4 v. r7 P8 I3 Y7 Y) I  ~% o. I
$ s1 ?0 a+ I5 V+ S+ E' [
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选); m. h6 r8 q# z3 Z' }
; s7 Z; Z8 R7 x
A.Windows/Novell不需要第三方软件的支持就能实现该功能
2 U6 m9 p# W4 Z& v; G: CB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
/ A8 A( x+ E' Z  d/ H+ I# lC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送4 m9 X% V1 R) w
D.有可能完全相同,这取决于sendmail_path的配置, R# Q7 b8 _# v) E9 P
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口1 ^9 u/ F2 z0 J( S

+ I5 J4 R- }# l- @, _9 _# p, j
. v  T6 {: K) e, y. @2 F8 m% j3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?1 k& P7 M, m$ f/ d5 l# }% J+ f2 U

0 d; X) p0 Y! H% n8 G$ c$ @A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数' M: ~+ _7 T# g+ \7 ]" X
B.用PHP代码,通过SMTP直接与MTA连接。
9 ~3 |$ A7 h# ?' O' JC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。* p6 j5 T% ^  ?& {, ]
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。+ O5 y2 u1 C  s, |/ H6 k- r
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
" m3 P5 P6 E3 Z; R, V$ }% W. M0 G8 B7 A
$ y" F9 L6 P. }2 v- r
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
% M% F6 A" r4 i! O5 i% }) Y0 J
- ]9 K; E- ?, Z% g  l答案:____________
! X) E! n- K; P9 k6 C
; G; c8 }) Y. O- O' y/ a; N! N4 v& W* O) s# F
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
4 H6 o$ l1 J: {* n
4 ]" S7 I5 u/ }1 P) ~' D4 r+ P5 JA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
# K; i7 @' G9 P$ S1 iB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
9 K) s% p# e1 J: {6 PC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID3 l0 B, ^& C& h
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
$ p/ c# C+ C: }' b" D0 i3 O7 y! QE.只有一个答案正确
# b2 L4 ~5 k7 ]5 G! G; j$ Y+ f% P0 q1 K3 Y0 _! x) J
4 l; [  s8 k/ A) b' ^* m5 \
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
3 g8 L1 ]' n' z1 l$ s8 d9 }7 f, u2 }( C# ?! h, @0 q
A.从UNIX或Windows/Novell发送邮件时都会用到
7 I+ S5 w9 V: uB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
3 w( V  ~& ?% |8 B: v) a7 P0 gC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
' e, @- |) l, L: Q5 x) J% eD.PHP里用不到这个参数4 }; @* E4 ?: |( q! Y5 O, F% e

5 b4 ~3 F" U( T: j! Y; n: Q! ]# O/ h4 s* c1 w! P% i
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?5 `% Z" [( o' c( X
/ A0 f5 J" I% n, k9 E8 W' }6 Z; j
A.只有在发送非普通文本(ASCII)数据时5 e) Y/ e8 L) ~7 @( G; E
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
3 O% y8 N& s' b/ [0 N) {( jC.任何时候都可以用它来指出MIME的编码类型& ]# c6 T& F  e8 e+ F- G
D.只能用来指定特殊的编码格式(例如base64)$ h7 N, E) F0 k/ r
E.以上都不对
+ p5 t2 }4 y/ Y7 `4 T
3 R- A8 ~& y; v4 o8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)8 Y$ P1 I& G4 }% l0 Y; |
( v, I4 U5 _$ t& K  e2 J2 k  A
A.分隔符至少要8个字符
9 Z/ R) A0 K2 H/ K( f) k& J" UB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
0 m  X, \  o, nC.分隔符在MIME邮件中必须是独一无二的
% Y. d9 A, t$ e# f5 [D.分隔符不能嵌套的其他分隔符中
+ e) f' f0 }* _; u$ `E.用什么做分隔符都无所谓' o" g- O( v& c1 o
4 U5 r- Y* n( ~( [) g* s
: X. H, b1 q  j( a* b! `
9.考虑如下E-Mail:/ S+ j  u& s7 O5 _! C* q: g1 T" H

( f9 H- N; N& k+ s% [# QFrom: John Coggeshall <john@php.net>  }9 F! ]8 x1 u( W
To: Joe User <joe@example.comt>
3 M, g9 Y. H$ q$ M5 A8 q# P: DSubject: Hello from John!
4 V& T$ Z& c% a" gDate: Wed, 20 Dec 2004 20:18:47 -0400
1 i; X5 T, [4 zMessage-ID: <1234@local.machine.example>1 d7 o' o5 [6 \! I6 [& B! V5 ]9 T( s
Hello, How are you?5 Q4 J% U8 p" d8 O# Y

7 O0 c$ B0 B7 ]/ d! q: t1 O在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
6 A6 k7 ?$ b) c4 h" x1 n- e+ d6 l
A.MIME-Version
9 V$ I9 C& m# D5 i/ A6 EB.Content-Disposition0 A! B2 d3 s/ k4 k
C.Content-Type* u2 t1 n* E0 I7 f! Q. `
D.Content-Transfer-Encoding
( `5 a- w. M, r2 T7 a; \E.Content-ID
$ L- r, p" J' e+ q, J4 [$ _
4 m) o9 d- [0 I
3 e' J1 M% t8 I6 ?" `* `10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
; R$ u3 G& A/ R; g! F+ G9 `! `) q0 L8 D( Z5 j4 ]% G# S- S
A.multipart/mixed% ?# G7 _+ Z7 L5 O0 {% i
B.multipart/alternative
* p/ f9 i) H* G5 W* vC.multipart/default+ r4 s0 G  [% W5 g$ K7 B0 p% M
D.multipart/related
. m: A$ Z- L' \: dE.不可能用content-type实现
4 ?6 v$ n0 s! W5 Q& o6 Z* F' j! A' e) i' Z; z) v: y  w" m
; d2 @, r$ J) k8 m
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?' I2 Q3 @4 U, n8 d% K

: [! @! A3 |& Q0 q2 e4 pA.安装sendmail服务器
: k3 a. Z1 _% y8 Z( KB.安装Microsoft Exchange1 N" i+ M0 l% O. o: |: u& l
C.在你的电脑上安装任何一种邮件服务器  |1 ~5 i9 k4 c5 C8 x
D.改变php.ini的设置
! g0 T- x; ^( S* F+ \E.写一个连接公共电子邮件服务器的脚本0 I% {7 u0 `* R: J8 ^8 M

" m' \* @' b3 u! C$ K
/ e$ T! l+ G1 o  }6 S, e' _8 k7 ?12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
' {. e. ~/ F$ m' u9 m9 b: l. p( u# U2 z4 f7 X% N% b
A.使用GET方式传值* N4 U, d8 }  i4 P
B.用htmlentities()处理电子邮件地址
/ I; z8 {2 {1 R3 nC.使用POST方式传值
6 q+ g1 e9 l* a; y) X8 cD.用htmlentities()处理邮件正文+ ^$ T7 \$ T1 [, E3 l
E.确保填写邮件地址的文本域不能有换行符
5 R; H5 J9 @; `  y# S; L8 Q6 U( ]9 _+ C& i% p7 `
1 h8 T% O8 v3 i" s/ m
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
8 h7 J; l7 q3 T
8 ^* c' O- t1 j- e% u1 BA.用serialize()把它转换成字符串,再用htmlentities()处理一下# f/ `0 _" ]6 N) k
B.把它存在文件中,并用base64_encode()进行编码
3 U# J7 P/ |+ l2 o1 F5 P0 N8 l/ BC.用serialize()把它转换成数组2 P6 w8 N# ^& `% q8 E0 K4 |2 J2 y, J
D.用serialize()把它转换成数组,再用base64_encode()进行编码. p3 ?4 F0 U6 q' `
E.把它存在文件中,再用convert_uuencode()进行编码
2 ]& d% u4 R( A' g8 w, w  {% }4 \& w. y2 ~! e6 a* S; _

% Q, P2 O* ]) F4 f14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
$ l! b* h$ b/ N% q* q3 m: ^, }5 |
0 q) x# c; U# h, u4 k) aA.堆一个检测脚本出来
: k( O1 a8 V8 U! A- tB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
5 A  T" f8 l! _0 a) _C.写一个识别文件MIME类型与内容是否相符的函数5 D( ]; {4 _3 P6 a6 h
D.使用mime_content_type函数& T3 L" E+ Y5 l4 t- K% c) d) w1 ~
E.把文件上传到外部服务器上
- }5 M4 @4 U& }' B' ?: |+ A$ v: N! o" ]5 x+ k. y1 L4 t

9 t6 s- S" w9 Z& M+ V15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
* n3 f+ C: b0 a: B9 Z% I5 \) ?- r8 j
A.添加一个From头信息
' H0 `) n: h4 X0 N* ZB.使用-f参数8 e/ ~$ F# S* K$ b1 N9 r
C.添加一个Reply-to的头信息
1 G' }9 Y' L0 H% D! HD.确保运行Apache的用户有修改sendmail设置的权利0 m6 e- v  {3 D2 F  \
E.确保Apache在root用户下运行# p7 C; g& U9 K1 P0 ?& e8 x% E
答案速查5 S. b/ J' O) b$ @( s8 T
1:D/ _! i. _  Q: M% c  A/ I1 ^" l
2:AD9 S* y( U+ n6 `* A
3:E
# Z. V4 w) M: s: b: G) i5 A4:Content-Type:MIME
. }* R, m9 ]3 M( d! _9 E( @5:BC3 v( v2 X7 R, Q+ S3 Z9 W
6:A
& G1 c$ ]! A2 I% i9 ]& ?4 W7:C
1 k: J- ^6 u4 V6 V8:BCE% x5 g; n4 E1 c+ N8 B
9:ACD' m, i- L; _# Q+ @3 H
10:B/ j5 t% |3 {8 D+ Q/ Z
11:D. {( I  g1 _* N$ o0 j# H) G, d3 _
12:CE
: H* ]% y8 ]" F# A# V13:D
/ }. C: k1 P" B! W14:D6 W( J, n% f$ R$ ?, A
15:ABD) v0 E1 u. A" f0 A$ X* B
3 k/ X! T+ ]& W7 v# O% f0 E7 A

6 N* u5 }9 h) i0 j4 N- v
" }9 ?' t: ?  R答案详解5 i0 z) j) R* F& _

* I. A! d% a' U) Q1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
0 p* j/ }( Z4 V7 c' K8 v9 q: a- U
- ~3 `) F' L& i$ ]6 ]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) N+ E1 I& F
+ V# Q  x+ d9 o% E$ u9 \3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。0 s& ?% g/ u, J7 ]+ n% p
6 C; L* ~: j6 q
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。! d! A8 V$ j" f! R
5 h5 j! e6 `% i4 d
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
+ J% u- u, }8 w% |7 V3 g3 h( i
! @+ R& o* h: P  l: H6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。1 m1 ^4 G9 \3 w

, f, M5 }# C$ j# |* Z7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。4 E/ v8 [* ?' Q
" i0 Y" y, Q8 J1 H* j
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。' W2 U6 @3 n4 @* {6 B$ e7 r6 @

  `6 N4 L  s& ?" F$ ~0 ^2 l9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
! F; k8 d' E0 F: Y$ ?7 d' c# R/ }- [! \
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。/ H/ }+ v! I" K0 Z9 P: X/ M
7 B! ^4 d  z8 r( r+ J+ D
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
" k0 ]; k; Z2 {) x3 z8 G
+ y6 o& M4 S) u1 w" V& t: H0 X12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
+ l! V2 }+ J" k7 e' e
/ G9 Y8 a. z- e3 D13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。) n+ J6 U0 I- R, \* K! U4 x

* U/ m- |, W' z( }: K' ]14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
3 S/ u& G/ ?! k% h6 f
$ A! X: R* K* b, n# z0 f15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

返回列表
【捌玖网络】已经运行: