|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。- f& O% m j& p' `* A% M' B: _
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。2 P2 N* ]. \) O. Y1 O7 e3 ]
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。& J- Z. i& O, `$ M* ~" y4 N. ^
) z; D& S, j- X8 u" V
# Y6 n4 B$ S$ g, a. y; Y& ]问题
3 u+ G5 C3 J2 O& h7 A) V7 K$ o6 ?# V1 T5 X
1.以下哪个不是合法的电子邮件地址?2 e8 \# H- j0 a- q& m
# X! j+ z" N& V3 w" E
A.john@89w.org! K4 y4 R1 z5 k \4 ]4 M
B."John Coggeshall" <someone@89w.org>
( ~' r& d, ]$ T0 o5 `, g' s; j& m/ ?C.joe @ 89w.org
' e5 J9 r, G% j9 PD.jean-cóggeshall@89w.org
8 Z) p/ _# a7 r5 l9 }E.john+ a# Q2 O: E. { G
( v0 H9 x" y, d) T" ?
?/ ]7 ~$ q& f6 {- `2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
' l" j8 |* v! x* h
' o( A: F8 X5 fA.Windows/Novell不需要第三方软件的支持就能实现该功能
) g0 _4 |" T* o2 ?, Y6 WB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
& O8 ^1 k- P5 ?# vC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送/ b4 G r) ]$ ]3 h7 p
D.有可能完全相同,这取决于sendmail_path的配置3 a' Y9 m/ q* x8 x8 B
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
. \/ w' y, }( p1 T& b. L7 d
8 _ Q6 ~& w9 B* X% g' }! z+ y l3 \+ t/ k, d2 `# p
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
3 E" Z' I+ B, u$ q7 {( T$ h8 O3 ^9 ]* R6 W4 |* h& v$ d: p' z$ h
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数5 @2 h* y4 b/ I
B.用PHP代码,通过SMTP直接与MTA连接。3 X( d6 }3 j# L5 E6 [7 G. r
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。4 [6 q# T' t) }( q8 N
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。) x2 [5 Z7 A, j/ m( }) B! \' R' Q7 T
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
' t$ D$ W+ ], E# h+ X" Y, W
* D. p$ R4 p( W; b: o, e, ]0 N; m1 z7 E- i6 Q9 I
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
* l! `1 o. V* q9 u
8 f" a; b$ ~) _( V+ o答案:____________
1 h' F, u* w) V0 x2 @- @9 l- T, [3 Y( S$ g) N4 B
/ B% k3 p' B9 k, }
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
9 Q3 V! h0 `$ L* E. C
' O+ [1 W8 p7 C8 o" [( C: G" k1 C( ]A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
# \% [- u$ @7 r9 j u' n1 W+ Q, pB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
- p2 E2 Z/ H9 y- H6 x [; o- W+ YC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
- ~, }+ _% W2 @# XD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
, B; ^+ Y: k" ^E.只有一个答案正确
8 M4 L+ a1 I8 w, b, l0 M6 v1 Q! J/ W( F" |
) i8 H) [5 W1 Z4 {8 O a6 |3 h6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?$ j: e, O* ]& r3 \+ j( c" d
1 I* m& v4 ]( Y8 j- a, J$ N$ n/ jA.从UNIX或Windows/Novell发送邮件时都会用到
7 ^: {. y$ ~& B6 lB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
3 h) |8 C" o8 y: S+ Z; }3 |C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
; A6 n+ s# G# \$ ~9 Y# m; ?D.PHP里用不到这个参数" o4 b* {8 }$ G, z' X3 U
7 u: u1 L4 q4 y' a3 S4 L2 ~# z2 }
5 P% o. j2 }5 ?+ P7 j, q: M# B7 i7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
* q; X! I. F% ^8 h$ m( h+ e0 m( e6 F! s, K5 t
A.只有在发送非普通文本(ASCII)数据时
% V7 O1 Y: P% l) N. OB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
. ]$ c5 J2 f/ L2 @6 oC.任何时候都可以用它来指出MIME的编码类型3 j2 Q4 y+ Z1 s) N
D.只能用来指定特殊的编码格式(例如base64)7 S9 H) y$ E% v& V" l+ n
E.以上都不对
; n" G+ Z4 r" o0 f* f$ G* V
/ [! L5 S& N+ y1 C7 a1 o8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
( ^1 I5 u" f* u/ X
" d- Z5 D- `; pA.分隔符至少要8个字符
F% J8 z5 _/ t e( E- [B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
! I3 W3 W4 C, i/ J8 `* E. V/ ^2 P, `C.分隔符在MIME邮件中必须是独一无二的9 ^ x' {9 Q; s4 I) P% A z
D.分隔符不能嵌套的其他分隔符中! y4 \8 o/ L- x/ k: l( s
E.用什么做分隔符都无所谓
& x, J/ f7 B, I6 `5 L' r' U6 ?/ C# y* V0 j; p% u$ _( P
+ E8 R1 w# ~! c/ y5 D0 A: d
9.考虑如下E-Mail:
, g! b/ H" A6 O* S) v S7 J$ i* j3 x' u, ~& ]6 M/ ?
From: John Coggeshall <john@php.net>' T7 [# g. {2 R; Z% M
To: Joe User <joe@example.comt>
' @' O. i+ y2 N. wSubject: Hello from John!& L& K# x8 A; p& W' t @( l
Date: Wed, 20 Dec 2004 20:18:47 -0400
- F2 B) y' H, v0 g1 I; |, eMessage-ID: <1234@local.machine.example>
. ?! F' T" H9 {9 sHello, How are you?: N( c+ J# a4 I0 S' U1 I
0 i6 ~% v9 `3 q3 p9 J7 A在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)2 p0 V) ]# {1 |6 N$ B) O
) s1 G. t0 C- c6 o
A.MIME-Version
8 X) q, v/ q# }+ ?2 o4 A7 _B.Content-Disposition
; \1 b. Z% v" c5 D! [: t; ?C.Content-Type
" |3 l$ b T9 F1 d: {/ Y9 T! {D.Content-Transfer-Encoding
2 g- C# G. D6 n+ J* g( gE.Content-ID6 R6 v# t: S. v4 j9 i
7 D; f% ~+ g% W0 r9 S9 p; L! H9 e3 }( e) m, P
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
5 q( n4 Z" O* S% G" o) V8 G ?% N" B/ Q9 K/ S2 \' X# f2 F
A.multipart/mixed( r6 x/ F2 f: c2 ?; H. Q
B.multipart/alternative" x- L6 G2 q. b2 v2 R+ f* x
C.multipart/default
& ?: f" M- ] H$ i" C& cD.multipart/related4 Q8 [+ W5 B2 N4 X' _( _
E.不可能用content-type实现9 l# z% ~* ?8 M2 d5 ?' g* b4 w' k
9 h. j* W- b% ~9 M" ~. e! O
L4 ^7 J4 _0 X- N11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
/ B; Q; i% M5 _8 [" D# @+ q% b2 J& L0 b. n M$ l7 ^9 i
A.安装sendmail服务器: Q2 F+ Q- }! r8 E
B.安装Microsoft Exchange& e; B/ Q3 [) [# }2 Q
C.在你的电脑上安装任何一种邮件服务器
$ t- q1 F6 U6 z9 M! P% WD.改变php.ini的设置" X5 w5 t3 t, w, J' f# b
E.写一个连接公共电子邮件服务器的脚本
4 H5 a' {1 v N$ W% ^" l! j) h3 h2 c- t; C, Z9 M
8 ]1 @* I4 o& s8 u
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
U1 d) W( r; n
! H& E. U9 K x z# mA.使用GET方式传值
9 c9 c- W1 ]' K; [$ o- `: |' p# wB.用htmlentities()处理电子邮件地址0 e7 Z6 m# b6 i" | x
C.使用POST方式传值: @6 _# }" B% Q) c/ @
D.用htmlentities()处理邮件正文
8 z# I+ A' j2 i3 E$ H1 {; \E.确保填写邮件地址的文本域不能有换行符" Z8 G- S- J S, J# s% ]
" _. g; [. B5 l. ^. g5 k
* u( `' |) I) M4 n& _/ v* G13.如何将一个数组作为附件发送,并要能在接收后重新组合?
9 B" E& x1 I1 L: E: B/ f) i( c
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
1 P0 N" v# J* n6 j' X4 P0 l1 F) \ J" H; zB.把它存在文件中,并用base64_encode()进行编码7 ~- P( M _. P( T1 M, i" g
C.用serialize()把它转换成数组- @8 y2 K1 v& {6 S, G+ j: a
D.用serialize()把它转换成数组,再用base64_encode()进行编码) v3 P5 S& v& H# ~" h
E.把它存在文件中,再用convert_uuencode()进行编码4 Y# Z2 ~; P/ E# ], b. k X
+ A/ M, O6 V/ J$ v. y1 P' N
6 B* c G- x* V14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
+ P7 T9 ~4 o; V+ S& M- e g- B5 p9 t" _- U. w, z
A.堆一个检测脚本出来- o: V2 f( |& p- t) W% @$ }( b
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型2 d. D- O$ ]4 H4 y( L
C.写一个识别文件MIME类型与内容是否相符的函数
# d2 y! ^" o0 H* \: ~/ A4 uD.使用mime_content_type函数
, ~6 ~# [# ]/ ME.把文件上传到外部服务器上
% p6 X5 E2 A$ ], g% i! z$ L4 ?4 s4 S E- E K* y' S e: M
4 F" @1 r5 x2 }8 m- m6 J* d
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
6 R* p% c: X ], o3 }' a1 U9 G( ~+ |3 ]/ `6 n
A.添加一个From头信息
* g( K: j C& B( }B.使用-f参数
7 {3 R+ l3 _1 q( o4 gC.添加一个Reply-to的头信息3 H: }; @, v5 V0 R; X+ ~& M
D.确保运行Apache的用户有修改sendmail设置的权利# t9 ~( [; o' u2 m
E.确保Apache在root用户下运行
7 y% o/ h4 C% u {! |答案速查5 K5 m) B4 e/ T& N6 U/ t# M1 R: q: \
1:D
! l0 }+ w# x2 H% n7 a; i2:AD
4 p6 H( }; i, y9 x# @/ o( _; r2 ^3:E
# ?$ p4 S: X1 H6 g0 G4:Content-Type:MIME9 `( b7 n7 m) b, C9 F* s
5:BC
( X* T3 n' t1 z& t {: A& k! a6:A: K6 ~( g; |( Q& S
7:C% m8 G, B$ ? \" U) Q% z1 I, ] R
8:BCE
/ Q. E5 D9 ^8 x1 B9:ACD
9 K+ |( b0 k; Q, d8 r' i) G10:B5 Q! J _6 f7 L3 D2 n
11:D8 M/ [0 J! G1 D" b5 Q0 M
12:CE& v, G: Y( q) @& h3 e
13:D: U! V7 R3 ~& X
14:D# `" J: L, n$ s. l2 {& S
15:ABD, R. q4 A& M+ }' o
7 |- F9 A& u; \2 \9 I' j3 v3 h: M% B* E
& o. s* u) t8 ^( m* z: }5 y
答案详解
! a: M7 u8 ]6 j. r8 C3 F; c j3 F" b, y$ B
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
3 c% Q/ \3 A, B5 S7 p6 U6 s. c2 o& p8 ~
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。/ w2 P9 X: h4 c! h8 a) y
8 P8 y$ O% C" N8 J) e
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
; A, y' A4 P8 f0 }1 u" X4 P" a" n d
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。3 k R$ k' H1 i4 ^' t, ^2 Y+ E
; X. O& n1 u3 _9 H/ \
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
* o$ d/ t7 y+ H& Z% A1 }2 A! E; a0 ]. a5 _
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
6 \1 C) u8 \3 D3 J) |1 e [! A+ h8 y# |6 V
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。0 Z# l+ `1 _" Z) n
: r$ L8 U0 d) f3 S/ k8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。% c5 E) F- n/ I7 ?, H9 @
; O6 c/ _- L, _9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
4 Y i" J9 t C! h, ^ q# q9 c" r* Z% v& m" D$ W( a& U- i7 g- _
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。& j$ r& r' }: V/ j2 ?
7 D V; k ~* u$ X8 R4 t) m11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
* a$ Q* M6 c n5 Y) k& a1 ?' \
& ]6 S- c5 k* ^1 |. P9 T) @' {" u12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。) m4 O- N1 H6 f. s; v
: {% i" G& n4 O, p# N, Q2 q2 B13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
! n1 t' i7 i: \. E; F# N" c6 H e. R! Y2 s$ ]& r
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
$ v4 H6 O: p( C( `
6 w+ D) D4 F" J15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|