  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
! i& P; r6 q$ [* @! Z. Q还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
4 u. M! g; S R0 m) T2 ]用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。* S* B# ~, \! U. q$ W
. ~! g y( Z8 \2 g6 n
2 C; l4 i `( A1 U6 {问题
1 ^! c3 U/ { z1 K! V5 M0 J6 H* l9 x3 ~( r q# x
1.以下哪个不是合法的电子邮件地址?; o8 Q, ?' w2 K5 E
+ _3 o) Z' K& M
A.john@89w.org
1 l- w9 \. G" \B."John Coggeshall" <someone@89w.org>
( l2 O4 i0 G7 N% `C.joe @ 89w.org
7 R& u: {; ^/ U4 hD.jean-cóggeshall@89w.org, N9 k" p3 s- A9 M* l2 d
E.john
+ p) w+ L0 s) p* A5 [; T% O
+ k1 S3 j7 ~& R0 w
4 W# B0 R) x! h4 X0 q5 {2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)3 E& v* B' x1 |# c
4 D! {9 r" L) E& a; W) u% A$ X
A.Windows/Novell不需要第三方软件的支持就能实现该功能; {) K @$ P; D- v8 ]9 }1 _" D, u
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
; D# v. N2 _4 {" U. w1 u9 KC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
* G" i& L& j/ I7 q* v2 dD.有可能完全相同,这取决于sendmail_path的配置
( M$ B& h6 l$ BE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口9 f4 E! o% x' x" Y7 R8 [" h
' X f/ g1 {: ?0 H: ~, ]- {' t; i: e4 Q# n% |! W( `
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
9 l' L+ W& H* `; s- A N
6 F1 X# v+ w# w! \, i5 mA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数! m: w, R. z6 D! ~' H7 O4 z) w
B.用PHP代码,通过SMTP直接与MTA连接。% H5 I; z7 w7 v, H% ?
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
, o- K) }. r# P+ XD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
3 d9 M4 G/ f6 c7 jE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
) X# N- @* N2 v! D2 @ i5 U* D- N! g2 } G- e
# {* B0 w9 E, d
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?9 \3 I, N, e& R$ s+ S
9 J4 g+ ?& k3 H6 M答案:____________, F. p& o: O$ c$ F+ P3 X
1 Z6 d& ]) n( p) e% |. E
$ I& A9 E# c# Y6 m; m$ n
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
& X( ^" \& \5 o% M3 z- Q( D+ G& S9 s& U
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示+ b! M- h) ~4 F6 h7 r
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片2 a$ \) }- Z1 W( v) x4 y/ I
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID3 h0 V( ^+ x4 m) `; ~
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
0 u- {! u8 n% |1 c5 _; j2 SE.只有一个答案正确. e/ d' K6 y. I3 ]' y9 i9 o
/ l% [9 \# s/ K/ S: e5 c# N" I
& t' y& T) ~0 D C9 p* R V; ?6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
0 V" ? ]' t3 Z8 [- C: h# Z4 a8 X
" a* l! s: v8 v) D- |1 eA.从UNIX或Windows/Novell发送邮件时都会用到3 t( L4 g o# I/ s7 w4 ~: W, W& U
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
% S6 e& [9 _. IC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时& F; ]+ f/ ^3 F& X c, M: C( z0 J
D.PHP里用不到这个参数* K8 |% y3 C/ i. \% K
" I: f2 q5 T) q% G
2 _+ U( i) s5 l1 y' H) ?7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?# j2 I/ j* `; T6 s
! @+ \, H8 }3 O+ _0 O8 Y qA.只有在发送非普通文本(ASCII)数据时- b/ N1 j: ]" I- o: }
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text) b' h' K8 _6 j* f4 B
C.任何时候都可以用它来指出MIME的编码类型$ r) J; J u! {. J& G( d
D.只能用来指定特殊的编码格式(例如base64)
& o+ j1 y" M9 rE.以上都不对9 M+ q8 h3 `: Z! e7 s( J. Y
- c) L1 o! P0 C" a {/ m: z( G
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
2 _0 ]$ c6 k, T4 i
" O% h; ]4 C/ e) b+ zA.分隔符至少要8个字符, P! Z7 Y' a8 A; w
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)2 y9 s0 D* i) L/ F2 X
C.分隔符在MIME邮件中必须是独一无二的
0 g# J1 s) ]! MD.分隔符不能嵌套的其他分隔符中
/ R3 d+ Z; d! Q; ]& J) W" u" l! tE.用什么做分隔符都无所谓$ V, D- e$ ?: U$ n$ d: B
: X0 |$ e/ ]6 ^& Y1 H m; q7 b3 U! J( A, s) Q) c. @' m7 W
9.考虑如下E-Mail:
6 m \9 v' h! s) g& e+ f2 C# `+ Z1 J$ W m! `3 ~1 ]
From: John Coggeshall <john@php.net>2 l b/ v4 m8 [3 g$ T; u6 e
To: Joe User <joe@example.comt>) S: Y; _0 m5 `! e/ M
Subject: Hello from John!8 t i8 c9 s, ^/ A7 t
Date: Wed, 20 Dec 2004 20:18:47 -04007 V+ Y1 A: x2 J+ B& x
Message-ID: <1234@local.machine.example>
/ q( O) l" ^8 a, a* kHello, How are you?
: n1 X, X! X: {* Q: h! [, Z$ w4 }" \+ `$ y
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择), S) s9 K/ `$ u% B5 z1 N; }
0 S% P/ ]3 `' y* c- d DA.MIME-Version" `6 c* O2 m7 j4 r
B.Content-Disposition L- D& Q* F n2 m+ _ z6 M$ i& M! f- U
C.Content-Type
5 {* H- ^+ ~ {& s- GD.Content-Transfer-Encoding( B6 O0 u0 A7 t1 J1 d
E.Content-ID
6 S6 Q" \. ~; A) _5 P" ?
2 p; `; E, K5 ]! o# s
7 z6 q9 d, M+ o; `4 a10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
# ^8 F' J* U3 x% X9 w7 u7 r" o/ A6 G0 z( l' O
A.multipart/mixed
/ a {4 n( ]4 ?, ~0 @B.multipart/alternative8 F& }- [- }- ]* N; W `
C.multipart/default& Q v; p' w9 c4 t
D.multipart/related, ~4 y8 Q% E$ @0 d' h& Q
E.不可能用content-type实现 [( w G$ E2 y) V- t
3 \: W* \7 m0 d! B! D3 [$ B* E
+ Q" y6 S6 \% R2 T, x2 N' I2 z11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
7 h8 C9 d& ?+ Q+ c: ^2 O, R# P% j- V9 e& r# c+ {, @
A.安装sendmail服务器
0 b Q' [4 Y# S% z. l- `6 hB.安装Microsoft Exchange
- B2 a+ d* s. g% Y) F* XC.在你的电脑上安装任何一种邮件服务器0 x( g( N. ~0 ?$ d1 M# \5 G8 a
D.改变php.ini的设置
, @, g! A* t# `4 r4 I. X: d8 tE.写一个连接公共电子邮件服务器的脚本
* S1 X, a8 u4 r! ~0 ]. A L9 d, f% s4 d
. f2 _8 p( a- r3 {: ]( C# }3 X: F7 N; ]
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选). J) F2 }5 M" m3 w+ A" L1 L- H
% P4 Z# V; u; W9 W6 k
A.使用GET方式传值
) _; Q+ N) T0 |2 T, _4 f8 o- C6 ^B.用htmlentities()处理电子邮件地址
( ~1 k# Q+ z$ q z6 R) g% BC.使用POST方式传值: O* \8 r. d( [, f% c3 C
D.用htmlentities()处理邮件正文5 z6 c) D o0 ]: h! a# V+ m: q. Q
E.确保填写邮件地址的文本域不能有换行符
8 o( @! H: g. S+ |. r. p) I9 S- k# ^ H. S' C! y& G
$ u% c; F4 J0 s" ^# T
13.如何将一个数组作为附件发送,并要能在接收后重新组合?- m3 @1 N0 S3 K1 |$ }. L/ Q" s
2 @! E0 G4 A6 W
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
+ T7 D+ S% M' Q. y- |. R! sB.把它存在文件中,并用base64_encode()进行编码2 |0 B$ m5 ?' L" [$ X. w
C.用serialize()把它转换成数组- b# ^8 U: W) @' ]1 p; z
D.用serialize()把它转换成数组,再用base64_encode()进行编码
3 K0 m! \1 l8 j3 y" N: z0 pE.把它存在文件中,再用convert_uuencode()进行编码" S( n+ E) O- U( J6 r
7 T: }. Y8 F: s" h) _* R3 a1 m
6 Z1 G- N" x+ c# h* v# `14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?8 e1 D8 h4 X2 N6 H! ?! @- @! c
/ H- ?" W( B( }( [A.堆一个检测脚本出来
4 i2 ^4 U; O) K$ RB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
& [9 V4 r, u/ k; \4 H8 ^. kC.写一个识别文件MIME类型与内容是否相符的函数) F) G( h! M, \* X
D.使用mime_content_type函数
1 U1 X1 V# u8 R# g7 c* ZE.把文件上传到外部服务器上
3 H3 z9 f. v5 e0 B' A. _
. Y3 R. l7 w) t3 L, X& w. _7 ?7 l6 n0 m2 C$ R7 L7 J5 U, l
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
% H; Z. z1 |. N2 O# v6 V: l; m$ Q( g
9 L, v6 N- ?0 z" H8 @- b, GA.添加一个From头信息
& X4 s; n2 t. ^1 m: N& }B.使用-f参数9 ?' x& w! P% G
C.添加一个Reply-to的头信息2 k1 T4 b0 R. ]" V$ Q0 r
D.确保运行Apache的用户有修改sendmail设置的权利6 O( N- h( u( p1 c
E.确保Apache在root用户下运行2 P/ a$ y+ H+ D
答案速查& @* {* G; R1 A7 S! c, Q7 c) W
1:D% ?$ f" j1 U$ m5 L. i& ~6 i) Q4 C9 b
2:AD5 |, Z, b% w) R7 k0 c5 T8 s
3:E
) h' c$ ? n0 S- O/ l4:Content-Type:MIME
: j) B; V+ m8 A) T: F$ g5:BC: M- E" l6 w' g* B% @) b/ \
6:A
5 e- ?# D% y9 r/ ~! S1 S& m& f7 b7:C$ e- q. o# V) c- w9 x( a7 ]
8:BCE- A4 X- v( X4 O0 h
9:ACD& a% \- D0 v7 p( R* _
10:B* s0 [9 L/ ]" u1 ~9 s5 L
11:D- a5 ]) w( D1 n1 Q2 t/ \
12:CE% v# K: i' j: j( m, Y7 B' i
13:D8 L$ O+ A$ E$ Q& W3 m+ F5 Q
14:D
5 A& u1 C8 Z6 o% C& {7 o15:ABD* X3 X( i0 N8 O! |! T3 v, k
6 R: c7 H6 P3 c4 q, o+ b) J
[9 g6 g; v. D2 \- S' Q" H
8 @- \) w* ]( F( E5 {答案详解; q" c+ T. j4 w# z4 V5 W, U
" g& W' _; j8 L+ h I& ~# b
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
3 l, C% a' K+ g0 V/ ?1 b" N2 K! R- X
5 ], k) P u/ v O. G8 C2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
A0 Q3 C; U" \& K0 e& _* {. k! J4 k2 H* P
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
" r9 o7 b7 d8 n5 ?. z+ a5 Y9 A, ^6 z0 W4 }2 R: _
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。$ z. E5 g" [9 i: g) ~& x
3 _4 y& r9 q! Z5 Z; B
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。$ a; b K5 H5 _ s0 R* c
5 _$ W+ n8 O2 u2 O6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。& h$ x+ j/ h5 A" v4 o9 S
# \# f! o, h/ \1 ]% n4 o7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。, I. s- J- E* c5 x
' Z0 E" t5 P! v" d4 ~" N% @
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。7 Y+ x& H5 E2 E" L) A
4 q/ [( C% X* R( |0 B
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
2 T( i9 O# h ]! P' C
- W; Z0 g2 u+ ^10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
& s! G6 L9 N. T0 m6 j; ]2 }3 S# Z% h& T' s5 C
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。1 x0 ?! E9 V* L
0 b' p; ^% l# {/ z- d0 S
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
' u7 S- c8 m9 j- C4 E
$ _2 h- I, {# Z$ d+ R& J- k) Z) U13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
4 z* T* }, L4 W+ A4 o$ D; y$ X$ ?! [3 V3 X
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
# r) b T, y1 @8 E; t' ^" b
/ e- r: |( A+ l! F15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|