获得本站免费赞助空间请点这里
返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
" k) N* s& j" _还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。3 F6 h, p6 K4 f
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。: G$ }! @6 q7 G! ], d4 P
: [3 L( N: T- m- y. E6 c

3 `3 ?/ N$ z# t问题
/ [& J) M; J5 ]+ o
/ l  e) I3 t# e& S) U5 R1.以下哪个不是合法的电子邮件地址?
" S  p7 X5 s+ g0 {: t* O0 j8 W* x' ~# w3 A1 ?% Z  B6 x
A.john@89w.org; q3 X: D5 J- |' M
B."John Coggeshall" <someone@89w.org>
0 S5 l6 }% f. v. ]C.joe @ 89w.org
* E7 x9 |2 I! ^, [D.jean-cóggeshall@89w.org
5 @+ B" w8 L0 SE.john
( O! T( R  v$ K0 E  n
! v8 Z' Y; o3 d& m8 l8 r' f; b2 a+ k/ T9 k& i* z
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
1 \4 e, v. D) Z% _8 `: _: k  @( Q8 y
% S' h' v" A2 x- P1 m6 D8 L3 O+ aA.Windows/Novell不需要第三方软件的支持就能实现该功能
# j% g* z. Z$ m2 qB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。8 N4 y8 }! M) M4 \# a' S0 p
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送. f! F- x9 X0 k  R9 c
D.有可能完全相同,这取决于sendmail_path的配置$ q) p7 w" |, k1 N9 A# W
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口/ E7 w5 p: v2 P& Q

$ v: _2 Y& g% H, @3 f) R, i) L; Y% C; y7 l- n
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?4 q! p0 z$ I- w; I

; p* o4 l) L; x2 F1 E0 D: Q' IA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数+ e! e' i8 Q4 E) @0 [( o4 w8 i
B.用PHP代码,通过SMTP直接与MTA连接。
3 I+ P# ]* J- a( {* tC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
# M* u: z" v/ S  [* CD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。7 z1 X8 k8 @5 n* n1 b/ n; z) X. S
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾, _6 J7 ~  R* f7 B. y
* ^. ?9 q$ `$ F' Q
4 ^2 Q3 d1 Z/ Y' f
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
8 U2 E' \' W. \+ O
* l0 R# {9 t) t答案:____________
) I& u; A2 @6 U2 d: H! s) V4 q
3 F/ A0 L3 Q, I! a9 ]/ h4 ]1 E. Z  R  Z, g( a% \
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
# D" E- m( `* ?- b; l2 x% Y( r* S$ ^+ |/ K0 A
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示# W  ~. l. M- s6 j" n
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
: W* ~( J+ D7 O7 f$ nC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
2 C/ p  s8 f5 ~+ oD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
! a3 `) @) h7 }8 o2 v# l7 I5 D! H4 sE.只有一个答案正确3 i% s( }3 ]# P: V: G" \+ ]* r% h5 `

$ F0 O; p$ d! e6 y1 N
: L! F$ o4 ~/ e6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?  j' {$ n' N4 @/ [. b. W9 ^

" e7 m( y/ @  S" E6 |0 F) x  NA.从UNIX或Windows/Novell发送邮件时都会用到7 [) m( p1 i  L# B  \( @( t4 ]
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
0 O9 |+ t8 |4 @4 V$ L4 XC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
5 Z2 g2 y6 g2 s9 s" `D.PHP里用不到这个参数
, F3 |  i; n7 D
1 E+ Y4 |( L' c2 H* M" ?/ t
" F7 A0 C: f) U; x7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
6 G, u8 o: v! |; Y+ K  J. }2 ?+ K6 K5 Z5 I
1 V* H. T- L" N' v' FA.只有在发送非普通文本(ASCII)数据时
9 c: D& X& ~0 w# ~2 f2 @B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)" \* S4 I# F: P, j4 H; T. h
C.任何时候都可以用它来指出MIME的编码类型9 [8 H4 h& e3 [6 w2 k' u( h9 [7 r
D.只能用来指定特殊的编码格式(例如base64)
1 C( G4 c1 E5 m7 z/ }E.以上都不对  k8 T2 }9 V# y8 ^
  p/ G$ g# F6 j3 r; m) |+ b$ u
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)! v* z1 c  P' E7 }' A+ E4 v0 \) |

1 e. i4 T4 }0 N; D; v4 x3 @A.分隔符至少要8个字符! M+ f% W- E; o  P
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)2 A& w0 r$ _' o& ?, x/ v* z" w
C.分隔符在MIME邮件中必须是独一无二的
- l5 v7 s& l/ r7 J, F8 ^D.分隔符不能嵌套的其他分隔符中/ Z' H4 I2 s2 C7 J
E.用什么做分隔符都无所谓& c* a% E0 |7 m+ w2 J# S1 k  n

* x" u9 _# _0 _# t; m' F1 K) H  _# F5 t2 ]
9.考虑如下E-Mail:
) w3 l7 k9 J( b: W8 k& Z
% V" K3 G0 m( u: m! }From: John Coggeshall <john@php.net>
& S) O- ]2 t' u+ K8 r1 [To: Joe User <joe@example.comt>* b4 Y1 j8 f& H% n0 E* H
Subject: Hello from John!
% J# R+ f7 k6 u' C9 m% s, Y$ M- DDate: Wed, 20 Dec 2004 20:18:47 -0400
! a9 H  M( p. ?% MMessage-ID: <1234@local.machine.example>% c0 x, o/ D" B. w4 \
Hello, How are you?
" v& P" \5 @- z; V; b4 r" j6 l2 e5 ~1 v6 ^& G! ~
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)7 V: z( W+ F7 D7 X7 h
) t3 G6 f3 }' |# u
A.MIME-Version
/ G: s) U5 L! {# l! R  `B.Content-Disposition/ X( N0 k9 h8 k2 |& ?
C.Content-Type
8 h: J' n' e$ S/ k; FD.Content-Transfer-Encoding
, R; A# K$ T! yE.Content-ID
! o. o+ i+ y' l+ ^: X8 f
1 T5 c5 w" w. n" l- m. {; Z& K" k- J; m( X& r
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?$ p! n- \: d' ?$ J
* b( l0 M* Y- A: J: n: A1 U5 B
A.multipart/mixed& u9 x' n9 F. j2 F2 k, b8 @
B.multipart/alternative
0 L2 g! n: X' o) B0 WC.multipart/default, r6 D+ Y/ C9 \8 L
D.multipart/related6 u" k0 ^/ l* g" q
E.不可能用content-type实现
3 Z+ w4 g$ y9 R) ~  h, p
2 L& K2 Y# w8 ^" n2 s7 G9 ?
5 v, Q- W) E0 @6 p0 l% p11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
, T2 U' k5 u& N. A5 c4 p# h& D8 s6 Z, Q; {- I0 D4 e, b$ d
A.安装sendmail服务器; l5 p  n3 ]1 @
B.安装Microsoft Exchange) S6 t) q* f- w; T! S! ~" ^
C.在你的电脑上安装任何一种邮件服务器/ K' o( A0 L/ D! Z( a& U( C
D.改变php.ini的设置
* K0 b* `) c$ @: l5 ^4 a! F& iE.写一个连接公共电子邮件服务器的脚本
/ i" l2 ^5 H1 I) |8 N9 q
9 T( b) K. T% G- T0 ]9 ]# d4 I
; j( `0 m9 p4 Q: g& J# k12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)! R! i7 j+ |" [1 S; z, V/ ?
0 O0 H* l1 y4 P& y
A.使用GET方式传值! q2 D! D* F+ S& \6 d
B.用htmlentities()处理电子邮件地址
7 Y3 P) B6 `5 L  P8 n; q8 SC.使用POST方式传值* `. G& H- F4 X# g. s
D.用htmlentities()处理邮件正文$ _2 W' N1 l, \
E.确保填写邮件地址的文本域不能有换行符
0 w4 i! j4 F4 q( ^
+ c. E, o7 s9 H' ^: w- y; e% }# ?
13.如何将一个数组作为附件发送,并要能在接收后重新组合?& W" I3 o$ L* O6 \5 _
) V6 y, q8 _* _* C! O9 f+ L
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
3 y: B1 l3 s" |) ]B.把它存在文件中,并用base64_encode()进行编码& N+ h9 _1 Q! B- o" \) D9 ?) O
C.用serialize()把它转换成数组2 B# d! G5 ]5 n# [: \5 @  f
D.用serialize()把它转换成数组,再用base64_encode()进行编码
: M2 S$ l- I8 K) uE.把它存在文件中,再用convert_uuencode()进行编码
( f4 V% i% w4 B7 b% d' x. ~. H& H+ j- G, n

7 l# D, v7 t; W8 C* ~14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
6 t7 `0 u" N) U; o3 v* i2 g% v4 w
A.堆一个检测脚本出来
2 c6 r2 E& ~; h0 J! VB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
+ k5 @5 g6 P- u- K$ m8 Y( q; `C.写一个识别文件MIME类型与内容是否相符的函数6 w, |  n8 M( Q3 f  m( [
D.使用mime_content_type函数
% n( v( ?4 l* \$ n; f' gE.把文件上传到外部服务器上# ^# l3 ]/ S" H' n

3 K, \: ?0 M: z$ h% m4 i3 Z9 d; Q" Z: V( m8 d6 ~+ H" X
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)% p; N5 Y1 [1 V
8 {% ?( O  X) L8 Y& n6 m
A.添加一个From头信息* M( n; h- \( Y* q& [
B.使用-f参数/ Y* R) M4 G' z( s3 f4 @
C.添加一个Reply-to的头信息3 p+ l2 v" ^" \
D.确保运行Apache的用户有修改sendmail设置的权利7 g# o# ^& `+ K$ g. i: ]
E.确保Apache在root用户下运行1 m4 B- Y. g2 o+ u7 y) i" b
答案速查
5 k* J/ u, {: G; L: v% s9 h6 N1:D
) p. }% b0 G: F, N/ K& n6 T7 N2:AD
& H8 Z9 S( d4 s0 \5 _; x" p3:E& k8 i, q$ R+ [1 o3 \- N
4:Content-Type:MIME( Q3 d9 f+ P4 w6 O  {( z- o
5:BC
2 e8 i4 J  N' h6 B; P5 m6:A3 G- q% d$ n* T# {: u9 R
7:C; l1 o$ t8 X5 ~$ l
8:BCE
  B+ e" I- U6 g9 @; j$ l6 w9 u9:ACD
" e# f) @9 g2 j9 V+ n. k10:B7 D5 x4 j) ^' `
11:D
3 Z' k" t- t  Y' M; U& T12:CE: n: J% @% n( B4 R& ~6 |
13:D
! ~- J/ r( f" R14:D: ^" v* M. E  c- v/ C" W
15:ABD: m3 d: D6 L2 n7 q4 Z! u
( F3 X1 q- h; c0 |9 e7 u  Q1 k. {

8 d- A* Y& B4 C$ A) l% ^  g& V1 U9 \! ^" `; ?! T3 d
答案详解; X# D- N$ @/ D9 l9 ^. V! z

5 V- D8 f) R0 G6 U) U* E$ o( j1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
. B6 m) w( r  i6 R' T$ w/ \4 S+ s4 _6 `5 F3 d2 x
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。* r  J) u- |, [0 _+ G  @# j
* T$ {2 K& }& C. M
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。" C( O* ^/ ~7 }% N

" N$ ]; M3 P8 L  Y% B4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。! l1 h0 X4 b( d  D

, ~! r) l% R, F* @8 _' K5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
% h  v, }* ^3 y  ]1 f7 T( H) Y6 G- x4 f7 Q# v9 i/ I; L
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。9 K9 G6 S5 }2 z

' x( D" }7 @+ E. }! B7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
3 p1 m' _$ }0 k8 w) s) Y& \$ ^, N, G3 r7 _  K% z' f
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。( x" ?) ~5 L1 d+ Z! s

- H; F3 r' Q. T! n8 d0 P8 G4 u9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。$ s- i+ @, |  B2 V5 `9 t
3 ~9 d- k% l4 Z8 a9 F( X. ~. q# C
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
+ e( m6 D4 `  u" Q) o% B# i. {# v
+ C3 L8 P, w6 e$ t' g11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
$ W$ W) {, |- Z- v) ^5 K/ M$ i8 S# h+ [. D1 i4 X7 d$ H
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。; F0 p2 H  L1 {3 Q7 t9 s

+ d9 t9 {8 a: S( c8 ^3 P8 T6 Z: Z9 t9 w13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
# Z! H+ X9 }7 ?; q; Y0 `7 w8 L1 |  V6 F% z# h
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。2 G+ W7 v. R, L' w

) S9 B3 G+ K. j' C15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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