返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。  h8 Y' S6 D/ j! H
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
5 v3 ?: N' o/ d8 z6 C+ {9 ^用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
; [3 p. V8 o/ F& R  u
( P& U0 ]9 N- M' b9 E) L7 Y0 j% b  F9 V
问题- R0 y+ e8 i$ @/ N$ Z! ^

  q5 G* H& [- k4 M7 Y+ }8 i1.以下哪个不是合法的电子邮件地址?* n/ `/ P1 b7 ~% j( ~9 u# h  W

! f7 D$ f6 M& \% W$ r, Q  S' d, vA.john@89w.org
; i4 g1 P* f$ B* _! rB."John Coggeshall" <someone@89w.org>- s  s  O3 R+ V
C.joe @ 89w.org* q& B4 Q# l6 k0 C
D.jean-cóggeshall@89w.org) V; q. ?% I* K! n
E.john
/ u# v. U& f$ l. y8 c! e  s: X, }  ^% J; @4 D3 _( I

2 K5 M: F, d) b1 R0 L+ K2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
) w8 g1 v- w  o9 p3 C7 u7 l( z4 o6 B& R- Q& A- [1 ?" X1 h3 E7 k
A.Windows/Novell不需要第三方软件的支持就能实现该功能
- U! {6 b' V5 F7 O& uB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。9 K$ G/ A+ N' {0 K
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送$ W0 n1 c2 L% X: m0 W7 g
D.有可能完全相同,这取决于sendmail_path的配置
$ I5 P- d$ g( G' Q. U- ZE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
( E# @; l" @0 y
/ X. Y4 w, {2 E/ b, Y" @
. K& ?3 c, C. M2 A3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
# M  ^/ I; m! z7 X5 r
/ H* ^, S9 L/ A  ?% y( HA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
! w6 [7 [% r  i! p; ~' i' MB.用PHP代码,通过SMTP直接与MTA连接。3 [! ^+ j" Q- `8 v/ V
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。9 [9 L! q3 a  p# i0 h
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。- p1 V, {& N  W, w7 n: |. M
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
, h0 u3 ^/ p" L. ]( g2 w. Z/ Z5 Z: G2 J+ k

6 k& a# u5 ]4 Y! ^) k/ z9 m4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?) R! R+ h4 p0 G+ h5 N8 Z0 J

6 n  g: F; N# ?% T8 J+ T9 a答案:____________
7 Y% m% A$ Q4 G9 J% H$ a/ t% P5 d! b

( G. H, y! V# ^6 Z7 p0 y1 ~5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
/ C7 _* B9 J) S# v) ]
1 J0 {3 F& D# iA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示" s5 {- Z$ M! D- u& s/ m0 X* s8 g
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片6 w/ H" Q2 r7 ]1 ?+ N7 e
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
( w( F1 \; u) J" z$ {D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
( J8 l% _5 f/ p$ z2 q7 C0 qE.只有一个答案正确
8 A  U/ \/ x+ Y  M, s
( k. C. H+ x, D; [: S( l" L  `# Q8 `) h9 ]& K; m+ V0 ]! z
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?, b( x7 n! k/ J, x* i

( k2 D1 i% F% S5 I: lA.从UNIX或Windows/Novell发送邮件时都会用到
4 ^5 A# K+ n. p4 j% T2 S3 P1 }B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时% B3 B% j. z; N' @5 y5 j
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
1 D1 V3 s" P/ ID.PHP里用不到这个参数" b( c! B. ~  C7 k3 s
% t9 e0 A5 d/ n7 ]/ f/ A  J

$ a7 q$ v1 l: g7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?' ?3 Z7 k: s! d* s% C2 h8 W
3 F- ]1 Q0 B, C2 _
A.只有在发送非普通文本(ASCII)数据时/ q* W, Q) u1 q5 T1 `3 l3 x: f
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)5 o5 s3 N8 ]: z- |( g
C.任何时候都可以用它来指出MIME的编码类型& o( w% Y% {% c2 H
D.只能用来指定特殊的编码格式(例如base64)
6 q$ O+ ^: U# \: e, L' c" IE.以上都不对) w- r( ~% r3 B* K7 o" D

/ O! A6 R5 E; l0 a, ^8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
+ x; p6 m5 u7 k- a
1 P' t; P5 z7 j3 Y  xA.分隔符至少要8个字符3 u" M  \. F' }) Y' e% g1 u
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)1 Y/ k5 |* S" s! a" e! ~
C.分隔符在MIME邮件中必须是独一无二的/ l+ V( [6 a% x- N( ^$ v- e! r7 A
D.分隔符不能嵌套的其他分隔符中' {1 C$ r4 W+ H  d$ p1 C/ G
E.用什么做分隔符都无所谓
/ _0 I. D  T  d3 ^5 W+ F  c0 A8 B% S$ c7 {- {& [2 V2 n! g) R$ i
+ M/ @6 ^0 Q8 g) G* d
9.考虑如下E-Mail:2 L: }9 ~4 J! Z. ?4 g3 d0 E( k" l& B

- x2 O; m7 g3 p: yFrom: John Coggeshall <john@php.net>/ V0 c. n9 f) Z! m; h; Q0 q3 C7 ~
To: Joe User <joe@example.comt>. Y; k+ \, U% b! p
Subject: Hello from John!
3 i  W7 w2 H% I. y5 k. wDate: Wed, 20 Dec 2004 20:18:47 -0400
5 o- F( I; J" ^) `+ fMessage-ID: <1234@local.machine.example>
9 [7 b" m% b0 B2 [Hello, How are you?% U( w- W* O: f/ W' i; T7 n. r

/ ?- \# M, g, u& N3 B  q+ K在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)# w: R) L( z! }, ?3 y
+ K; L, a7 S$ [
A.MIME-Version
9 @0 b2 q" d  _" M/ dB.Content-Disposition
: z$ @) E. E& x/ k- d/ GC.Content-Type
2 S  `' F) r) {: qD.Content-Transfer-Encoding  P8 A9 ]; L2 Z
E.Content-ID
+ m' R0 v3 ^9 {: v
# |9 [) b% H7 [9 e* J1 s; ^* _- K' c0 ^! e5 o; Z* y
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
# r% n% D/ Y4 v! ?' Y
" O& ]) @0 p6 D: j7 l  MA.multipart/mixed4 q$ E/ B( k# k
B.multipart/alternative2 u' h1 v+ l( X$ b! Z' r8 W. B
C.multipart/default
4 Y2 |% Y: i1 F0 J7 N: QD.multipart/related
+ b3 p; p6 k( x* j0 ~# i, G- ^. YE.不可能用content-type实现
6 _9 _" y7 C2 u  c  n( z. @1 w* @/ M3 U: m3 S5 N

9 ?$ x+ X) M$ {) E3 n% W0 U; _. \. V11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?  B( ^4 E! T# G# Y% L$ ]" P- `5 W/ ~
9 N# D0 \! B, ]% ]2 B
A.安装sendmail服务器
) p3 b7 W8 l6 f6 v$ f4 x6 _B.安装Microsoft Exchange. x" u& d4 f  O9 l. }; W- s: B
C.在你的电脑上安装任何一种邮件服务器8 r# R+ b& \+ f: \
D.改变php.ini的设置
# C. ~0 s/ {8 ^3 F; D" o# ^E.写一个连接公共电子邮件服务器的脚本
3 P' Q4 g- Y: A& g) E2 b$ Q& p4 L  c1 V; x
0 k5 l8 i6 [* |! W. q( _% J
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)) M3 T. u+ n% I" J) p- v
5 v' S/ ]2 t4 ]" B. F& w5 p
A.使用GET方式传值
8 `; }+ F. k: qB.用htmlentities()处理电子邮件地址
) F! y% m3 V/ tC.使用POST方式传值$ C  E: k0 Q/ Z' {
D.用htmlentities()处理邮件正文
9 a: N' G9 ^) u: {- M$ d0 \: AE.确保填写邮件地址的文本域不能有换行符/ w, ~8 k. e# y7 Y% ^
& s8 s7 }/ g) n; }( q2 @' j
. O9 o  [1 C, |4 |; ]) b2 b
13.如何将一个数组作为附件发送,并要能在接收后重新组合?. ]% f( O' a: n7 F& h8 c# v6 }5 Y
0 P- k( y' H1 |
A.用serialize()把它转换成字符串,再用htmlentities()处理一下' ]# Y9 T8 K! y! }0 \" X
B.把它存在文件中,并用base64_encode()进行编码# q# Z2 C$ C: @0 f$ S- g
C.用serialize()把它转换成数组
1 t  P% U0 _; O4 G: r, dD.用serialize()把它转换成数组,再用base64_encode()进行编码3 c  b, Q+ c. \
E.把它存在文件中,再用convert_uuencode()进行编码& H* n/ t% [5 R7 Z1 c$ T
7 P( U7 j6 b; u/ E8 s

2 Q1 ^( B2 Z) |2 t1 g% Z7 _6 {14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
3 O+ S5 r! F, {
2 z% D( K0 a8 ]; c4 s5 k! f, aA.堆一个检测脚本出来0 \( O4 H7 D! `9 _( C) F' y6 t
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
( P  X3 `4 p9 D  v* ?C.写一个识别文件MIME类型与内容是否相符的函数
" g5 y. e$ i- S4 j) Z$ A8 \D.使用mime_content_type函数9 {% T+ y1 ~: J- G+ |" ~7 u9 M6 e6 l
E.把文件上传到外部服务器上, }; D. `% B; t8 s
8 \. Z5 m8 Y1 o! j8 H

8 c9 U1 Z7 r% p15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
+ h5 X$ O' V& N$ W) k0 O4 C$ i6 c3 k' m# k3 c7 h% k
A.添加一个From头信息
7 D0 o$ J$ P7 G8 d9 CB.使用-f参数
- P$ O( L# p) B4 ~C.添加一个Reply-to的头信息9 n! F9 Q% \2 O  T; l! \6 O2 O
D.确保运行Apache的用户有修改sendmail设置的权利
  B0 w' w% N4 e7 G& @6 _6 [E.确保Apache在root用户下运行
( D6 ~, |: e' @3 {& G答案速查
2 o' M$ s+ B$ F" {1:D8 H0 V* n5 w; M4 u
2:AD( c% t6 s% p' q( S
3:E
* Y3 J/ _' c2 X4:Content-Type:MIME
2 k' k/ C& o0 p& `" ~5:BC  h' k5 \; I  J( S
6:A
: m. _  Z# x  f7:C
) D$ R; k; j6 X' y# `8 F4 Q8:BCE
. o8 E) q  H0 E# Y3 T; K( f9:ACD
0 T- @4 C4 g! z10:B& {; {2 A8 x3 _0 M6 s3 D
11:D( W: t  I/ G7 \0 ]4 h6 n6 a
12:CE! e9 m8 @5 }6 r1 y8 x1 [
13:D  N- L, ~, ?/ u/ R3 _+ R8 q
14:D
& x6 P* n+ c* p, d1 _; U15:ABD
/ G# t  A1 K( w  d/ j0 o/ @7 s  H6 y
1 X8 B9 E, [# K+ r. w9 J) U5 K, U+ b& z, t

+ @. b7 D; W" g. ^- z. g7 P7 }答案详解
& p& q1 U6 n% h8 ]7 D( {+ n- W6 p) f! u; J' i2 [% {3 j* y; ]
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
; V" V4 d* _, j5 n% u  e( m* h. j" X; k" \: l9 p9 x* }5 P! d: G
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
0 l- C+ c5 Y. Z% v9 t$ G. p6 W5 {6 Z7 n4 y- N7 Q4 ^8 s
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
, _5 h* \) ]  a' Y) d& c3 k" W7 X3 V) U! a
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
, h* h, n2 D* J0 C( ~8 k/ c. d4 i* O  \1 r2 }, y0 a2 \
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
+ M4 j& N- H: X$ N8 ?4 y3 q! O7 b6 c" ?7 L1 K5 l7 h5 w3 _% L
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。, ^( R% g' }/ U! x7 E
, v* ?+ P# u7 o  b
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。6 ?9 N- z/ w: @6 j# h2 _' a0 o
% C% U" i" f5 o( X
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
1 l, x3 z- u. ?" e6 S0 h/ q
- N1 V5 @; y' T. v7 i5 N. u9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
# G8 H) L" [) ?
! l5 A2 K4 u: U10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
$ Z, w* g" O5 _6 H; X! ]& V: P- Y" a. a* T9 y
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
1 F0 }+ y& ~4 P' d; q4 J& Z) d7 ]( a7 M/ {) |' D
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
1 x, O- N5 `( j! u9 }8 N+ k9 V1 F/ k0 F' L7 f7 ?+ a/ i
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。8 e6 y' n  C9 |8 N

8 Y( ^+ S/ J) r2 T5 m0 `4 j14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
; [. `3 A( [( E' R2 B9 p
1 b- F% m3 g  O' ], r$ I4 i; {, }/ m15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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