Board logo

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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
6 B; Z/ A4 }2 c9 ^( m% H还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。4 D* h1 K( X- n. I# h; o5 m' l
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
+ K* a: H4 y, r& W4 ?( X" B. |2 l1 b3 c' `* y" t4 A) q
) S7 ?; K) d4 j( a& f; A
问题
1 x4 X' H+ P0 M3 N( o: w
+ k( k! x( a! z7 E: b( A1.以下哪个不是合法的电子邮件地址?  A( N0 `" j9 ^- x  a- A( `! V
* W# d1 D* I7 t$ p8 P8 |
A.john@89w.org
- n0 f. f; M) y4 E; i' JB."John Coggeshall" <someone@89w.org>
& g+ u! m$ T! P9 ?C.joe @ 89w.org% ?, M4 E: H/ [2 k! E2 v
D.jean-cóggeshall@89w.org7 f  P. Z2 m  E- o" T% n2 J
E.john
, M) i' A$ i. Z% X9 [
) @; \2 B. e8 _1 s+ Z9 T8 _! C% ~4 X* A" n
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)% x  t$ W; b8 J- @% e
, t  r" j0 h5 x" G7 v
A.Windows/Novell不需要第三方软件的支持就能实现该功能
. u. O- I. F; B4 k& r3 {% Z- ?B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
  `8 K! A* T4 ?" @9 AC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
5 b; u& M- S2 X/ [- |D.有可能完全相同,这取决于sendmail_path的配置9 u2 }  k2 F' ~
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
" `- l& D0 u  }: p
, e% i8 g. w* l% y
: k; A8 `- ?; ~, J. s! S) ~, x3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
' T: g. m& l3 B0 \) \8 l$ c2 H& s6 J$ ?: y% z6 }6 f, t
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数1 _$ {5 J' q) c' Q7 x- D
B.用PHP代码,通过SMTP直接与MTA连接。" X8 r; r0 S- l" N) c
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。2 a5 V% W% u; S- @
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。- @6 ]6 g' R! z2 A0 g# R& F
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
% ^1 n$ ]. ~2 b5 J6 j. W  W  _  U# [

" e: T" N+ b8 y* Q* V1 \% j4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
* R3 t# B& L& U' B) w: t
) }- \$ b$ O- ]8 B答案:____________
4 s3 G6 S$ J4 @( E; i8 O
7 `# d; ?. A  ~2 R0 d
/ r- i& n( P! q3 Q4 B5 V5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)2 m* g. {' ?& a7 ]3 ~* p

7 V' U. \, p% \, [2 NA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示' L- ~& R" I/ v, X! p# c. V
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
0 J, v# T$ D( rC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
! U' d0 b2 Y$ \$ C' Y/ ZD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
7 d, s: q) z# s& {8 bE.只有一个答案正确( L* Q* g: r7 ^! z

/ c1 L- G: }) C4 Z# R, T8 q& b1 Z* n. _( H# P
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
2 X* ~* E: Y) ?, l( q5 r& |5 @: N1 q/ w2 @! @! M
A.从UNIX或Windows/Novell发送邮件时都会用到
( r1 M- u8 [7 ^8 _4 xB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时8 [) ^- A1 f  ~6 E
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
" g/ d% W; Y) d3 l9 A* N. y6 i. yD.PHP里用不到这个参数; N% X' s* [1 v/ T+ R. X

5 I  G. S7 Y/ B1 j5 d. w( E- R3 ~1 P$ O, }0 g: P2 Z4 y' m
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?) _5 d0 |9 f+ M

: J$ j' j; m: R/ L) UA.只有在发送非普通文本(ASCII)数据时
* V0 v1 u. @" B  Y- LB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
2 {2 x( C1 _4 UC.任何时候都可以用它来指出MIME的编码类型
: g  Y4 N5 U- n; mD.只能用来指定特殊的编码格式(例如base64)
. [+ I9 w) {4 |- P3 j$ m5 B- o# XE.以上都不对" c* y4 s& q( `, V5 g: @( a9 C- w

3 C  d; }6 }4 i8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选); N/ C& p) P; C4 j

: S3 K6 z9 s6 w% H' h' l. }# |A.分隔符至少要8个字符
/ ^; c! L5 S5 H" u$ vB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)" K& f7 j" f- r) [$ Z
C.分隔符在MIME邮件中必须是独一无二的
5 |2 t7 Q' G) d2 \0 ]9 {0 R% S7 rD.分隔符不能嵌套的其他分隔符中$ _3 c" o& [  s, l8 \
E.用什么做分隔符都无所谓
( A0 b" g% m- E2 h& j+ {' L5 Z+ o$ v- W" E5 O2 S6 h; F+ c
5 e+ d( i3 d2 j) B+ u2 e6 t
9.考虑如下E-Mail:
. j2 P  ?# j$ H! L7 m( `4 k* x
4 k: d9 z5 F# [5 kFrom: John Coggeshall <john@php.net>
  k# o* G5 i& ?* f7 G7 C1 @To: Joe User <joe@example.comt>
' P, T/ I- G/ G4 Z+ HSubject: Hello from John!8 n. ?9 ~% H! S) ~7 @" c$ K
Date: Wed, 20 Dec 2004 20:18:47 -0400
' \' Q( V. P2 W9 |Message-ID: <1234@local.machine.example>9 a( t; _! z" p; l: j, L3 g8 p, c8 f+ P$ `
Hello, How are you?
( q* c# M" u! \2 F8 k+ {4 l4 {& r. a! r  A4 j1 D( s8 O
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
& O, z* n, k- U/ T% Z5 w2 f1 n; f3 D
A.MIME-Version
' L9 p: Y9 e( u- c$ ~- G; X5 LB.Content-Disposition
" u3 D$ f, \2 s/ I8 VC.Content-Type
2 X& D3 l; ?1 L* v5 G/ G# d% e% q: VD.Content-Transfer-Encoding
" j! P: Q+ w5 P8 g! |E.Content-ID& r& D- _: `* j* w1 W2 o
" c- v" ]: z- t2 N
. @% E) H) w# I- _1 d
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?9 K( b3 b3 B1 \2 S
* @, Z7 R5 n! _6 L
A.multipart/mixed
/ {1 l. i' p+ w8 r. k9 H2 }B.multipart/alternative
& H7 `8 o( }- j0 ^5 QC.multipart/default' C5 _+ J& }- Z' M" |3 \
D.multipart/related
0 O6 P1 ^9 b8 |% t  N: a1 xE.不可能用content-type实现! `; ^, D; g% ]0 O' S/ K8 K

5 ^1 y0 {+ i0 |
; A+ v2 _* B: r7 G( Q% r& S11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?$ D  e) f2 @4 s
8 R/ Q4 q) }" ~& [! b" B
A.安装sendmail服务器
/ [+ b: S1 j2 |0 S/ F7 a- m" i2 nB.安装Microsoft Exchange7 G& ?! h& N$ G; l4 @! i+ @
C.在你的电脑上安装任何一种邮件服务器
. I+ Z8 o! n6 I" D( z/ V# QD.改变php.ini的设置
& C  L. H2 e# P1 \E.写一个连接公共电子邮件服务器的脚本
2 n9 m( Z& H3 ^! B" {: U  n9 [( v) l. x

# _4 `+ {9 `+ L6 X( n* V4 J2 i  z12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选): K' Q8 h$ Z0 B

0 f) t6 a, Y( X7 X9 ^' a+ `A.使用GET方式传值
' U6 ?7 K4 O$ @( iB.用htmlentities()处理电子邮件地址! `: m' K# s& t/ u3 A) }( U
C.使用POST方式传值7 Q% U* y' l3 f  W$ x
D.用htmlentities()处理邮件正文
5 Q5 m* u. z) j: T3 [E.确保填写邮件地址的文本域不能有换行符% o2 M* X  @' [8 z

6 k8 u' }0 u$ t  V5 n- I$ [% c9 p9 B6 o* Y5 k" ?6 Z: n. O
13.如何将一个数组作为附件发送,并要能在接收后重新组合?5 I& p0 @& R4 \- p6 |
* L  W0 m6 \  U6 k2 A
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
+ M! d- w( Y- ]. w& h+ cB.把它存在文件中,并用base64_encode()进行编码$ O, p  ?  w# ^, _, y  w
C.用serialize()把它转换成数组5 p9 z9 Q  Z) c! [
D.用serialize()把它转换成数组,再用base64_encode()进行编码
$ i; }- F2 o3 x; B; L6 vE.把它存在文件中,再用convert_uuencode()进行编码" }& M6 e4 }8 k, W9 t" o3 P+ k
: ~1 X# g: f6 {% |0 G' _! `

! {  q/ H5 D+ n- M8 z& `14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?7 y! E  Y. e$ C9 |" r) {6 Q

  z  `( x. U* ~& ?% _3 i" b7 j0 AA.堆一个检测脚本出来
: ?' q; D2 L6 ~  m& vB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型: }( j) w) }1 y, j
C.写一个识别文件MIME类型与内容是否相符的函数" W; s( k6 \) w
D.使用mime_content_type函数
/ v' u) v+ |6 B) r1 dE.把文件上传到外部服务器上' u. I' i6 d9 U
% |( ~/ Y8 `6 j0 [7 N1 V/ E
7 h6 W$ H2 t1 R0 n
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
3 B6 ~! K/ W, g6 A
6 y1 V0 l& ?1 y$ @A.添加一个From头信息' y2 G# c4 ]" ~+ ~+ w
B.使用-f参数& J0 r, S: Z8 U2 [1 c" T
C.添加一个Reply-to的头信息
3 ?2 [* A2 |) A; a) j& v5 iD.确保运行Apache的用户有修改sendmail设置的权利; A0 \+ ?! U& G1 \3 [
E.确保Apache在root用户下运行; R/ e7 L- k6 R" Z* t; @3 F
答案速查. ~$ W) k' ^  o5 Q3 n+ \9 D
1:D
" ]* t! [( Y- L* S2:AD
7 \* D/ X. }: `: j7 q3:E
6 D# S' ~8 w' p2 ^) L7 t; w4:Content-Type:MIME
$ B$ g# u9 A; _( N5 _& @( b2 j5:BC3 {$ B: |, {* P+ R7 {" }
6:A
4 Y7 g& B) h) a3 M3 o7:C8 }- U) c4 g2 N( J9 Z7 s
8:BCE
( D, v4 b' I8 K( [( ^+ K& b: _9:ACD4 G+ B: ]% v: R4 r( [" p: T
10:B& X$ N5 t) G" c9 N( _, j
11:D
5 R- K  i+ ^, a+ u; V12:CE% x; r2 w3 E3 ]  L, K) z. M
13:D9 s8 T9 K% w# P
14:D
; v) h/ }6 l/ J! `15:ABD6 u2 x" ^9 H. ~2 ~6 ^, e/ }

0 t2 |; Z. t% m) p0 D+ I0 B* j1 h0 @( c: i

0 ~+ R1 ]: M' R' _& A答案详解0 g$ t8 b/ p+ G" z0 V
6 r9 s0 T3 Z/ J% ^$ U0 i1 o/ j
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
% v# y: w, D3 \+ C9 W7 J1 b5 C# Y
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。3 q! i, j! b/ F

$ E; k5 ]- _- A% n! o) ~* M3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
/ u; ^, f  _! l$ p, G, t" i5 C8 P3 q/ \( ?
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
8 s* M+ R! A, N& J( x9 P; g* [9 p! |+ |' L
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
1 H" ]+ ~2 r" t5 u; i2 F: l4 \6 R
+ @  j" U: [* K; b% Y6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。5 Q6 H: q" }- X2 g: ]* a
2 a" ]1 t! o  z) H' l
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# `5 w7 W8 ~+ n0 Y. F) O- B

2 c( I+ W5 ]0 b& C8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
" _& ~. `. z& a2 x7 E) ~" t1 s- l/ s# _8 G' c: H& Q
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。" q+ W$ z9 y6 z& f- |3 \3 d
4 p2 c) R0 X" n  `( R( w8 V, t  ?# |
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。% I# |5 ~9 ~0 g+ X1 n2 S
6 l8 v/ J3 Q2 w, x# L7 I
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
% J: ]7 I" _3 N# X/ e& @) r$ y3 H1 O; V$ N7 G
3 M: }, u, B; c( M# ?8 C7 f" ~- H12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。) A$ r! k- f6 j* C- ~; s: H
; k4 `( v' W( i  `* F& C
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。: r/ O2 K* ?' T  b& i

1 z9 \+ x! b$ g/ @14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。1 e( ^$ J. L/ o) M" b) D* W  g
" k  O. ]" r8 ?) u5 N3 ^! k/ h
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。




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