返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。. D; n, k1 R/ _, ^8 c# ~9 X
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。  l5 J% o+ r7 T+ E2 ~. q, Z
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。) y6 N6 u4 N" o0 M. O6 Z% m; D& R" o

* Q9 {3 x% v1 a0 @( V: G+ f- [# H4 H0 R
* `. z9 }( D) P+ G: r( I- Q( p' @问题
8 y6 G3 z% l' ?* T+ j0 S$ U: n; m/ g4 e& B3 [6 P# u) s; y
1.以下哪个不是合法的电子邮件地址?
6 g3 ]' \' \2 O! [( t
! I1 m) X/ Z; K$ AA.john@89w.org
/ p/ q2 s  _* e! uB."John Coggeshall" <someone@89w.org>, u/ W8 V5 d1 M
C.joe @ 89w.org- L9 j" c9 @% g3 w; z5 U+ z
D.jean-cóggeshall@89w.org" h; W2 w  w# W- E% y
E.john
, z2 a& z3 J( X7 W
* L2 X* D/ K: ?
) s# D) B: M8 |/ X' q4 g" D+ b! Z' R2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
. C7 O% q2 j+ z  m) @4 y& }5 s4 ^" w% R( {. q0 S
A.Windows/Novell不需要第三方软件的支持就能实现该功能
/ i  k6 \: O$ F* E. Y' ~' e6 h: }B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
& A8 y& H* r# m/ `7 S' GC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送2 n* s9 E' C: s
D.有可能完全相同,这取决于sendmail_path的配置  F3 U+ H; t3 h+ ^* L. Y' j$ Z! V
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口& h1 O# h7 N1 t! C! U+ f
& `2 K1 D9 v8 y" [

& ^2 f1 I+ y, v' I* r* f6 D3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
! I. \, f# l$ v8 m' t  O; _9 }. o8 W+ x  C9 ]
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
; ]! w8 R) _0 Q+ I7 q/ DB.用PHP代码,通过SMTP直接与MTA连接。  M6 Z. {" p( L  ~2 A; q
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。% F; h$ Y" Q( b" Y7 S
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
' n6 H: a, J" ?9 G6 I9 mE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
9 i/ M* J) L) _& M: A( y+ V9 |
6 A0 z3 ^+ H! y# d. e7 @" R; }+ {% N2 {7 D/ x  o# V3 `) x
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
& S1 _+ A# Z# w" E4 _6 Z
* H: L; l# N' T  w* m# f答案:____________, u* ^+ k3 P+ T; q7 q
7 N$ N7 O. L# z3 f: }5 @4 x# o
4 C; V+ u4 k- p' N# }
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
3 X5 W8 e9 \. W8 g0 \
9 d! }: p4 Q6 I0 D. Y; {A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
  V% Y9 `+ ?6 D% \: D+ _B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片) g0 X6 s; w3 w) ^
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID- m' B$ @1 _1 N. x
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名5 e6 I- b' r, r6 z
E.只有一个答案正确
8 l$ O, G) h6 m$ b# i" i/ y; [& e$ M2 S) ?( y& O9 ^
" l, g6 U2 @( d$ ^
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?! m1 I, Q4 k8 V
3 ]( z( a% ^6 p/ D. y  [" I# J
A.从UNIX或Windows/Novell发送邮件时都会用到: z- F  p4 I4 C" \# C
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时" N' ~6 [, N# o' h% K5 j; K
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
, \5 L; s+ L( X0 kD.PHP里用不到这个参数
% J$ e+ }$ h) r! I. a* y- y4 _5 @
1 y# _/ X" M3 P8 d/ }' ~* c/ X. b
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?5 Y2 j' F$ R) I9 c4 q1 z& L8 l. c' K

  N. ~5 B8 ^3 ~0 n; C$ UA.只有在发送非普通文本(ASCII)数据时
+ t9 h: j- [" s; h7 SB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
; f! }7 J( Z! V- I) H* {3 WC.任何时候都可以用它来指出MIME的编码类型# L  d# k" D, [5 ^3 Z
D.只能用来指定特殊的编码格式(例如base64)
' M' L: X7 f/ E, m7 b, QE.以上都不对& C# J1 T1 l3 A1 l% J( B9 w

4 E8 S! _: y" G$ K8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)0 Y+ o; S$ W/ _4 B: O5 `9 ~
1 s; z. E: h1 l& Q) a: G
A.分隔符至少要8个字符
: c6 \" W; ]/ @+ l0 v7 l9 G0 lB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
: ^! e! v7 p2 _  T% P# l, W7 S5 Q5 nC.分隔符在MIME邮件中必须是独一无二的
, ~, ^$ i4 W# gD.分隔符不能嵌套的其他分隔符中
3 b( `! _2 e, Q: k9 @8 M( EE.用什么做分隔符都无所谓
  R* X5 n! n4 v  Q* W
3 ~  M$ P5 ]' I( B) a% y1 Z* {) V. |/ T- u- j' ^
9.考虑如下E-Mail:
4 [8 J4 v! ^4 `  V+ R! l9 D* Q& ~' _3 O4 @' Z; ?
From: John Coggeshall <john@php.net>4 |% l# B" Y: ~: `. w, d& ?- l7 d
To: Joe User <joe@example.comt>9 H; e, `- e! D8 X8 D: u( n7 m# ~
Subject: Hello from John!
9 |' S" M; d& G2 LDate: Wed, 20 Dec 2004 20:18:47 -0400
8 N7 ~: h; e% `Message-ID: <1234@local.machine.example>
* i1 I9 @; f& b) q6 E9 i! DHello, How are you?
3 `1 i$ L( j* S) u; F' S" F  E7 B' Y0 V! J( Q% P
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)! r' ]! E  X7 W) k, k9 a
9 [: `- f. ]) q' y" {- h
A.MIME-Version
4 A" [, Q! b( p. z" ~5 iB.Content-Disposition3 j; X( b, N2 w0 ^1 E# R" [/ v
C.Content-Type
! C+ N* M5 ?% @) N. J3 c8 mD.Content-Transfer-Encoding7 k- g5 C0 P' V% ^1 \; u' N& @
E.Content-ID
+ e; L; Q: q9 B" k5 s, G* K* _0 L5 q# r% w  w5 w% l+ b3 T: ^9 _
" z( K: U! \; m3 u2 s$ K
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
) Y* A+ S* F# i$ x. _. v' \: j; e( j) Y5 ~7 U" `- t. y: R
A.multipart/mixed
% n- p6 C4 j+ B4 \3 n7 l! zB.multipart/alternative
5 P2 t' u' \$ g% r0 a( A, _C.multipart/default
# X' ?: c& _, o4 b- n0 L8 m  DD.multipart/related* T. J" C0 i" V$ D0 F
E.不可能用content-type实现( Z- |. @) I3 ?+ d( e7 k) v

& G. W$ h4 h, d. f' }
* r- j8 U; c3 e! H: E+ m, e* j11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?" F7 n1 c% k; B) S' f% d" G7 b( u0 ^$ g
6 C0 B& b$ z; C2 V$ f  u+ N
A.安装sendmail服务器7 d' Q6 H* o9 X1 b
B.安装Microsoft Exchange
) B+ e3 u5 ~$ E5 }* Y: f$ l, v4 NC.在你的电脑上安装任何一种邮件服务器$ o( u5 w' ?0 C9 a
D.改变php.ini的设置
; H6 c9 d" S# H# A2 |  |; GE.写一个连接公共电子邮件服务器的脚本
- j4 f; r* u8 S5 j' A" r8 P5 l( Y- D; O& V* q3 N+ g0 ~
( ~" g/ a' Q2 T& C- L& f+ y
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
/ G( G( t1 e% S
, e3 `+ X2 m% H2 T/ \A.使用GET方式传值
, w4 V# K  a1 C3 t. dB.用htmlentities()处理电子邮件地址7 `7 g0 w- `; z; b" H* \
C.使用POST方式传值$ j! D3 U" [4 w. f" u
D.用htmlentities()处理邮件正文
8 A1 p, y/ O7 w' J; xE.确保填写邮件地址的文本域不能有换行符
) B4 P! u% {5 U+ l0 U/ u$ `, ^0 C  O- E; {9 D) }' l$ a. ?9 Y

2 @8 F& ~0 R% m( D, q: [13.如何将一个数组作为附件发送,并要能在接收后重新组合?! V% Q% A" ]8 D  Z* k! v4 m' B, l8 Y+ F
: |6 @% J0 S- c" S
A.用serialize()把它转换成字符串,再用htmlentities()处理一下$ y1 A0 H6 n# ]; ~* H; L
B.把它存在文件中,并用base64_encode()进行编码4 W3 Q  S7 y  V1 w9 |* l
C.用serialize()把它转换成数组
: r9 [  x( m$ uD.用serialize()把它转换成数组,再用base64_encode()进行编码
% ?+ k7 ?4 Z' o, q1 J6 oE.把它存在文件中,再用convert_uuencode()进行编码* [4 ]8 B/ b; }5 V8 I
  T9 h- _: U. D7 W2 X/ G8 b! C3 Z
' K5 |5 t9 r, j$ F
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
6 R8 I2 b# H; V2 p. _3 f
3 {5 _: g' H/ ]: t) ]5 \A.堆一个检测脚本出来  |$ ]2 r# [% A; n
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型: n1 i1 Z0 U# m% \4 m- y
C.写一个识别文件MIME类型与内容是否相符的函数: D+ p3 c( s6 ~
D.使用mime_content_type函数* Q1 x9 b6 S% m2 P2 J& ?. ^. v
E.把文件上传到外部服务器上1 ]4 n! y3 _. x$ c' Z7 \* l, Q: q9 F
7 c( O2 K+ [6 X: @6 M' P

7 O$ K* z7 H' y, a6 E4 q. [- H" i15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选); M5 \5 r$ p& A2 z- U) x3 }4 V

4 N* u$ i2 X+ T6 fA.添加一个From头信息- u. D/ S  R3 ]# D/ E6 U3 Y
B.使用-f参数+ \! W8 z: k5 n2 G5 a! N/ p* r
C.添加一个Reply-to的头信息2 |8 E7 t6 c/ G
D.确保运行Apache的用户有修改sendmail设置的权利
. i5 G0 p8 j# Y1 e* E" |E.确保Apache在root用户下运行
# W2 T$ z5 y  `2 h答案速查
' ]8 B) F2 S/ s1:D1 I5 o7 w9 n) A* V
2:AD
* |. B. C$ |6 F; M: Z3:E
. S, i9 q( H7 m+ X1 {, ^4:Content-Type:MIME
0 d3 i& H) _/ D! b" w" L2 g5 v0 x5:BC  a& A# }5 C! ~) ]
6:A
# f2 n) H1 U: i9 y  r8 ^! y& k8 D2 i7:C% e. x1 Q& {' `5 p
8:BCE
* z; q0 l1 Z' \  m+ `6 f9:ACD- d% X+ j+ j1 C& M$ n# [
10:B
4 T8 n$ v  j$ ]- |11:D$ m; a, B& B6 n5 ]1 q5 k  C! v, n! Q
12:CE: d6 A* j! q; Q% n
13:D/ w) j0 X7 T) B2 z: \- C0 [
14:D  ^& q% _1 }9 \5 B0 A. f- M% R
15:ABD
( n5 s+ V0 Q. f; t0 F. \, M2 \/ G4 K. l: `: p" q: i5 K1 [
* J8 v0 L" ?9 k+ n& P1 G
# W' _$ l4 U$ A7 G+ x- ~1 D1 H2 r
答案详解
6 \0 Z/ ^- w% d: [7 b( z* w$ S. Q6 J
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。% h2 R' P7 H' e) {& j* b

) F. o! J8 N( p* B$ }# b/ \2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
" i2 {2 y& Y# k; \4 `( L( Z7 s9 H, S; X+ c7 z* C
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。; h, ^) y( e2 p) m3 W4 B- n

6 e, y5 `2 V- Y7 r6 c4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
4 |- M- l4 j5 |4 [2 t% |
: ^6 h; [3 O9 S4 J2 |5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
) |3 u$ e1 F8 H) w- q* F- c3 L1 U5 b
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。5 W( ?6 x* J% a* I$ d5 Z. m& g  w! G+ C* i
& b3 t( R  I' j' o. X2 h
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
) ^0 A1 \4 A/ J6 `: Q  s
7 l& Z! P  h) n' G: |8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。, y" B3 J% N2 ?4 Q
6 s' w6 n9 n; E7 ?: M: V
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
8 m/ }, W7 ?. E% t" _; u) ^9 C+ \5 g5 d: Q& U7 Z
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。% Z3 u  S1 K- C! x2 G

% ^& [6 G7 a$ m) h11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
* F5 g* x$ ?$ H
5 j" |2 q: B: W$ X12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。5 x! m5 E  C- E6 ?
! ]8 O8 g+ }4 d9 H4 K" v$ l, L
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。  V" \" R" I" T% |* F

- K5 m( n0 A! F! b14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。( y; I& m! Q+ n- B. Z
8 j2 N5 [# w3 f4 ^
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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