|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
$ m- J6 |1 f6 V3 D7 ^还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
t: m- z: { f$ f) G+ i+ V1 F用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
3 c+ I W- w/ d; |: g' U/ s; c9 g; T' A7 g0 a2 P Y
, u$ y' x+ `7 h$ B$ U4 m7 o
问题
6 W: C! f$ k/ N+ H7 L0 f$ B4 u' c6 r7 R' m
1.以下哪个不是合法的电子邮件地址?9 U2 j- \5 k0 p" c' x( A6 L5 S
$ l- D$ K0 Z, ]) `: j; m$ SA.john@89w.org
|3 ^ w1 Y/ N2 w3 oB."John Coggeshall" <someone@89w.org>
5 @0 Q! ]3 A* M* \C.joe @ 89w.org9 _; `9 I$ v7 C" F% X0 u6 Q
D.jean-cóggeshall@89w.org6 R1 Q+ d) r# s/ k% w
E.john
+ c0 c: T) C$ f) r9 W6 z' C W8 `, J V# [. p4 v" D
7 C: u# \! ~- K$ [6 r5 J% ]2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
+ T0 y- H1 I2 J( x0 q: @* J1 J% E2 }! i' g: O8 I- E: d
A.Windows/Novell不需要第三方软件的支持就能实现该功能
1 T6 I9 R( T _9 Z. | x; i% GB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。% }! n8 s* l* }% T# |
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送6 v& s& J. L. d8 p3 t; w9 D
D.有可能完全相同,这取决于sendmail_path的配置
) A4 z* Y" u5 n3 i, i' CE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
. c( I/ A/ E" h; \# R2 n. S/ U; Q8 ~! ~
9 n1 x3 d# Q! P9 e& G) s( r! P) b
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?- C; Z: E- h, J$ S N5 p
& B: ~+ V) }* f C& NA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
2 L& x) C# Z/ ~- fB.用PHP代码,通过SMTP直接与MTA连接。
6 i! }$ }! q- |: T/ UC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
2 F* Z6 H8 e$ oD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
% U: I1 G+ a' y! ?6 j4 Q `E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
5 V+ M$ h" K/ }, q8 A6 o. O2 f
( n# Z# v6 v$ ~( ~! Z1 R+ @% ~3 d3 ^- L8 n) H8 E- G: [
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?/ K: W* u6 I) r# U/ p3 Y
X3 ^/ V3 Y1 {$ j+ u答案:____________
& N% C( k, H; ?/ {! H% ]$ }- j1 q; @4 l% V) I$ n: w1 S
! x, k, [1 R1 X' A: ~4 K' _" T
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)$ `! Y' q1 q$ E, n
5 E6 n* n; |) y% S* i* d% y5 Y) S
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
, x6 Q- i3 M) v& I: w7 e" ~B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
( C+ O5 G8 V' k' C U4 Y1 v* n1 tC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
3 ?! F& k6 \2 {# rD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
, j! O' d m1 z$ _- _( kE.只有一个答案正确8 C* h1 C) ~; V8 h0 a
9 q5 W( v. W- y: c8 L
' x5 l8 H c2 U' i: x+ |4 S+ D
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
) }1 ^# }! f2 {' t \6 O8 D# S
9 F$ h: R. b2 ~5 \( s) e0 Y. ^A.从UNIX或Windows/Novell发送邮件时都会用到" ]5 v3 r* O8 k2 j) `; H7 X4 L
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时- m3 `4 E7 D3 f& n9 {# A& Z- O; K
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
# e9 S, l+ O, \6 ]& {+ G, FD.PHP里用不到这个参数
# j) @3 y8 g4 @+ F3 h" y- R! r q3 s9 g$ X# S# ?: Y9 U+ {/ Z5 ^
& p) z* H! v; n) l! U; ]7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
& d* \* c5 N/ o) e* Q- V) W4 p8 z5 n/ `. y8 t" J
A.只有在发送非普通文本(ASCII)数据时
/ k4 ]! Q7 C; B, NB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)) |5 Q7 A; f5 W5 N
C.任何时候都可以用它来指出MIME的编码类型
7 T) G; T. r/ R+ T3 B! q/ qD.只能用来指定特殊的编码格式(例如base64)$ t3 ^" A; M$ `3 P9 R. f9 T" C
E.以上都不对# q2 {) [: d N5 ~8 p
, i! {5 ^! V( Q, B& P! c8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
! b" T/ M: t2 x( A- D1 D$ q4 D ^) w2 P
A.分隔符至少要8个字符
" q% A( \" q. @0 U6 l! wB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--): T% d% M! J& s! v0 a! c% ^
C.分隔符在MIME邮件中必须是独一无二的
5 q7 ~2 y( a7 @; vD.分隔符不能嵌套的其他分隔符中, c( [0 R" ^$ i4 D+ Z. w3 @4 y
E.用什么做分隔符都无所谓' ]7 B! x, H6 d9 t+ ?- v! O/ S/ ~, c
; ^: x' l: i0 U
# ^8 ?4 Y2 [- f2 O- }3 Q9.考虑如下E-Mail:
6 o4 i% O5 w \* d- D1 e; m/ j' V; S
From: John Coggeshall <john@php.net>
4 C9 z5 \6 h( pTo: Joe User <joe@example.comt>/ \9 [: S3 q9 i! C }6 o
Subject: Hello from John!
; M$ ]& X4 ], l$ ]# ?: GDate: Wed, 20 Dec 2004 20:18:47 -0400
8 O% o2 T/ w4 \4 @Message-ID: <1234@local.machine.example>* l& ^( l& h8 R# I* J Q
Hello, How are you?7 ]* L. l2 O5 W; D$ o* \5 z
7 y u1 L) M' \2 L3 O& N在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
" s$ B9 S9 {% i1 Q ]( t
! E, }% F1 b# T( pA.MIME-Version$ n7 a; j; p+ l4 _; l
B.Content-Disposition! \! C8 O2 g2 ?, r4 S ~
C.Content-Type
. `7 @ P" S) g/ b) ]. q4 [* d! LD.Content-Transfer-Encoding
! P' Z) [$ J4 bE.Content-ID% S! C5 b% [' c; P+ g
; I* c3 \( f# O/ H) t! L, A: k
; O2 O7 g, v" `7 R* p$ V) R) p10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
- d& h4 t( q t* K. Y3 ?8 D' K* t' h7 L8 K; k; |
A.multipart/mixed
! p& X2 x* s6 tB.multipart/alternative# _6 T+ c/ ^& X; O: J0 s
C.multipart/default; K# a, K/ }" z: [1 |. [
D.multipart/related
" g0 P% B7 u: aE.不可能用content-type实现
: P. s* ~6 V- v; o! v5 e, K3 V5 u) P& g2 d
! r8 o4 s2 L' L7 N* b$ J3 e) ?11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
' q$ C& O9 |; D" W
$ c# u) Q' S! tA.安装sendmail服务器" J$ w1 f# ]. l, n5 |
B.安装Microsoft Exchange
y, `" _$ h5 c+ M: g- KC.在你的电脑上安装任何一种邮件服务器! @0 J$ x9 f ~" L
D.改变php.ini的设置: X2 K# l) c) R
E.写一个连接公共电子邮件服务器的脚本6 X9 p2 U z+ h. f4 g+ a) _$ x- Y
3 a' e; S) w+ [) Z0 @) |: B
$ y# U5 t8 G3 `$ P: ^1 \. f12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)5 J9 x* L _, [1 O1 c6 @" n! a
: u9 Y8 t) V- I1 H; ^
A.使用GET方式传值
* ]4 f' N5 O1 S, ZB.用htmlentities()处理电子邮件地址
& t' D$ l" e4 x* z+ r8 mC.使用POST方式传值, |, s! H% @; o1 Y/ { ]4 U# j
D.用htmlentities()处理邮件正文
' N+ g! r- F9 `E.确保填写邮件地址的文本域不能有换行符# U+ M1 L7 o7 J2 B/ F# V
- u* ]! T7 F5 y! k/ g7 a
& D* A* ?* |2 i9 O! v2 y$ u4 \13.如何将一个数组作为附件发送,并要能在接收后重新组合?/ Q2 n/ _# R" _; S# T# I6 h
1 E. Z# S3 F! y2 p9 x& m* Q% ~
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
5 I1 x5 J8 L+ q5 P- c$ dB.把它存在文件中,并用base64_encode()进行编码6 {% P! J( O3 |4 {2 K
C.用serialize()把它转换成数组; R( m# x& V* v6 F. @
D.用serialize()把它转换成数组,再用base64_encode()进行编码( J T" r/ q& G# ^7 ?6 z5 j* p
E.把它存在文件中,再用convert_uuencode()进行编码
4 `( j0 t7 y1 X
, ~3 B- m1 ^0 Y! `! @
0 m! a$ d' O* s# O0 M! X2 R14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
2 j2 q2 f, d* j9 {% x+ h7 j- O9 i4 x5 V( h" a. g
A.堆一个检测脚本出来$ \7 E4 m. U% a3 z Z
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
8 `$ s8 t% a& NC.写一个识别文件MIME类型与内容是否相符的函数
( I b- Y4 t# V, ~5 N1 aD.使用mime_content_type函数
+ p, _6 S/ Q0 ~, z5 i9 o. e7 t4 ZE.把文件上传到外部服务器上( n1 Q, {3 P+ A3 x( q( A2 W
% C1 g4 g7 U0 @3 s$ |
& M7 ` V* }9 W5 L! D& x15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
' i: S9 C( ^+ L* f1 x$ A& _: s# n9 v0 @ ~- K3 `0 e
A.添加一个From头信息
5 Q2 K# A5 {% W4 VB.使用-f参数
+ u) u+ W2 w3 P) X6 M5 G b! g! |C.添加一个Reply-to的头信息
! n1 C; h5 C9 o: O6 k+ w& r( uD.确保运行Apache的用户有修改sendmail设置的权利
# ^* W. I8 }, D" S3 Y# U/ @E.确保Apache在root用户下运行
" ?) V9 R3 I" r, Q答案速查4 u) P3 ]# s9 H; E/ j/ }
1:D+ d; I4 I c" ?' ?5 f8 U2 A3 ~" p
2:AD
: [1 O/ X$ E: ]3:E
+ a- M) c" O) @4:Content-Type:MIME* ~3 O* k* f1 M
5:BC$ e7 N' c2 E j+ Y+ G$ s
6:A6 H. [4 g/ s8 t' n+ I" t
7:C0 o" s& _ H% P9 f7 [0 D
8:BCE
3 b5 F7 r f% J! ~" _1 g& f2 @8 ]9:ACD
' P, N$ F0 s% C) W# E10:B
& |6 _: ~! @0 E) y9 F Y11:D9 n4 t% |4 L, s9 ?$ d/ v$ [. F
12:CE
1 L% E5 _0 b( Q" v. S2 }1 V( o13:D
) f+ H: P6 h6 W5 @- U b14:D
# d- q5 a r! H. y: k15:ABD
2 I) B Q" f4 r8 u* R
2 `7 V- k& S1 W, u% N$ X* s# b1 n _
! \ L% c3 ~; u/ V% P答案详解
9 ~' {$ X6 v, j# X8 U, C) I4 P, k% ~; f8 {" E, |; A3 X, E
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
3 Y, g) U c% w4 ^* w
# ?5 K, B: V3 X9 r% C3 ^2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
9 J2 M6 t) ?8 O8 L4 F" i9 r' c/ g
0 y$ B. F, D. p0 r* [8 I& g3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
5 F% f5 G7 [- C! W. B' F( Z
6 T4 ?0 i- W7 h: {4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。& l* j- T# I$ R6 E8 p
# r3 I; `/ k" `& B5 F2 o. d( C" L1 Z5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。: X4 F; s# H. F1 J8 F) h5 n
, @$ h* v! ^, K" g6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。; V% C, |# ^0 w$ w! y9 e
: U2 o! G. ^! S+ s. I7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
0 B- y6 {& |# o/ Y- J
5 W6 [/ ~4 W, Y5 u* F8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
9 K4 N9 _. F& D
3 t% |1 e0 B; [4 b9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
) m' t. ?, e3 H" S- [; G8 y0 p) Z; l
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。/ p' l0 ?- m& [+ Y$ Y! B n
2 \* y! n: F E
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。 l+ U$ n' F7 ^% q+ l4 b+ `
2 d. D' K t e# `
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
/ D# D! E9 X. I3 W4 d$ ? X" X; h3 o3 \# I3 k2 U; s4 w
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。# R9 R; I9 Z' {$ t; a0 `( B. Q" j
6 e# r- C, t" [9 H" _14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。; p: |6 q8 [$ E
8 i Z2 i5 p+ v' n9 K4 V5 J. B# p15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|