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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。9 V; r0 @0 D, e3 g6 E/ B2 q
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
, e0 O, b! W; [$ _用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
4 T9 C% `" K3 K8 F( I7 }* a4 l
* P+ a8 P" ]/ L* e) G. ~' c3 F" {0 }
问题+ ]* \7 }- }, b6 M
) Z4 P' E1 |7 p8 K  }
1.以下哪个不是合法的电子邮件地址?; n+ r- C/ C' K( p  q; m

* R" ?& l; h$ g$ _; k5 n. {3 MA.john@89w.org
8 k( w/ ?! t/ `+ e' f, xB."John Coggeshall" <someone@89w.org>
/ |% i& X: o7 F* k3 M3 o  y, IC.joe @ 89w.org+ S# ]) Y: _6 d( E
D.jean-cóggeshall@89w.org" P; x. V' [/ v, J/ S
E.john& N3 G4 V! l0 B5 i7 I
+ v8 s) y: z5 S; N( _( s1 h/ @

  }7 |- Q5 H% m( L2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)# f. H1 T2 v. M% A, M9 O  B
6 m/ @  Y# s" Z; H( S+ d# Z3 x) O
A.Windows/Novell不需要第三方软件的支持就能实现该功能; k* N, p! w( o9 @1 f- F
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
" g& O- ^/ k' S/ h' {C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送- r2 j5 h  l6 Q
D.有可能完全相同,这取决于sendmail_path的配置# i8 U8 g/ U, d# |5 X6 y. `
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口; z, R4 F0 E+ O& H! W  w7 V

1 A# Z5 G! a  V+ D* B) X
/ {  e4 i4 F; ]+ _+ o! \3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
8 q0 T7 b' }; o+ e; [; p! G+ h7 }: M
+ b- T" c2 F- r7 v* S( z: }9 k1 t+ GA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数- `* ~4 G/ q8 z1 i( M* T
B.用PHP代码,通过SMTP直接与MTA连接。
3 g, @' m  J$ A9 C: F( J2 w* uC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
; Q& n4 {! l% K8 \; `0 `/ lD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。( W* s8 e' k2 ~) V) ?, g' {5 T
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
4 v  ^! ~  u. h" `1 ]4 A% G7 E, p
7 U' u* I5 n; B% K( @$ p" d  s% n# L  W! z
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
! s; l/ C2 P' Y9 p: L2 u8 l4 T" S8 ]# b% J  ^& y
答案:____________
. R/ U# o# ]4 C- U7 A- [3 n& k- m& S- ^
3 H1 ?6 v1 @! r
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)4 T6 L) u$ I" v! p/ g$ `4 S1 }

- w- H+ A* r% m6 s, d( Z6 J3 u- ~A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示. V& @# I$ X; N& v( {4 E2 `. Y
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片8 B: |7 ]3 C) {# m, `
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID! {5 Q4 Q0 i; R! [/ f- U
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
' `: z8 b4 `5 q" R! t& s* UE.只有一个答案正确& I4 k; o7 ?. \* q

/ Y9 j8 a; P. M6 Z3 L8 h2 M  m( F3 q4 f5 o1 v8 e/ A! q
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?( {4 z& y) l$ e3 Z

5 C/ K) g5 [5 MA.从UNIX或Windows/Novell发送邮件时都会用到
$ F. L, F1 e/ X) xB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
* B1 r0 [! J" C% Q( {6 c: D2 JC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时* X- U* |+ A) v2 B' V
D.PHP里用不到这个参数# t- E, T" _. ^( m5 ~
! a, n7 d( Z3 X; R
, }0 t! o$ s) d5 {
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?2 Z* W% q; ?6 U

; r1 Z$ K% P2 k9 ?6 o* bA.只有在发送非普通文本(ASCII)数据时! f* g) D& Z1 i7 u$ l
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
) r, D4 t* P3 B& X. O% @; F# z& `- RC.任何时候都可以用它来指出MIME的编码类型% v; m  F3 l. L9 o( ?
D.只能用来指定特殊的编码格式(例如base64)
. t" e6 d9 a, O- K4 n! mE.以上都不对* W5 o1 y4 B+ ]0 k4 ?& y
) P/ t0 _7 H  @0 j3 O  a' k
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)) T* d4 y6 I1 P) m; c! y# T8 X
' G6 t! x4 k8 X/ O; g7 J+ J
A.分隔符至少要8个字符
& T! y4 v. R& a# o9 J1 U" KB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
7 w( ?. f, |0 ^C.分隔符在MIME邮件中必须是独一无二的
2 f; u7 i' D! OD.分隔符不能嵌套的其他分隔符中# D/ W9 m2 ~/ O9 I% Q! [
E.用什么做分隔符都无所谓; O( J3 D& ?; d; H& x$ L
: [8 x2 ?# O4 |& o
: `+ A5 H! Z) t  h' H0 v( C
9.考虑如下E-Mail:
' ~+ K. n& R+ @3 F1 q* [6 z5 ?7 a# R/ A! P/ |7 e9 w
From: John Coggeshall <john@php.net>
2 U" W4 @1 ]4 H- RTo: Joe User <joe@example.comt>
1 K: Q) H3 }8 a, e0 `$ H; HSubject: Hello from John!
. f* J9 S4 j, q) @Date: Wed, 20 Dec 2004 20:18:47 -0400
. G) A! [1 D3 v4 d- oMessage-ID: <1234@local.machine.example>$ m3 E) z( R+ \4 p2 J
Hello, How are you?- w8 |. ~8 b# a6 i0 R7 {" u2 [+ D

) B( l; Y0 ^& u6 h; A) `" B9 F在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
$ h% g0 ~6 r# g1 h
1 `" B5 V" z8 L& r& YA.MIME-Version/ q3 P+ K+ ~5 x9 h5 s
B.Content-Disposition' O/ p! N2 n% I& p3 |
C.Content-Type; S6 f5 a8 D$ A) }/ M, S
D.Content-Transfer-Encoding
* {& [* x- p2 `0 `: j: PE.Content-ID
% v5 Q0 _. d2 x! g3 U) P" x7 O/ O9 S9 c2 M

2 c$ @8 x- r' w10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
3 Y& t: x6 w% U  u0 O3 C" w, P, E9 f9 r* a7 b+ c* ~2 }
A.multipart/mixed
; @3 ^! e7 X) HB.multipart/alternative7 c# v( C9 D& k* s
C.multipart/default, Z0 U- F1 V2 V$ U; z
D.multipart/related& L; a3 m, z5 t; M
E.不可能用content-type实现5 l% R7 o/ P* @) m' t: \
4 G) e2 M6 I. S9 k
( H1 i  J. J. U, b  Z$ C6 K
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?9 k) ^2 o" n) p4 z- `

8 z5 ?7 o5 o& a9 y+ tA.安装sendmail服务器! W+ ^& _9 A1 C: `2 B4 Y2 f
B.安装Microsoft Exchange
! K& w, [" r2 S$ @C.在你的电脑上安装任何一种邮件服务器
! e: M$ n# r* u$ D# D9 p8 |0 jD.改变php.ini的设置
% v7 y% O$ w2 c  z3 K; q) [E.写一个连接公共电子邮件服务器的脚本
) X5 h4 U, N  j3 L
: `. w9 J' T' d( p5 A! S
; q3 k) u1 U3 L+ D& d12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)8 x6 D# w# n* N/ L* x& y+ [
0 u+ v+ q2 x$ y- E2 M
A.使用GET方式传值
+ ]' C3 B( H' ?+ I" h6 {B.用htmlentities()处理电子邮件地址
: m% d6 S, V+ ^C.使用POST方式传值
% x8 o% _8 @* G' t  ID.用htmlentities()处理邮件正文
% [. n6 k1 C3 h& @9 |; {E.确保填写邮件地址的文本域不能有换行符
  G9 d* E- _/ J) ^4 b4 {
8 ~6 O+ g+ b7 ^. ~9 s
' m& H" F; Q! \5 A: U6 ]13.如何将一个数组作为附件发送,并要能在接收后重新组合?
6 c) `$ t. _* u1 O# H
) ~! F  F5 t7 j9 t- uA.用serialize()把它转换成字符串,再用htmlentities()处理一下) @" H4 Z6 a, c2 }
B.把它存在文件中,并用base64_encode()进行编码
/ }( d4 ?3 D& v- o7 O: t) JC.用serialize()把它转换成数组  @- j7 f6 V  _1 T
D.用serialize()把它转换成数组,再用base64_encode()进行编码( E3 H2 D( ]6 u1 q, {4 p
E.把它存在文件中,再用convert_uuencode()进行编码! l& E( f/ v% c+ k1 b% h
% {* G4 z2 @% S) s
; l$ S$ k2 z  d  `- P
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
; n! P/ J$ s  M9 ?. k
, K  p) A- i6 k  p# xA.堆一个检测脚本出来6 ^- X5 b" R1 f' ?
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
; }5 g8 w: e3 CC.写一个识别文件MIME类型与内容是否相符的函数9 x1 Q' v" i2 h
D.使用mime_content_type函数* ^4 L2 _( R; |
E.把文件上传到外部服务器上
( H1 `/ h0 ~3 S1 k# h
% l. k! m9 b0 p, w# z/ L9 O% g; ], I
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选). T+ \/ c: g: h( h2 _

5 E. T* V% [% |+ }+ YA.添加一个From头信息6 |% d7 i) v$ }* X- k7 J4 }
B.使用-f参数
, o. X  A& ~1 t  B5 a% qC.添加一个Reply-to的头信息+ E8 h, e- B, h% T# N
D.确保运行Apache的用户有修改sendmail设置的权利
% C" q6 ]% f4 w" \" c) [  V' v. ~E.确保Apache在root用户下运行
& v8 A( A* x* q* y! S4 z! t答案速查$ n" @9 O' m. ]/ D' l* e
1:D
9 w3 b, ]- U! S7 `2:AD/ a  R- p. O- q9 W# [9 G
3:E, Z; f1 ?( K* C% w% V
4:Content-Type:MIME
" j; m+ f4 b2 J  i' k5:BC
' ?: l5 n: B- m( }; i' f2 w- c6:A7 P5 U6 b! d( n: k5 ?4 N( j
7:C
6 s- s4 H" u- c' V4 v0 a8:BCE1 _% p! v! i! N8 \7 d$ a
9:ACD
* |  x* H, o: [- t6 D% v10:B
9 o0 Q: i  O, e3 {0 S5 c6 q11:D
, H0 B9 s: y; y# n6 J  f12:CE
6 w* S  ?+ d" S13:D9 W, ~2 a- c" i/ E5 C, i0 M9 S  d& A
14:D
2 @. z1 q5 r) ]- Y  D15:ABD
8 P2 e& A6 |! ~8 s$ A& e% ]1 T1 c8 O4 r$ |* z; {  a# \

8 I9 ]: p* l& F' }2 N. Z" V7 M/ l
$ F( P, w; J9 h答案详解* L, M% B2 G& i( X
4 H; G, f( O, G9 Z
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。  L* p# Y$ X8 u$ O8 a# R7 \
# H, e: S- v: D3 i8 r5 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程序自己来处理。' v# ~5 @' `- _
- k5 O. `% B2 F5 s1 D1 q
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
; a7 {. A/ g: q. X. I  E* N
! H, |" U% e# H. _2 ]4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。3 s. j) Y/ ~! t4 u

/ m3 I: _1 |  l) _: X: z5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 ]8 `  \9 J8 ~/ @4 E+ G4 P4 E. D
9 c  E1 g: i: m4 e4 q6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。. V' R; n/ N2 F- l

1 _- a- h7 z; j; x) f- H9 x& R- D7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。. S# L' ?& P5 T7 s. v+ }* w
! W9 v0 t' l5 J8 P9 k/ o% J
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。! e6 s1 e; |8 \0 Y
+ [8 X1 q, W! }- I- P* J
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
4 z3 r, U% j% W5 D( u
3 l" Q# t/ H5 a! C" e10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
& T- m, U3 H- Z/ S! v$ b/ [
6 G* C* d' I8 d4 }11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
# F8 B5 g* B- V2 B) a; ]" E
- _6 Q: x; k; `* D" _; n12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。; Y% k# `% z$ O0 I! o
4 R/ g* _% \* D( {8 ]0 \
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。( T/ n( C" n: @( F7 {
  l5 V# s0 y+ \, w1 i  }
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
1 h3 |  @7 ^3 B9 M7 n2 R5 M# n$ g; l$ ~/ W6 C! j0 V+ ~) d
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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