  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。3 J4 J$ l+ ] D5 @
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。2 E0 H5 C( H& F% {+ p
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
, N# u" r+ w- M" [' O
3 R( q0 |3 ^" \+ q, Q' X( ?- w- J
! B( w" M9 }& S9 x( b/ f问题
$ C3 ?, U" N9 ~" p; R" i5 W: ^; M; }4 \2 f5 J
1.以下哪个不是合法的电子邮件地址?
8 u# \5 o J9 ^% m1 T! V% Q( F. N
+ ]5 J1 }. \% e( P; b5 N* B) X4 fA.john@89w.org
( o' J8 y, E9 P; E9 M& V* ZB."John Coggeshall" <someone@89w.org>
/ G% b1 R' e7 F4 d6 h. M5 }, q1 lC.joe @ 89w.org
/ Q; E5 x" a( kD.jean-cóggeshall@89w.org/ J( N6 m1 W; x" {
E.john D4 [1 B- F) L% H; F" [
" Z l* a9 l$ ]/ I; S4 B) N
' ]: @6 S6 c" F' V2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
# v* M j+ i/ b# h% |$ r/ ] u. |! |3 ]; T" p A- a
A.Windows/Novell不需要第三方软件的支持就能实现该功能
, N5 |1 Q. ^% j/ R7 |8 B: ~B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。+ F2 C1 N8 |, E& |4 v
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
/ e" d4 {( @' I H" l o UD.有可能完全相同,这取决于sendmail_path的配置
, ~2 K+ Z4 a5 D" {0 ~/ rE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口 c6 ~0 m0 C5 V+ p
4 s! _8 Z& D7 T" Z$ t. B7 {, S
8 J: H$ j' Q/ t1 z& H+ a' o/ X+ o
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
. s7 _" G: ]9 w. @# B6 h8 C3 X. ~; u* H9 f# j0 e! Y- x% r
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
+ ?3 {7 i$ c/ W( L* eB.用PHP代码,通过SMTP直接与MTA连接。8 v6 g+ s6 K+ y) {6 R, M9 g; {/ m$ ^
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。9 x9 t& m p3 _+ C# C5 x# D" ?1 w
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。. \' K% D( Q7 O2 ~% P9 O0 ^+ W$ ?; ]
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾 [, x" @/ @. p+ ^8 f
4 }5 q! S7 _$ E" {/ \/ }
8 l" k7 c1 Y! U* D+ P# u# i4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
! G& K6 {( G: [% o2 q+ i1 h
7 A/ r% J, e$ L; C3 Y答案:____________
4 i x. T9 ?: _% M3 W# b; f5 E# f
! ~$ { B) r0 Z5 B* }" o1 A" I0 c) p
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)7 E; c7 R% S# q0 `( N$ H
8 h$ _; h X8 h- [$ ?
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示: f2 D* n9 v8 n: \( G) j
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片/ H3 b3 a! P9 M, m9 u
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
3 U2 c, U' t I( Q! s" F. yD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
! J" ? N0 T0 a* [: R7 m+ YE.只有一个答案正确7 \2 X. _# h* d# z3 c* T3 K K
! b( z+ G# s$ d6 s$ g% H; h+ S' ?- h
8 b. C5 T- g; P4 q7 p4 r6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?) ~7 t6 Q0 c1 i/ Q S
9 b6 k: U/ c; kA.从UNIX或Windows/Novell发送邮件时都会用到+ V3 |3 X- v! {: E+ S
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
4 t/ [; T* g* Q. r3 zC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时0 i1 i; |1 z7 r. C3 r. u4 {7 K1 l
D.PHP里用不到这个参数
: s: G- E2 ?7 y: Z
5 e+ c: ~3 W' Y4 w* @* x- ?% p, c- \* _+ R
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
+ v3 V; ^( T2 u1 Z8 i o$ w) J) C1 N9 R" a) C' K3 ~+ |
A.只有在发送非普通文本(ASCII)数据时
. K3 @: } z; N% wB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
" P$ R! x7 F! m% H7 F( ?C.任何时候都可以用它来指出MIME的编码类型% n- K- O8 J& Y
D.只能用来指定特殊的编码格式(例如base64)* s1 y0 o' R8 F' Z4 V; S
E.以上都不对2 G4 I- \5 y9 `8 A+ h4 R3 m
! {6 m! r1 O5 h
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
# ]1 P' E! m, l$ C, I- j
/ n, [% |6 U1 WA.分隔符至少要8个字符* X) G+ U3 t: l- I
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--). N( y2 ^! |$ n6 x/ R2 D
C.分隔符在MIME邮件中必须是独一无二的
' o3 m2 k. {) ]' H! I( J6 {1 A |D.分隔符不能嵌套的其他分隔符中
' g/ j- e& U% \) aE.用什么做分隔符都无所谓& ^3 r/ T8 ^+ Y' a5 _% u; o8 |/ F
2 A+ B+ O/ M( j6 X/ J; O* u
: t4 G$ ~3 {3 x, D0 t4 Y
9.考虑如下E-Mail:3 _$ d+ F& C5 C2 t: U
3 n7 \% k6 E" }$ a+ o
From: John Coggeshall <john@php.net>; [; ?- N2 Q' d/ l- `5 h' n
To: Joe User <joe@example.comt>% ^. P0 i6 {# E0 h, h+ l
Subject: Hello from John!- X8 }5 Q: m# D& ] t0 S
Date: Wed, 20 Dec 2004 20:18:47 -0400
7 m6 `# }- C2 {* l# XMessage-ID: <1234@local.machine.example>
0 Z9 L4 ^1 x7 u( ~2 o |Hello, How are you?4 `3 V5 V0 E. m r9 T
8 i+ v$ h4 |4 C: j
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
& L: R; c; n5 m- A5 a' J9 Z
# a" C; G3 V' P- g: [( A( P* hA.MIME-Version/ b; i; Q) o9 ~# s
B.Content-Disposition9 J$ q {- X$ `
C.Content-Type
- }+ K: i0 ?1 T5 f2 l, @! JD.Content-Transfer-Encoding+ V7 R: K, l& O& L
E.Content-ID
, ?9 X5 o/ V3 Y7 v9 N' X
: A6 T! U- B( O4 u) v# M" w7 N+ l1 v! {/ y9 T( U& ~
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?8 K5 _9 Y3 M* [6 B
' Y: Z- d: V: H- l6 u5 gA.multipart/mixed
9 S7 x/ U1 L% MB.multipart/alternative& U c) r( ~( R+ w- c
C.multipart/default
& \8 ^( u! L& ~" s4 y- X8 G+ HD.multipart/related) u- r; [0 U) ?! S4 g: j1 ~9 l
E.不可能用content-type实现7 b4 ?' V' A1 y+ B* |7 K
) b4 {+ y4 ~3 r
3 {- W5 k0 h5 E11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?$ Z9 i5 y: K3 h1 r
* o9 ^" V6 X. U# r7 c' L- m9 ]
A.安装sendmail服务器% I: H+ T& D2 r3 c9 f0 p& @
B.安装Microsoft Exchange
* b$ v, D ?+ ^3 C# g2 }C.在你的电脑上安装任何一种邮件服务器
- p2 g# V5 [4 v: F+ RD.改变php.ini的设置. n9 {3 R4 d2 W, x2 T
E.写一个连接公共电子邮件服务器的脚本
+ M e# z: ]- t9 X; i8 p# e( p+ m- P9 A5 x0 R; K9 i
" m* Z8 l; L/ _% y12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)( k0 n4 T" o1 ?: Y8 v
1 p+ v, M$ A, V1 |3 \+ p6 W1 AA.使用GET方式传值
3 G' N( |0 ?2 w. _0 MB.用htmlentities()处理电子邮件地址
* h/ k) D8 t! m/ wC.使用POST方式传值
9 R8 M$ x/ `/ ?. }* bD.用htmlentities()处理邮件正文
1 I+ \, R3 n5 PE.确保填写邮件地址的文本域不能有换行符. o) Y$ l- n' A' l, E
+ o# W! y+ A% f# K, H
# E1 V# y8 W6 t) k13.如何将一个数组作为附件发送,并要能在接收后重新组合?$ |5 s. K4 Z4 ?1 F. A
( {" A/ S- J# @) vA.用serialize()把它转换成字符串,再用htmlentities()处理一下! v- a, Q! L1 \0 Q s% g
B.把它存在文件中,并用base64_encode()进行编码
) D3 Y1 ^! b. E! \6 Y. JC.用serialize()把它转换成数组" H' _- A- a% A; g
D.用serialize()把它转换成数组,再用base64_encode()进行编码% B/ [3 r. A7 f' i7 z! _
E.把它存在文件中,再用convert_uuencode()进行编码
4 ^. h! ~8 k, U: F# K$ b* [" @- j9 I
8 n' G8 `) T2 L) Y7 v# @( l2 H14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?, ^0 Q9 |3 `$ O- k- S+ }9 r9 z% R+ m
& v7 X& u( t2 d3 w2 [; r% ]3 tA.堆一个检测脚本出来
* f- Y+ U* E7 ~9 SB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
1 a# V6 m/ b: G; f' T/ \C.写一个识别文件MIME类型与内容是否相符的函数
9 M0 p& \$ K$ o6 Z- yD.使用mime_content_type函数6 _8 s9 B) ~$ N* U: v. }/ S/ {
E.把文件上传到外部服务器上& l. W5 O5 L" h( { V) v& l, T
* O1 ]* [) b) G( |- c
" {* g1 x% l8 d15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
! o0 j5 g3 i3 K/ N# }+ B
$ y1 e; g# A- G4 I. ^. _* t3 K3 |/ \/ oA.添加一个From头信息
! c; p% {: `" Z- KB.使用-f参数; p4 A" C" v h8 J# r! @
C.添加一个Reply-to的头信息+ w) K7 ?/ H+ B4 _
D.确保运行Apache的用户有修改sendmail设置的权利' [8 g' Y! b# C% ?0 F) ]1 A
E.确保Apache在root用户下运行& v1 A1 Y7 D/ d3 E- ?
答案速查
2 v! X) y6 f M# U1:D* w$ e+ P$ y, f; ?
2:AD
% M+ _* A% y" f, T5 q3:E
) O9 n3 N) |/ |* D3 W4:Content-Type:MIME. {+ D+ p# I: b
5:BC
% X0 j+ r, M: ~2 ~" o6:A
/ @4 o( \, W. M) s+ O$ s3 r7:C
. l# k0 g6 }" }% W8:BCE7 E4 D+ Q; N/ y0 z: B
9:ACD
3 l4 D* ]( Y4 Y. g( y- W( w10:B
; F( W, H, h+ H9 S/ p8 ]11:D% @* f1 i, [+ h" C: U. E5 ?4 }
12:CE; |3 H6 s+ E e8 a) M7 }/ b( I- I" [8 U
13:D
( y8 t# R- s5 x14:D1 _$ B- m# ~/ A$ M" c4 G
15:ABD
! j, P. _! J. J. d9 X) l! C8 @; [; b0 ~
# }) P+ M) d! t- g- ~, {
8 b g9 y( n8 k$ Q0 A6 B
答案详解
5 X) z0 u d& b0 J% D/ D
4 i8 D& f n( ]. o) k K C2 Y+ H+ K3 B1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
8 @0 w0 g, D* r. O$ p1 l, ?) n5 K& ?, J8 L8 x+ N4 j, P
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
2 |8 W5 _! p# s' |* a* y7 P, U+ H; G! R, ~( B
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
% j& D/ X( |1 V4 s7 I; g
0 V, [7 h1 ~" f$ s4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
0 B* g d+ ?: }( F5 L8 O8 c7 }
* F" n3 Q9 X, n; {" B- ]- n5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
8 Z/ r3 F3 U: r4 Z6 s Z& U, _5 @; _: G, j( a% s
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。" f& N* G9 K! b% \) Y" Q
% v5 D. I8 u$ f( o8 R! j, h }7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
" \5 ~! k3 A0 _: @2 c: ]# d0 T) P: ?! ?6 J2 h+ a3 T0 e
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ |) J5 } \/ V+ A# Q H( K3 D: E$ J8 C% Z7 b h) v, ~9 s I8 D
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
& F/ L$ G+ h- g8 a6 M2 B0 d `2 m* d
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。# P4 h; k T- E& M: f
0 `" @* l5 e9 ?$ c11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
+ V+ J+ e; U, Q" Q1 [5 P, a2 b2 e& d+ H; d$ S
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。# Z+ Z1 }0 i1 E; y5 }* i# S
. I8 s5 \9 D; }! S% l1 `2 X/ D9 I13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
) N/ E; y/ w+ v, t4 U: U' l7 m* }6 a6 j8 I c o3 \* z8 d' ~
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
/ B' a6 I; X- H2 x4 L3 o$ N! p/ ^4 |4 v8 j- y& H
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|