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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。0 j+ Z& d& D0 r$ B
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。7 Q# @, ~- o2 \( a% M) r# r# v
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
- L: l% K6 c  W8 i+ K% e4 N8 N2 G& @! ^

; J2 E! D+ L# O' p问题
: @) L1 E" d# G! ]0 h) q& f1 ]: J3 j$ y6 ?' Q0 i+ F; N  i1 X: D  t
1.以下哪个不是合法的电子邮件地址?, G# a( ^& u6 C9 [. R# N3 b5 h- P3 t

# `. d6 i8 `, X8 xA.john@89w.org6 ?! C( d: Y- ~$ y* t
B."John Coggeshall" <someone@89w.org>  ^: t2 F4 K% P0 @! s
C.joe @ 89w.org
) o( ^  |6 ?) `2 F* D) LD.jean-cóggeshall@89w.org
  j& M7 T  s8 Z6 d8 Q4 w$ O6 {* eE.john
0 ~+ ]; E- a! R4 R' @* G! Y6 v8 |/ [3 x+ a
' A, T( n  l3 v: R
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)4 N& X( I; y8 e3 ?

9 }; n: O' T" _2 x' J8 M# o, aA.Windows/Novell不需要第三方软件的支持就能实现该功能, Q1 f" s7 _) U) e9 E
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
9 s. d* j! ~% U5 n. f6 ~% t( o) v* `C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送* j5 Q; Z0 `1 Z" x1 t
D.有可能完全相同,这取决于sendmail_path的配置
* Z( N- K0 g6 \4 a& f* q# ]E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口- j. w, A+ r$ u. e' F; {2 C; b4 I- [

& Y1 e% m9 V9 g3 ]
1 Y; y4 V  W$ E1 b( g5 ^% C0 n7 M1 c' d3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
% Z! @. V1 o) @1 X6 l  @# w( B3 H# H
9 @: e: ~+ ~9 J3 LA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数) n( X/ c* r% A$ I
B.用PHP代码,通过SMTP直接与MTA连接。2 N7 D: v9 z% }: w, `/ E* Y
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。$ d. ^4 q. [9 H
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。4 X8 }+ e6 L! f4 {" u) A
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾6 F9 f# |6 K4 W9 K( R) v/ k

- I, _2 H% q. Q
' ~" o+ U) Z# o" a8 H7 N5 b# a4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
) o$ q/ P* a8 ^8 y  b7 {- Z, c
) A0 y( E9 ]5 o5 I& H( @5 t' \答案:____________2 O2 C' s& Y/ H- Q; s
3 V% \, I' v8 |8 o1 ?' K! q

7 w3 i* g# }( w. M* o$ L5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)0 H( F# ^% ]5 n- Z( c

! a, Q# V% }& T; w( yA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
. C4 H: P& |9 V7 A3 M0 k+ V* OB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
% Z4 |5 @5 L8 s9 F7 ?* V3 MC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID. |# \8 P  ~: o5 b+ ?7 u; D
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
( X. t4 q$ C4 ?; W5 p( xE.只有一个答案正确7 Q! X$ z! e3 m0 Y% A9 D( l

7 B7 g3 ~. {% k6 o: X, m. c2 Q5 l9 R. o
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
2 e3 B) ~( P$ x/ K, D
3 {" C: }- E+ s, u: nA.从UNIX或Windows/Novell发送邮件时都会用到
$ }! ?9 z2 [. R# NB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
" I8 @0 T$ f( r; ?C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时( C& d4 h/ d7 r* q' d
D.PHP里用不到这个参数
7 N, O  n: x  d' u9 R/ o& X1 I% `5 [7 D; A' z- c
. [7 t( j, ?& s  [$ f
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?) ^% ?8 g# {+ `$ v2 w( y! ^
+ ?! u2 Y7 k# @3 O4 K/ S
A.只有在发送非普通文本(ASCII)数据时: A7 F9 G  Q# d) q; E
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)8 o7 K& y" w# P2 t. m3 q3 b1 T# h
C.任何时候都可以用它来指出MIME的编码类型9 T# U# m" Y8 Q8 P  [/ G
D.只能用来指定特殊的编码格式(例如base64)* |/ w2 t+ h' j7 I/ ~2 ]1 D7 W9 y' a
E.以上都不对
& i5 x# _7 B" J3 H' T% ~" _: G
1 t" y" O2 f) \% R: }8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)8 d& d6 m, h2 b7 P
  R) y% B' x) Q0 M  W1 a
A.分隔符至少要8个字符
3 E# J5 X% H  b0 `1 h% nB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)" _  |7 M) `# ^, c
C.分隔符在MIME邮件中必须是独一无二的
" E/ {) ]; o1 L" I7 Y7 R. ]D.分隔符不能嵌套的其他分隔符中
- d- M2 m0 Q% D" n& c! A( PE.用什么做分隔符都无所谓) Z5 d5 J7 {/ M: V

8 N$ C6 j6 u" ~/ K5 I4 v
' u5 E3 g9 v. p9.考虑如下E-Mail:% Q& Z) x5 M) e9 F  T7 m+ T( i
4 i" U: L3 S3 @) c, C5 s
From: John Coggeshall <john@php.net>
  W" |! B5 h& cTo: Joe User <joe@example.comt>; [; W, i! r$ b+ C5 P* P2 |$ o
Subject: Hello from John!
& @; q1 w" F* P  h% q3 E5 d% ADate: Wed, 20 Dec 2004 20:18:47 -0400
- A) g: L9 D2 ~+ R9 y1 x7 _, LMessage-ID: <1234@local.machine.example>0 E- {# @% f0 r  R' Z& F8 {  n( x/ m
Hello, How are you?4 I0 X! z4 c% m2 O+ Y! l
1 B' a* V! b8 a% Z0 A& V; |
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)# A8 Z  V, r2 `* b) O

- r$ F. K3 J# Z2 |9 i- C2 j- SA.MIME-Version1 r4 p# P: b' b8 b% `  W$ n
B.Content-Disposition
" P: S8 r6 N2 O+ {9 XC.Content-Type6 `* _( z6 y0 k1 T- I& p* ~
D.Content-Transfer-Encoding
/ c8 i: V) s; E2 c# f  DE.Content-ID
' N$ P2 w& _" }+ G' [+ Q/ x; g+ {5 N9 O9 k, _' i; I
8 a  T: x! }7 F
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?# x  v3 @- J$ c$ I
- A4 x* K$ Q* L0 y/ ^6 V( b. y
A.multipart/mixed
" S2 m2 B2 e% G; q6 s4 dB.multipart/alternative
/ [: a! x# Z* R6 IC.multipart/default
4 I- L( E. ?! K8 BD.multipart/related
2 M; d$ S1 F0 l2 u* d9 QE.不可能用content-type实现
! J7 v7 B1 k/ B% \
! ?" q3 U  u+ [' h! ?% Z# q3 J' S6 b' M. S4 p; i5 p
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
7 t4 @2 P0 H+ {, k( g" r+ }  m6 [* _4 N
A.安装sendmail服务器) o: |0 g/ _3 O1 c
B.安装Microsoft Exchange2 D& I3 t, P6 g; p6 b
C.在你的电脑上安装任何一种邮件服务器0 s  P6 F' S- a4 y! |( {
D.改变php.ini的设置1 T2 Z3 C$ V: K) Q9 L
E.写一个连接公共电子邮件服务器的脚本
' E% i) Y' k. F6 @9 d3 f- P. S! o* M0 l4 j# [
* J6 B- [0 X# g! ]# z+ I
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)$ P" ]4 X) C  Z/ L% H
+ _9 f1 |3 }. k6 r+ B+ W
A.使用GET方式传值
/ y6 }8 K4 {# x, ~/ p, z7 ^1 h" ~" iB.用htmlentities()处理电子邮件地址3 ^. w+ X! w) \) l
C.使用POST方式传值
0 y" b/ R( n, wD.用htmlentities()处理邮件正文
! Q3 M. s# v7 N) w; s  ^E.确保填写邮件地址的文本域不能有换行符
! ]- {. u) `- |) u. t
; @; w, b" e9 @8 h3 I' q" n$ C3 w, U% p3 e2 w2 D8 X; T
13.如何将一个数组作为附件发送,并要能在接收后重新组合?0 _) h, b* k* S" A7 m
! X5 ^# K, [- g7 o& p6 L, k, e: o
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
8 ^# S  q9 e6 u7 TB.把它存在文件中,并用base64_encode()进行编码
" a3 Q( ]/ C% {. L2 QC.用serialize()把它转换成数组3 \, g8 J2 H; F: H8 S
D.用serialize()把它转换成数组,再用base64_encode()进行编码
4 A" ?  s$ j. z9 FE.把它存在文件中,再用convert_uuencode()进行编码
0 _( X& M) F6 o: v8 a7 P- h1 M+ x5 F+ x0 F  ~" |5 X9 |

( z- f0 V/ r* I& Y6 ?) v# q14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?( B" ]- q$ L. W& q& w6 d

& T. n! F( g: C/ ?; o- `7 N+ U& MA.堆一个检测脚本出来
$ v& `/ L8 G* Y3 _) uB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型5 x6 i- Z' d- b* q/ h7 Y
C.写一个识别文件MIME类型与内容是否相符的函数0 l+ u  j, ?( b1 }
D.使用mime_content_type函数7 G+ t1 T" T/ g- k$ f$ v
E.把文件上传到外部服务器上
+ g* W2 R; k* O# P; ^3 D( C: l8 r, ^

' `6 N% x1 u. u# y8 i15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
+ T# n: o3 [+ ^% t
! ]- @! W. ?# i3 }4 S& R! kA.添加一个From头信息' P0 `  \1 {" |( f4 y2 l# v3 Y" ~
B.使用-f参数0 \4 [/ r. n& w# \
C.添加一个Reply-to的头信息
/ m+ _" ], a, A) UD.确保运行Apache的用户有修改sendmail设置的权利' G/ ~2 k0 V% k* D, y
E.确保Apache在root用户下运行
( {7 c* B) x& [) S5 ]答案速查
1 p- N! C: Z' B, ~. y, W/ \# g7 a# k1 q1:D
$ i6 g# T  e8 u" f1 @* B( O2:AD
3 Y" s) H" b2 P) u6 _, P3:E
5 V: Y. {9 G3 ~6 y' F9 t4:Content-Type:MIME0 x9 I5 ^: y- r- a; v/ z
5:BC5 e; j( i5 M9 r! {7 N) G' F  E
6:A
. `; O- d2 X% V$ K7 ~; O7:C
- A! J* U; I- ~' d! g! u1 l8:BCE
4 s+ z- o. Y- U% b9:ACD. K% ^( W) Z; k; Y
10:B
8 \8 d& j- u, m8 R+ `11:D
  c% B: d0 R% c7 y/ E  a12:CE* U0 j& G6 u  z
13:D
9 H" v: k; c0 z& W% p% n" }* K14:D
: Q  q" ^2 W) A$ x15:ABD
: _9 T7 k. `. A
* ~% {1 @( L# Z7 G7 R% l' n/ T1 Q$ a8 m2 X
, \, Q) D0 j8 y; l+ ?6 h
答案详解
, _9 ^8 x! Q( r
; l) s6 t' F) s# ?/ Q- U1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
3 y: O6 X3 B/ Y1 J/ y  B' Y+ e+ K6 U- `; n/ [
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
  I; n/ U  f& ^( {. c3 H) \1 _- p9 D: O7 Q+ z
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
+ F: M/ N% d& ~
0 C2 h$ t0 g' E* r: x7 c4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。) ]6 R  z# W1 H6 Z
# o- m/ c5 t& K/ ?+ f
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
5 P& k  p/ Z9 ?+ _% y) j; ~6 [) @9 f$ O; T9 z
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
, k% N* F. Z5 W7 r9 d7 D$ U8 o/ p! @( x; f3 J
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
" I8 ~% I* s4 G, \, h! X# P- J: @* \9 I6 ~
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
0 R; X/ G  S2 |' ~+ L9 g  r+ g3 z+ w; Z/ j  ^$ I4 L; e* A
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。; r% i( N9 v" W& s8 V
9 Y0 y7 G3 q9 u, @5 ?, G0 T. j4 s
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。8 r$ Y8 Y4 s+ x

( R5 p) g9 k# O- W- }7 w: m11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
2 ?( f0 ?7 ?" O# I' V7 _3 W7 `( W% d- M
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
3 U3 c# T. Z2 }$ U( n% H
2 ^1 k, `& _' L2 z" D13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。* J4 e, K3 S/ X" Z  R

! C/ r) u. ?9 G0 Y3 m: i0 _. i# K/ Q14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。2 K0 ^  }  a" Z6 ]2 w- A7 I
+ W, k* Y( H# F
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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