返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。+ Y8 l3 l; Z( _+ @- Z- i) p
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。. T1 r' w' k' m. K2 o! U
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
1 u8 ]" l6 J+ A, A' W
% s" n1 N' q7 K( n
" G% K( ?9 r' T$ ?8 U问题
8 t: {8 Q1 q; i- g1 x' S
8 a6 h) X$ k5 y+ }1.以下哪个不是合法的电子邮件地址?: I8 z5 D5 y. c, M7 w+ M4 r+ W& A

) S: k# V. K8 y8 j# V; K1 B1 N, `A.john@89w.org4 I, R, M& T- Q! ]1 f$ X& G
B."John Coggeshall" <someone@89w.org>
5 ~+ S* P1 h) Z4 u7 n, |/ TC.joe @ 89w.org5 a/ e6 d$ ~6 B9 `9 j
D.jean-cóggeshall@89w.org, D+ f: z' g" ?+ w6 b2 Y# V: ^
E.john5 I2 f3 H9 n6 [, ^$ x
% o) r" t  t" n2 b- N
* ]9 g4 `9 i" h  k, t, y  e9 q* o3 M
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
5 M5 K) o0 {% U& ^( [
9 |  {5 k4 e* U' @( G$ a* jA.Windows/Novell不需要第三方软件的支持就能实现该功能
1 x! R# j6 ]& `0 ?3 ?/ H7 S% l9 TB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- r0 h. y  I6 m" k) M1 [
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送  s; J: n- B  x9 l* h7 n
D.有可能完全相同,这取决于sendmail_path的配置- `. ]- h. _( i
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口0 `- [" H0 Z6 @- @4 b" J  o
+ e8 q* g2 Y8 M+ g/ N" q1 C+ @
+ z! h7 r# L, O8 v+ b, q5 V
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
0 y) U# |% g7 K1 ?9 j! |4 ~, L5 h! ?+ Y
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数7 W" P6 N$ D4 @# \# ?# D3 H+ I& Y
B.用PHP代码,通过SMTP直接与MTA连接。& L* L) H$ S0 D4 s- j# n* c( V
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
( i$ H. B% f! |( J& J5 DD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。2 S9 _, q( J) f9 @( b, x+ Z/ Q9 ^
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
2 A+ e( o1 Y* E6 ?' _. ?. j
. P7 _0 y  _+ [# b. L! {# n2 C% z
' a; y% |. ?' J2 R4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?* R3 r- [1 r$ h2 a. @6 o0 d/ e
5 @: ~  h$ E) i2 F$ O3 Q  l' w1 G
答案:____________
, E& Q* b- A. F  d# K, M
2 R7 U+ ]3 O+ i0 R2 {/ y
1 b' R( g+ C; p$ I2 v9 \, r/ f5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)/ \" t( l. n# y& P! J& X

0 n( Y7 o+ m- B9 z  u6 zA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
; F/ k" C/ L& p+ bB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片$ `4 b" Z4 a2 K5 X8 ~- P: E0 V& a
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID# a+ R& b8 {3 h( a% g
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
5 K- R7 {* h1 ?3 ^6 J0 E- t# SE.只有一个答案正确2 z/ L3 d9 ?+ k$ l# r

( L9 M1 n8 V( F2 A  y/ M$ `1 f' j
( g% N1 H3 V& Q& |, N+ _. ^1 L6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
% y9 w: F2 i. o0 A6 W+ F# o' |4 H  C' S" v
A.从UNIX或Windows/Novell发送邮件时都会用到
3 w" G8 s! j4 ~) b4 P5 _7 JB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
; k- ?" ~, I* |4 xC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时6 m! K6 Z' `9 n# U/ o. A: T
D.PHP里用不到这个参数& _1 i4 ?, Z6 h" G; N& D
) K, ]4 W$ w+ t) a& _
, B. n" H7 U" C! x. Q
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
- b6 c4 n* p+ @% i, N
6 ^2 H, _0 W* DA.只有在发送非普通文本(ASCII)数据时6 v, I3 \9 _! N2 Y3 l$ g; a
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)6 Q  p- p6 ], y) ]/ q5 o
C.任何时候都可以用它来指出MIME的编码类型
  t9 h0 w6 E6 DD.只能用来指定特殊的编码格式(例如base64)0 j0 i# a3 E: G# }$ I5 ~( D3 m
E.以上都不对8 u% J/ {4 r2 @$ }
- R1 @  h( F( \7 C
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
: i7 _+ f, I4 N. Z% ~( S) z
% O% S! W* f0 R/ U- nA.分隔符至少要8个字符6 B; ]3 m9 s8 G% b
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
3 x6 j, d: K8 |+ ~C.分隔符在MIME邮件中必须是独一无二的
8 ~! F" x) ?) S1 GD.分隔符不能嵌套的其他分隔符中6 w, [) V9 l/ S+ x
E.用什么做分隔符都无所谓  O% r+ d2 S; u" L& S
, `  H4 Q1 J* h( N3 A9 D
) e2 f0 s  f, @: U1 s& w
9.考虑如下E-Mail:2 {8 S  f) Q% b1 s2 A+ o  U

1 [- T5 M- {/ J4 @* kFrom: John Coggeshall <john@php.net># n# l: W: e7 M
To: Joe User <joe@example.comt>
, h- Q7 L6 T' b- G$ M: KSubject: Hello from John!( D+ c/ ~2 g4 }- k; p1 U- Y
Date: Wed, 20 Dec 2004 20:18:47 -0400
7 d4 Y. L8 r+ p" w  a; GMessage-ID: <1234@local.machine.example>
! A* L( ~- Y' cHello, How are you?
6 P. w5 h- H+ @5 q( H, Q& G2 V: Y8 [6 G
: @! f+ A$ y0 U7 ^* B$ D: x在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
% h& a7 @5 \! c/ L- s5 w4 Z$ M9 |$ ]% y6 n% v
A.MIME-Version' t% X1 F& }. l3 B9 H
B.Content-Disposition  r* h& K- Q4 W9 A8 \
C.Content-Type
  g0 q. l) s# p) V( F( T9 Z4 lD.Content-Transfer-Encoding
- J9 f6 k9 T! RE.Content-ID" z+ }* ?' \* E6 o5 y

1 w5 Z9 p4 E; G, s3 }; m' q& o* K. D- h! H
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?2 y9 _* {) |; L, x- K

5 U0 G: f8 K6 V/ y, Z5 J$ z: F3 AA.multipart/mixed) ?5 p& ^2 L6 \, x
B.multipart/alternative
) x+ ]2 Y  t8 ?% M: n2 P" h: D' gC.multipart/default
) z7 Z/ g" Y6 j. [5 qD.multipart/related1 h* m  h  D* C; L0 q2 \; r9 E
E.不可能用content-type实现
4 e5 Q4 z3 A- Y' w# b1 B0 s
; w7 b. a) j# a
* K3 }! }5 i/ Q11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
0 X; i! x5 N/ i2 g, i
" ~" C0 N# F7 D9 SA.安装sendmail服务器# J# e& h+ f# d$ i
B.安装Microsoft Exchange" o' I* N! u9 }* o
C.在你的电脑上安装任何一种邮件服务器
2 s9 V9 w. ^" N3 Z+ D9 jD.改变php.ini的设置" N! C- ?' F: U& T* A
E.写一个连接公共电子邮件服务器的脚本
2 K* ^& z7 B- U; k/ x5 }1 \2 }' w) m$ X" z7 o- P( _- K
) k" \3 g$ H3 }% b; t6 U* v
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)! X- n, `/ H# K! F$ j7 Z
8 C7 m: K* x/ ?" a' n+ C: D
A.使用GET方式传值% z' B' s3 M* T( _& [& c% Q5 x! y
B.用htmlentities()处理电子邮件地址
5 [! r/ A8 u9 ~3 V1 O6 SC.使用POST方式传值
3 V+ i. x/ S# X/ C' N4 |- j9 }D.用htmlentities()处理邮件正文
; G5 ?/ Q3 q( d; i8 }7 NE.确保填写邮件地址的文本域不能有换行符  O; f% Q0 r$ J% K  j

2 w* F' M$ I( \/ M. H* d- {* o% B  M1 ?6 x( Z' ?
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
* h$ s6 Z  r+ v2 k$ z+ H6 b. s5 j5 H1 \. [/ F) t, U$ v1 Y! m" r" U
A.用serialize()把它转换成字符串,再用htmlentities()处理一下' e4 G4 ~# l0 _3 A9 V
B.把它存在文件中,并用base64_encode()进行编码0 o" O+ C1 |; A/ g% t- c
C.用serialize()把它转换成数组9 S+ ^, A/ M0 Z  ^4 P# ]! Y! Y& q) U
D.用serialize()把它转换成数组,再用base64_encode()进行编码  k6 d- [- H$ s# q" z; Y: O
E.把它存在文件中,再用convert_uuencode()进行编码. o8 N! v6 M4 C7 D* }
: O/ V6 F, ~2 X( i
6 v  {7 L6 t$ W" \! t/ x
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
6 n* v$ _; N1 y2 a+ ~2 l$ V. J" J+ i  G  I4 {0 ^, s
A.堆一个检测脚本出来/ B: N: w9 Y# o
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型# `7 N" P" `: V
C.写一个识别文件MIME类型与内容是否相符的函数5 N  i5 E$ |7 C. K( X: m+ ~; [
D.使用mime_content_type函数& i1 u, Y7 F4 P: j1 R/ G
E.把文件上传到外部服务器上- r/ B% C' u5 P# i: x
8 V' ]% ]3 u3 s  C- x  e

. i$ r- P0 P5 k" Q$ R15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
2 n/ O! K' _9 K* C
, l, `. ]/ f/ J& QA.添加一个From头信息
. I; I% ~6 r: HB.使用-f参数
4 \$ y; w/ d% c) G  mC.添加一个Reply-to的头信息
) i8 t% m" q2 s" _* L- c- Q8 wD.确保运行Apache的用户有修改sendmail设置的权利& |" [; {) d0 q$ `
E.确保Apache在root用户下运行3 t7 [3 x$ T  o$ Q% n  n' @
答案速查; [% e9 f4 x' U% W( j1 t
1:D& L- n8 V7 w8 E; L, |/ s: F( o
2:AD
& V% A0 [8 X9 Q  _4 I. F3:E
  y5 y2 ^2 [5 g, v* f6 b4:Content-Type:MIME: y  E% K5 ^/ O) {
5:BC
6 X, e3 P5 k7 L8 y: j/ w( X6:A! R3 Q, ~/ }# `5 q
7:C/ D& u1 ^# q- m/ b; u
8:BCE
4 K, }7 N9 M( ~2 u6 I9:ACD; s& v' @( X- X3 W0 y
10:B4 K( `& S: @" J6 `7 r1 H/ i0 f
11:D
, b- [1 V$ w' U! B' {12:CE
8 R7 v: I6 t1 i) d3 o0 S13:D
& b. I/ h; l5 W14:D
, W+ F; s! y  r! ]15:ABD8 @. Z' o8 H' D1 F# \) f

8 c# w' u+ A% d2 q" c# Z
) H& u8 j5 d1 M. H" Z) y1 f/ ?' ~* p) g
答案详解
3 n9 g7 X8 M: G4 K5 ]) {0 j
0 d+ b# S/ F* p! F! n- B1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。2 r/ K8 {8 m9 a# f3 @
) |/ F* {4 S/ [& X9 ~% l8 k$ s4 ~/ _' ?" U
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。! m' C' [9 Q; `: W# B, x( k
$ q* s' P+ f% U
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
8 X. _7 f: j8 T7 O' x3 V4 f) S+ E0 S( F: v- k
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
# |# o3 {; T5 T, }2 R
3 R4 t1 R1 N4 V+ P6 B5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。: d" k& [* }- T) m3 [) C0 M

6 T% n6 F- ?4 G! v. M6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。1 x  T8 g& s3 @4 N' \) k

2 V3 m* U7 U+ S. k7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。( {& B( _) N2 ~5 L

! `+ S% D: i# v  l9 A8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ G2 e) w1 p5 d' \2 u) _5 D, k2 `! @# ?
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。# B7 H& R" ?  T' ^# V

9 W: V, K, ~2 y- M10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
: g3 Y7 y0 x( K$ _4 ^+ l- W4 [6 {  M) u7 R/ B7 B: X& ^4 S# r
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。$ X- `! T& n* L  A4 Z( @* f. y

0 Y3 c) }# d+ H$ j12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
. w: B" v0 C2 J- P& e) N7 t, X1 y* F+ x' ?' {
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。9 E+ Y3 |9 w+ K" f0 j
/ H8 K. S1 J; J9 k& s3 _& D& i) h
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。. D9 C4 K+ U! r# H

8 b; b' X; b8 D4 j# [2 h( v# ~# Q1 I% y15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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