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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
6 j; G! a) T# @5 o& v还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
- n4 q2 y5 c& v6 N2 p# m! [用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
9 D5 V& u% R0 \' x2 b6 g& ^' M" D' }
$ T- [9 _0 p0 ]1 C! G" s0 {% r2 [; G0 W. q! t: N- j$ q
问题& O7 G, B& k$ d
; e& A# V$ h. ~$ Q/ g3 ^; i
1.以下哪个不是合法的电子邮件地址?
# k! Z$ [4 k0 _2 |9 l# R6 @8 T8 j' u- N
A.john@89w.org2 N# @; {0 p. C- J9 H, V5 H' o
B."John Coggeshall" <someone@89w.org>
7 }$ K" ~; J& ?. }  RC.joe @ 89w.org
- t$ s+ J: [0 S* e( p' O. x- WD.jean-cóggeshall@89w.org
  ~' C+ Q& U  a9 JE.john) N3 H7 W" C6 y; \- w) A  b

/ p& L% F/ }& c: e1 d( Y  ~4 o' o
( m  \8 L) t; k$ H2 a6 i' k2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)' p0 {% l2 M& R9 d! W
0 |. I, H+ w' v4 o
A.Windows/Novell不需要第三方软件的支持就能实现该功能. v/ _: M/ p2 |: E0 V9 U% U
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
5 B# S5 r. ~# g$ q0 |C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
, D- v. M0 Q" X$ l) w" {4 y: JD.有可能完全相同,这取决于sendmail_path的配置2 T0 A3 y! d3 d* F
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口# S7 w7 N( o1 b6 U: H7 \
% g4 @+ Q- h% K6 c0 ~
, _- o' N* V+ T' G( b2 S- b
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?# z5 x" |3 i, C9 i$ o, ?

  F: _$ ~' K9 C! DA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
; A& |# D& a: l, O4 hB.用PHP代码,通过SMTP直接与MTA连接。. o( L8 W1 T8 G  h% H$ v2 @+ a
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
6 N1 c6 k- H2 v; _3 `" T2 V+ z3 {D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
% u; d! x# ~2 k. x5 s6 |E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾& _/ V3 S8 |# {/ Y1 X

2 \2 A1 u" M; p
3 H" ?9 n% o) P6 D/ T# W7 U1 h: W6 ]4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
) I2 w( J; f  n& K4 {4 x& {5 _) R" B# `' G. ~/ V! B8 S4 y
答案:____________. T" L5 }; L. c5 I3 Z6 G7 f
3 F  Z) l  d" W8 `

& a" D" P# }' }1 ~, @6 ~4 W, v% y8 }5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
4 C: D9 ?' F! ]/ U( g& }1 p  ?4 O3 f4 u7 N, V% U$ q+ K9 Q- [, T. D4 I4 p
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
9 i$ t% B' G1 v1 }) \2 x! bB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
/ ^; m+ K2 T" `C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID4 g% v; W+ W; w% @/ q) t
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
8 i. `5 w( B  }. HE.只有一个答案正确
; y, `8 g8 O$ \4 I4 m3 s2 d" L
) ]3 p1 W! Q! p5 a" G. Q
2 z0 W2 f7 `* s4 m: R. V6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
. p9 L" Q3 i; O& i/ v# M! s; e6 p5 u' ~2 ^
A.从UNIX或Windows/Novell发送邮件时都会用到  s8 b  r- ?7 o) U" j$ e
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时* R7 }# A  M' G, x
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
7 d8 o- F% B& p5 b! c2 }D.PHP里用不到这个参数) J$ d# J9 [2 c1 g) y# \

5 Q0 V4 ?# g! w$ O/ `7 Y* F  e/ a! |7 l- z% q6 M& R4 ]
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?) P& {( h; u9 g; J7 Z
4 j2 A  i- w# ?& ~, }0 D1 o3 P8 S8 \
A.只有在发送非普通文本(ASCII)数据时1 l& S5 q! _0 ?! L( Y
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
( F0 [& e, A+ wC.任何时候都可以用它来指出MIME的编码类型. K: `: X$ H, b
D.只能用来指定特殊的编码格式(例如base64)
6 h2 f9 U+ u. I' G: _+ FE.以上都不对
& z" p& U9 E, n; S+ t/ a0 R
' Y0 p3 r  M- I+ z8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)3 @! u& P6 w! v/ T4 \, F

: L( s. E9 Y! o( QA.分隔符至少要8个字符- v# ]$ \/ q2 v0 z6 D1 N
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
- {( W" F# K6 p9 lC.分隔符在MIME邮件中必须是独一无二的( R3 F6 a$ N- t8 [; t9 d
D.分隔符不能嵌套的其他分隔符中2 u5 e, {' O/ y  j' G/ l& M
E.用什么做分隔符都无所谓
/ ]' A' \# \$ I& {
8 U8 I8 {/ Q/ K& |% s' q
  S3 F( L) p/ G& d/ q( L9.考虑如下E-Mail:
" v2 \7 |- b& j3 F' Z3 @0 S6 g* U" O! F; ]/ l8 O4 p- k9 X& q
From: John Coggeshall <john@php.net>" K$ p/ `& M& G" p- a7 w' Q
To: Joe User <joe@example.comt>
$ d% ]6 n% m3 V# s) {! ESubject: Hello from John!1 ^5 c( p4 E5 p
Date: Wed, 20 Dec 2004 20:18:47 -0400* P" W5 W7 R! ]. p" ~. a- [
Message-ID: <1234@local.machine.example>" l* ]9 q6 L2 @: V/ H5 D
Hello, How are you?
) N7 T" H: Z6 t" D8 l. N6 D/ d
  a( M1 ?% b( Q0 N在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
- d" k8 r" w9 d5 y/ _* u* b/ K
$ w7 T7 O8 |' D3 l, z7 z" QA.MIME-Version
' e1 P- w! F0 b8 ]B.Content-Disposition" F$ O3 M' _% \9 |6 O0 T/ [& t
C.Content-Type1 E8 Y# D6 k4 T$ `! f7 v0 o
D.Content-Transfer-Encoding( U+ u, J  J5 B& _. @
E.Content-ID7 d# p' k+ S  j6 S$ t
/ Y; B/ [2 S. i& b0 A: F: t& z

4 d" R: P* x. a$ i4 t7 Z# e10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?& S$ p3 y, s6 _+ [. s

. x# z. C9 X& q1 W3 dA.multipart/mixed0 i* c8 ], O) p. O6 [4 o
B.multipart/alternative
! ?5 d" A- l2 ~& i* J7 hC.multipart/default
( u( j3 G9 E* o; YD.multipart/related3 `" S/ ]/ ?7 @7 n; @
E.不可能用content-type实现! T6 i  x/ l0 E9 P5 p* x/ y

8 q5 J6 t  l, V: ]5 p$ K2 {  W+ e/ s/ {6 b+ a" v( [8 L
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?* G. N0 K8 y2 l! S
9 r, A3 V2 P; g( Z
A.安装sendmail服务器
5 A6 t/ M6 X3 Z# X# N7 d. DB.安装Microsoft Exchange$ O6 f- W: I0 n: Q) y. I  i* N
C.在你的电脑上安装任何一种邮件服务器$ V& K5 j: ?9 N0 O
D.改变php.ini的设置% Q: o: z$ Q- N% Y
E.写一个连接公共电子邮件服务器的脚本2 a& a2 I( M' `! V

; s2 {, @: x0 A) O, H9 N9 p' Z! m
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)3 D4 j8 e" o- g6 B* ^
3 ^9 G# }. q3 u
A.使用GET方式传值- ]0 @: O4 _2 {" J8 T9 b
B.用htmlentities()处理电子邮件地址
% ~( P7 k# }" K; DC.使用POST方式传值; B5 \+ j  \( [5 x' W- l
D.用htmlentities()处理邮件正文! B" h! ^& R! e1 W, u
E.确保填写邮件地址的文本域不能有换行符1 z# {: S2 @) f1 f7 ^5 h$ y
+ {% A" q# ?7 c5 s, Y. N

( i8 I0 H. n' i; L6 |8 X, S! C13.如何将一个数组作为附件发送,并要能在接收后重新组合?
8 Q/ y6 ?: j1 ~6 h6 [
, j9 J3 M  Z. G* @A.用serialize()把它转换成字符串,再用htmlentities()处理一下
) w+ a2 ^' O7 F  T' A- uB.把它存在文件中,并用base64_encode()进行编码
" ?2 l) j3 E/ l  [+ q5 RC.用serialize()把它转换成数组& N& i2 l7 H" g3 g8 d
D.用serialize()把它转换成数组,再用base64_encode()进行编码
+ r& R7 J5 S9 N+ G+ t5 i% k: k0 dE.把它存在文件中,再用convert_uuencode()进行编码5 P; s8 \" c$ m8 \6 U

  Q: Y$ m% Y6 i% ^; s6 m
/ n$ D# L+ P% C; A' c14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
5 J; m& \. G, i5 |
) J% }' y- [7 G* h4 C% U. A' [; y' ^A.堆一个检测脚本出来
8 i/ n+ G. U8 @) h) I. w, J) nB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型) ^# l' ]$ \$ _* G
C.写一个识别文件MIME类型与内容是否相符的函数
1 L. D8 `+ d8 Y( E) c/ n2 hD.使用mime_content_type函数
; y/ R% ^) X' I, o5 M+ q3 VE.把文件上传到外部服务器上
8 @0 p- e" z7 W4 d6 d- i' X7 s; o8 f

/ V+ E% L5 K( [3 D, P% J, t15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)4 Y/ [: C; b6 _5 R

; l1 Z9 y$ b2 T7 H4 `0 gA.添加一个From头信息# R8 z6 J+ q: d% m6 V6 u
B.使用-f参数
# j) C$ v0 K3 v; M6 ~6 nC.添加一个Reply-to的头信息
/ H0 m' P& w5 p# q/ x0 N5 }4 _" OD.确保运行Apache的用户有修改sendmail设置的权利. d, r1 ]. c0 q1 O
E.确保Apache在root用户下运行
: L& z( B$ [1 v* R. K: d0 h答案速查5 @3 T5 ?; j( v" c3 G
1:D& \6 Y! v9 ]6 J  D
2:AD
* g0 p3 P" M# V; {9 O, b; ?3:E
- y; ^4 o* b  }) k0 [4:Content-Type:MIME
: ]) S# w4 u" c0 g. M9 h1 ?  a& M5:BC4 z" S6 H, g; T! K
6:A
* O5 P7 |) h+ w) J0 z7:C
+ W$ ]% u6 M6 ~  _* b; e7 S7 L8:BCE
$ Y2 e& F& s' O5 p% D* ]0 n, j/ Q9:ACD4 Z; w- F) L: y8 m6 ]/ B
10:B
, C5 n2 R" i1 g7 T11:D
. U: w1 e+ Q' B% w+ o3 s" p. Z* M1 Q12:CE
' N  Y3 V. t1 Y8 n9 I13:D
  s0 L7 P' q3 l$ p14:D
  i# J0 y, g% ]15:ABD
& h$ L9 l- v  W2 u: }$ \& v6 t" ?9 u/ i4 I. o: |4 o

3 o. A: T3 a0 Z
, C, S+ H7 M: E$ X9 x( [, R答案详解/ M& r3 g6 v6 P& O4 P8 S" b  x

0 B* U2 a) P9 |1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。( h! O. O9 M$ g$ A, k
; e( r, M. E9 ], _- m4 k
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
( a/ M4 [" z; n5 ^0 r
) ?, p5 m# ]& B6 p/ G3 }7 m3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
" B& P0 c3 x6 |0 ?" ]4 Y$ I5 b; @7 ]: E. v
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。  }0 |" Q$ U* D4 s( |1 G: D
  n& `/ W+ P0 X/ w4 g" R
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
4 v8 i. p- |1 Z' V3 s3 f& n* V' F8 o
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。6 a* ]4 s) S0 ]! T0 A- L

9 }- u* }6 X2 x$ T5 \! @4 ]! l8 _7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
' g6 \$ f  C) k' q& {" q
# v9 B, W5 s* w1 g$ d8 t1 @, U8 i8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
( _: o/ ?; c2 @: G
8 [" s2 K- H1 p, H+ M: d- }. Z- Q9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。1 z1 c# W# R& }; ~- w' @! r

' w9 B3 Q2 P( V, `% I10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
& c6 x% ~# S* w/ a
# j& A5 p1 G9 h# |$ s8 p11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
0 x! g, J% n& q! A
  q3 a% W. Y, {" b" ^12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
! G# [: ~- L5 D
8 Z5 D6 _6 E) e13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。/ R. T* F, E0 @+ L3 B' H

! Y# H) A: o9 w  m( M14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。2 r; ]0 B' J( q9 v) V
4 k/ j& b' w. d6 Q- s$ c) M
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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