Board logo

标题: [Zend权威认证试题讲解]第八章 - 处理电子邮件 [打印本页]

作者: admin    时间: 2008-4-4 02:46     标题: [Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。; O( h- G0 p/ m3 V) J* V# }1 l
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。2 P! I6 m# |6 J1 T) {$ s
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
3 |: @. S. f' X4 |. R9 \3 a) \( _: S
3 R+ ~% F+ a, ~% h" E# c6 ^, n
问题
) K9 Y+ P% K% w, F! w0 v! i% G! A& k# a8 ^7 D7 I- I6 `) S, P
1.以下哪个不是合法的电子邮件地址?/ R5 L8 i' e0 E' R( `* P/ ]

! w8 r; f$ ~) |+ s& cA.john@89w.org
6 ~1 Q0 i: G% BB."John Coggeshall" <someone@89w.org>
2 q0 f3 N1 K& N* hC.joe @ 89w.org
9 K/ T9 N8 w( U- J3 zD.jean-cóggeshall@89w.org
) o  s! S' e8 J& }: N0 v: Z' N& gE.john
2 o: L4 O& ?( F  G- L4 B
1 T& M# u) z0 C: L3 T1 c) F
' V/ b1 \5 B/ f7 b" ?1 V" h* J2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
1 A0 M8 H8 }( f. z( \5 E/ S2 R9 r
0 \0 H0 b5 T& a$ _) CA.Windows/Novell不需要第三方软件的支持就能实现该功能
8 c6 P/ c4 C' \7 @B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- |2 ~2 k1 i* P# C
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
! V, b6 ?# L& {( c  N9 ?D.有可能完全相同,这取决于sendmail_path的配置
, Q7 y: \. h, ^& t9 ]/ vE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
  x$ Z' d: G/ A# V/ I) I
  \" w* ?4 d$ K; C) R$ q0 X1 a+ Y2 u4 S+ y' Q  R8 h
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
; A; u# q- Z1 B5 a! x4 j( h- C' v0 `' d
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数  k  l2 F$ z7 M
B.用PHP代码,通过SMTP直接与MTA连接。* f2 x, T2 Z. U5 n& v, P
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
! Y9 D; h( X; @, d' gD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
; w" y! C9 m5 p  a3 XE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾0 u$ a  ^8 E( \4 ~) A8 V

# r3 M3 P$ ~4 W2 f  z& \! K. H$ ]* W% T" K$ t- |0 I2 T
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
7 [1 u7 r! D1 _
( ?5 R* Z3 F: g答案:____________; E3 p5 h# J7 \, r
. F. P+ n! k' b- Q0 t
2 O; B" f9 j6 b4 g* H8 Q7 s
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选). K8 h6 r6 b1 i/ P

7 V4 m: V& n3 {4 \A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
) C& A+ C' i2 U0 n/ Y# E. ?B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
+ x" f* d& L2 M" z3 RC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID! h6 b! t' V/ }  W
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名% D; G. C# ?, v5 j( P. h
E.只有一个答案正确
% z& }. m- P3 o3 n3 f1 }0 c3 j$ N7 R9 V  p) w2 s
( J" |+ ]6 V! a0 X' b0 w0 H9 A
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
4 U  @- s* i6 X2 s- F( }, [
, V. l! ]# }& c. c/ _1 t% |9 {A.从UNIX或Windows/Novell发送邮件时都会用到
! }. E/ z! G1 k: ]; C" A+ S% sB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
: [5 B0 A0 J( xC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
/ z# b$ D+ b! kD.PHP里用不到这个参数& p. X! z) J& f& u
- F1 f7 y( p" I! O; _) ^0 H! u
, C  L: J% U+ P% F) W& i% Y
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
9 t; f$ q/ s2 q* M
6 b. u1 i8 o7 f* ^0 y- D0 h* H- mA.只有在发送非普通文本(ASCII)数据时
! n/ g5 [1 |3 Q  U) S. w& B1 O, IB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
; T9 }5 }  X$ w: ~C.任何时候都可以用它来指出MIME的编码类型; l* x4 y5 ]+ s# C! |6 y/ [
D.只能用来指定特殊的编码格式(例如base64)7 x0 \% u3 E5 w
E.以上都不对; E( e$ Z; S3 j

& K& w' P' n  o3 N& A5 [# G8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
2 ?/ [, r$ e0 @  J
5 S. E8 J: v& oA.分隔符至少要8个字符" w% z# t) b( e1 I5 z  i+ u% I! @
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
& ?, t) \! R- f7 I& iC.分隔符在MIME邮件中必须是独一无二的4 T9 t2 U" m% ]% Y
D.分隔符不能嵌套的其他分隔符中, q7 T0 D! M+ r- h! i" p
E.用什么做分隔符都无所谓& J1 P* G2 P! k& t4 @8 H
5 k2 ]+ k( y* H+ @: r8 E
! w$ ?  g! W; E# G: {3 t
9.考虑如下E-Mail:9 y) o7 R& q  s2 D% h/ A

. T/ {3 a+ w0 P' c" D+ JFrom: John Coggeshall <john@php.net>
; @1 ?5 }1 z. {. C+ q5 I& \1 eTo: Joe User <joe@example.comt>, T+ J. v# w* N
Subject: Hello from John!
0 c5 ~8 k- S7 w; C; y3 c5 MDate: Wed, 20 Dec 2004 20:18:47 -0400
4 |) l) L/ M- y" _Message-ID: <1234@local.machine.example>
/ @+ a4 h. I3 [7 GHello, How are you?- o* f  y( a2 q( f5 @6 g+ J
5 O6 [5 Y6 U4 C  z
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择): g- p3 W& Y1 @* k& Y! r# L$ w4 ?  C
  N) g5 I4 S1 v- }
A.MIME-Version9 I: O) ?9 s2 i) R% s
B.Content-Disposition9 K) ^3 L; y; K& X2 m9 t' p/ k
C.Content-Type
7 J& _' E5 X( U$ a' H6 X6 LD.Content-Transfer-Encoding
6 Y! Y& v6 z4 u: [4 nE.Content-ID3 C" @9 k* G' P) i

1 K: [  k) d4 {6 c% G" N2 l
7 W/ e9 g1 a+ h5 W$ o10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
3 y! G* R$ l1 }4 i
3 L# m- o: |0 n5 `& m& [A.multipart/mixed6 M+ Y) k' K9 V* \  D
B.multipart/alternative, w; ]* G- }7 z8 A' g$ }
C.multipart/default
2 o$ m0 @1 Z: kD.multipart/related9 R$ \1 }! s0 t" d* v% k' J; X6 ~
E.不可能用content-type实现8 v# ?3 \2 E' @6 w* Z
( l  |' A9 _. O2 z- i  D7 P( i
  g* k* R  u5 `% G2 m6 l6 s' e
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?; Z7 R; \* D0 _, Y2 e5 T4 E

5 q$ ^" J- i+ c# n2 W3 ~% [A.安装sendmail服务器
0 ~( v% K# s3 H% QB.安装Microsoft Exchange2 x8 `; f# ^! f
C.在你的电脑上安装任何一种邮件服务器
- C7 h( o$ a5 p4 A  XD.改变php.ini的设置3 H  R" A3 H0 l  \4 K8 k' |7 m
E.写一个连接公共电子邮件服务器的脚本7 j. ?2 P* A; x+ l5 V( b% ~% |: ^
/ g/ I1 w! i  _4 S, ^  W5 e

3 p7 V6 o2 ^+ o1 o/ I12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
/ a6 _' j% `3 h" f3 c5 F
: s1 t! p  Z& l, pA.使用GET方式传值
8 ^  f# A( `) n. cB.用htmlentities()处理电子邮件地址
( h  W  g; Q, D! \! VC.使用POST方式传值
: E: |) T3 j, V- A0 V" Z4 O& fD.用htmlentities()处理邮件正文8 v: M' A8 M3 A" Q7 `1 H; `/ b
E.确保填写邮件地址的文本域不能有换行符6 L8 N! w. m9 r  ^! H

+ P8 c9 q1 p4 w( A3 c2 h. k& M7 K* ?# M3 o/ ?& }& I" r% y
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
  h, m7 _8 h/ O( t) ]/ O& {- j3 g
A.用serialize()把它转换成字符串,再用htmlentities()处理一下( p. m5 C0 A# X7 n- J( L
B.把它存在文件中,并用base64_encode()进行编码
7 `: A6 a: }5 Y' n1 mC.用serialize()把它转换成数组3 X! B& D$ C& K7 ~$ r! H5 [( Z! i4 s
D.用serialize()把它转换成数组,再用base64_encode()进行编码6 e9 ?& ]+ P& z' H3 A! B
E.把它存在文件中,再用convert_uuencode()进行编码1 h( X% F- V. k6 e; G
6 K# V: f# m( d2 y% u4 l

0 a% _' }% p4 r5 z14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
0 i; I3 x1 I" \$ Q! ]4 _- R4 `( r& m, I* J: h/ ]
A.堆一个检测脚本出来
3 N, D8 E8 a8 g( a" qB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型5 ]# D0 s$ K  J# j# `" {( K
C.写一个识别文件MIME类型与内容是否相符的函数
! p% \1 W$ |4 B" ]: m/ VD.使用mime_content_type函数* D0 I5 q- J: \) q; m# }$ S# q' [" f
E.把文件上传到外部服务器上
* |. u" ^0 g. I! \# |& l1 g+ R" r2 E
' l! |2 b2 m( |4 S; a3 n$ R2 ]
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
! ?( z2 r) }2 e3 m5 B5 P. ]( j& Z) H: z: C/ O- D& I3 V
A.添加一个From头信息
" f7 O& H' w$ SB.使用-f参数
) o- b* M$ Q: F, v4 T+ \6 |- ^/ N* M- I+ U9 rC.添加一个Reply-to的头信息
! I  S1 X/ s1 q) sD.确保运行Apache的用户有修改sendmail设置的权利
) y9 O+ V( a% K! i& }5 EE.确保Apache在root用户下运行3 j) f4 G; W& b$ x9 @+ S: L
答案速查
- }8 @2 l* h8 N/ i" I1:D  Z# G: B/ P6 F$ g
2:AD, i) g+ i, ^8 ^* Q) k7 M. h
3:E
- ], P3 {' t* o! i# C. I( E4:Content-Type:MIME
3 f+ r9 B/ @9 C  U: ^: o9 d5:BC
! a/ {6 ^# n' G! p0 C& O4 @3 c4 ~6:A- j* Q0 r4 n. k. w: c2 T
7:C/ \* i9 o" D- @
8:BCE
" s4 ]6 D2 A/ S; ^# p6 @( H9:ACD" }4 z: `1 ~/ p; B% W1 o
10:B/ k0 q3 Z; a) l8 U7 K
11:D
6 C9 a9 y1 S) b. ^" e$ Q7 Y12:CE
0 F# C/ j  c7 e- [/ j13:D* p* ^- m3 R( a0 k0 R
14:D/ y7 y" {/ n8 c) g8 l# B
15:ABD" _+ H8 [, k6 B6 t+ i# r

7 Q  T& Y9 `3 _- V3 n+ Q$ |+ X' _* e7 ?6 h4 U' {/ I1 d
) M8 O4 |6 _- N- V$ b
答案详解  G5 ]6 E* {4 P& U- Q& D

- M; i  F% `5 E1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。3 a; B3 L' p  ^( i  V3 G3 D

0 J* f% b; m; v2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
& [6 B  }. z, W7 g3 T( @
& p4 l" k" D0 p3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
) z. k% }& r' M9 ?4 L" W) T- q+ I
2 p% g6 U9 ^2 S3 h4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。' w' h3 {1 I8 K5 A9 ~" b

( c, f; P; v- o, p( {/ |$ d( ~5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。$ M- R, u8 k5 c# e4 C

' x5 r+ V! B; Z6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
- z2 u+ _8 [- `4 L2 T
5 p9 ?5 n4 i$ ?2 P% D7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
3 a: Y1 o/ ^: y+ t% A/ N( K1 ?, A0 o/ t5 O
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。% Q* ^% P4 `( h: n. |6 Z1 v
; U7 k) @) d2 {9 P1 _! D0 n
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
2 z& q$ G* B- Y& Z. ]0 x6 P' B2 ~8 }' N$ A
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。3 a1 d- i5 R1 F8 J; Z) p

7 B2 x9 D2 Q7 R- b) C  Y( U11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。; W7 `; m& u7 \- }7 |3 V

8 a# c  z4 M$ ?12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
: B; P& H6 Q8 y' `; x) G
7 V; v( k3 ]/ M, i, a" w13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。  m4 H, J% Q& V8 v& q* U: Z- E6 X

) B) j- y: r0 T0 W7 G1 B% w14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
1 F7 m1 e$ E9 u% g" V+ o" w, u/ S" h; d: F5 M7 Q
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2