|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
8 R q5 {9 m) c; }1 }还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。0 a5 r' {2 I: g) P' Y- {* l
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
, Z5 I; X' c) X, k$ J, C O5 N; g4 _
3 f! G" W( a7 v) W! b- P; `# z: s. Q {; H6 G
问题
$ u' _" z& n ], d* p& C
5 r6 l2 X# G; _4 A5 v1.以下哪个不是合法的电子邮件地址?& R3 Z0 E* X. u/ Z# `
. M* v1 H' a0 J/ U" k" h: J3 R" l' @A.john@89w.org
& Y+ w: A6 B; ]! O- aB."John Coggeshall" <someone@89w.org>' ~& x2 o. a9 O
C.joe @ 89w.org
& l7 G' L3 ^5 M! Q N0 O3 ^5 kD.jean-cóggeshall@89w.org0 ^! @6 ^2 _# i; V8 I
E.john* F% H* m# n2 w$ v y
1 ~ ~5 E; o5 x# o# ~: @# x
- Q, I4 K! j p0 G
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)% Q7 \: K2 w6 u8 H* U" N
5 W4 ?/ L4 B# [3 M: x8 u1 h3 }
A.Windows/Novell不需要第三方软件的支持就能实现该功能& W; v1 W2 X0 q) I# L$ ~3 N. A' z. u
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。* p8 f( m' f7 n* M- o( l
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送3 S, y7 V% x* P4 @( S) Y8 i
D.有可能完全相同,这取决于sendmail_path的配置
# }4 k+ i _# F aE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
2 a- L; V$ M* ^3 H$ U4 E0 {" o
T. U9 K2 _ h+ e t
# I2 G/ N' l. K q3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
6 |" N- C$ B4 t- p6 M; j3 m2 c" I* t+ E; P$ |. ~
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
! p7 b% G! B/ dB.用PHP代码,通过SMTP直接与MTA连接。7 u1 E8 e+ b. ?$ v
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
* h# s0 {" X: W3 x. R- ~1 bD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。$ ?& G9 R3 Q7 U5 [/ W# {1 H8 }
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
2 s( F# E% ^( d6 L2 q R/ A) t$ j- h
3 ]" h3 u; e: n4 k! G s0 }" @5 j8 \0 }; _! ]; Q2 q9 N( N
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?& ~# Z N* i, w
9 a; j- o4 E; X+ x) w3 Q
答案:____________
: H7 N* |+ H5 l, v$ a5 F/ s" ?9 U" z5 Z* {6 L% P) ]- F" A
3 t3 _& a! S: S/ t5 T8 Q
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)7 v% u% i0 e8 N3 c" Y; X. R2 Q0 z2 j
5 m+ u9 k8 L- a% M4 M' L" n/ P# q
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示 H$ U& N8 o+ N$ o
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片! v% b+ q, J Y m$ w
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID1 Z. Y$ m# T, M5 W4 I
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名3 Z9 e: x/ O* F: e# j" X3 u
E.只有一个答案正确
9 m/ S t# g, I# K; M+ I6 c2 C/ X6 S, h( e" @
) c2 w# {0 O; I% n+ \# L
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?0 s5 Y0 d8 S8 B) @
1 E2 n, B# A" @6 `2 \A.从UNIX或Windows/Novell发送邮件时都会用到9 }' M: o4 R/ M7 M* t
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时( V' r0 m$ u) e( e
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时" N( y" f7 f2 o/ p
D.PHP里用不到这个参数
4 H2 o1 T \- ~. X6 D" j: f# e
& V8 P b! K8 e
/ u# C% S! V( K; ]- V' b: a7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
5 @& n' O' q- e O$ T8 K
! R9 C" f3 }2 I$ V$ E2 aA.只有在发送非普通文本(ASCII)数据时
/ K+ G6 u, l& @B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
3 W* r2 N E; L$ M4 [C.任何时候都可以用它来指出MIME的编码类型 W( i) B5 p4 }& f" Q8 x8 Y
D.只能用来指定特殊的编码格式(例如base64)6 F l! V P& r1 V1 p
E.以上都不对
+ ^/ O' A1 g! A& E [9 }6 s' L
) X# P# P1 o5 R$ j8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)1 c! y! x" k5 h: H* x9 q
' a& N6 X' b3 A6 q: K
A.分隔符至少要8个字符 ]8 u! N! B+ x% y
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)6 [# y" h3 @ K o
C.分隔符在MIME邮件中必须是独一无二的
$ I, m \# p' Q; W9 _7 hD.分隔符不能嵌套的其他分隔符中
0 @& B: ]( Q7 {% {2 h: E3 H' U' eE.用什么做分隔符都无所谓% ^) }+ P" B4 N7 i
9 ~4 C9 h% T3 o+ t6 s& l p6 [0 s) U
. h/ G1 G, G7 u! F9.考虑如下E-Mail:
# F% H7 {6 a2 l3 U6 K$ B m# K* t: R# A& U9 _
From: John Coggeshall <john@php.net>
! n/ M8 B& p- E8 MTo: Joe User <joe@example.comt>
7 l1 Q1 _" B9 X; S1 B: nSubject: Hello from John!5 H2 ]0 z' \! g& T- i8 c
Date: Wed, 20 Dec 2004 20:18:47 -0400
a) o9 h( P$ xMessage-ID: <1234@local.machine.example>5 L: {1 F) C/ Y
Hello, How are you?
! P0 ^- q% W" p0 l
; [5 T0 N# J* ^9 U在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
+ j" g/ ?" M5 ?
) b. I6 l$ a( B: [6 i" o7 JA.MIME-Version7 y& z5 t4 U3 f$ n, W+ B( Q
B.Content-Disposition1 n x& g& _8 E' {
C.Content-Type, h+ @& \/ f% c7 ^+ [; @& F
D.Content-Transfer-Encoding
) i- H, t$ Q2 z4 S% vE.Content-ID
+ z$ @6 B' k& U4 c8 ~5 i5 }6 X9 }5 }6 N4 k0 E' Y
) R3 U& U! T, N4 }10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?, a4 B* X# e! S& @8 `& d3 O
2 A6 G, n) H$ U1 I' l; r( A, n
A.multipart/mixed6 z3 i% s9 q: Y+ B
B.multipart/alternative# d$ K& {2 _+ g% G8 O
C.multipart/default
* v6 N) T$ @ m, HD.multipart/related
7 ?* J5 n9 y y2 kE.不可能用content-type实现
7 n; K- ]' K4 z/ D, W3 F* P1 D5 w: n8 S9 \" q% c8 x2 M
; t# j4 l2 Z0 y, h: ~ v& a
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?7 }2 b7 U. {1 q4 Y8 S
$ L8 A4 e% T! K1 N9 V
A.安装sendmail服务器
* U: c% y# q9 b- O' E" x1 nB.安装Microsoft Exchange7 E+ w: X/ ?& e4 Y: `
C.在你的电脑上安装任何一种邮件服务器( i9 x1 |7 k! v4 i1 T
D.改变php.ini的设置 m: S |- K) f7 G' R
E.写一个连接公共电子邮件服务器的脚本
/ w) F W% ~. J* @% a7 r( Y: {) e6 y3 e/ |) j$ z
# o- e* `+ W6 d6 g4 [$ R/ H
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
/ y1 p& \6 q$ c# U1 V9 j9 M) @; g" ]' n, v0 v1 m& g; Z) B6 f
A.使用GET方式传值
$ I5 B' }( f3 `B.用htmlentities()处理电子邮件地址2 P- W# T7 A% m v9 b d
C.使用POST方式传值6 r& d% H% ^9 J/ e
D.用htmlentities()处理邮件正文
/ Z+ s- w! r6 h1 p( qE.确保填写邮件地址的文本域不能有换行符$ O4 G; f" F! h) J N+ L7 l+ t
; s* f. s& k5 E6 i2 r
- T% t0 B( O* |0 b8 o! W13.如何将一个数组作为附件发送,并要能在接收后重新组合?
# J" Q1 j$ {0 [3 ]5 i5 V0 h* l+ A. X3 w
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
# u7 x. N5 `* q w4 B" ]5 G. c/ a: G1 {B.把它存在文件中,并用base64_encode()进行编码% H( `4 `* C6 H' n" N0 u! k
C.用serialize()把它转换成数组* H, @8 z3 p5 U9 `# c5 t
D.用serialize()把它转换成数组,再用base64_encode()进行编码- u- c9 Z9 Q5 P& l: }( Y
E.把它存在文件中,再用convert_uuencode()进行编码
( _0 o+ x1 O4 D7 x
$ K& g3 f! o, ?' k
0 r9 ]; T$ h8 ]% K14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好? c6 `8 J5 x5 ^2 H/ ? ^9 J
6 x$ h: V' j9 g5 m. v2 o, m. q( hA.堆一个检测脚本出来, ^" [9 K1 D- {
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型3 M u+ B+ K4 a' V
C.写一个识别文件MIME类型与内容是否相符的函数
/ M* Q5 {6 y' N. C9 G ^D.使用mime_content_type函数
2 O9 J1 H9 p7 vE.把文件上传到外部服务器上, A/ g0 |& E/ t# x; u7 }
G1 Y$ K& b& @$ s- {: \
7 n" p! q3 ^, E: a, i15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
. r+ D. ]9 q) p( D% J" s- J; x' k+ w& C) ^/ d! S. D5 m) a! y" T
A.添加一个From头信息3 i5 k5 V* ?" z! u! }" ?' E& L
B.使用-f参数6 J9 O4 p2 u5 ^- z# Q( h8 |
C.添加一个Reply-to的头信息3 k0 B }7 @; T# R% @. A( A
D.确保运行Apache的用户有修改sendmail设置的权利
% \; s+ N; d) S6 YE.确保Apache在root用户下运行0 T* d% {: ~$ R, \$ J1 _
答案速查' c2 X7 p- t( E& n/ n, [9 y
1:D
( l6 T* A. T8 @. X. G1 {8 U2:AD
5 a' t5 x: r" ~: I" @7 k5 i3:E) b1 e9 T% L0 _! A3 e! i8 ]8 ]
4:Content-Type:MIME
/ t& u* G, y; m8 n" H+ U: b6 @* ?5:BC4 K+ F3 G- G2 A; y6 l {' A4 x
6:A9 T: `6 U, q! r6 Q
7:C4 X" k2 u" f; z" ?1 \8 n
8:BCE% Q, G/ ]8 U" Y7 L( L. T
9:ACD% H3 @6 F* Y- a0 A) W+ d
10:B( b; J0 A) v* T& S8 ]2 X4 u R
11:D2 r9 K# t! I$ e( o
12:CE
! ?% o/ u( ]6 d v6 k13:D
% b" k' E0 s; ~6 I: o14:D
2 V2 {9 X e5 W4 [ s( C* n6 k15:ABD
0 m9 `) w7 b, C, E% k0 m% Z) W7 v; c) I0 R7 ~# R
, V; K' O" s) G5 w1 {
2 X: @4 u% I* u9 P9 W
答案详解! d6 h2 j" g3 c$ t. I
8 J# J* B% K1 ~/ j O
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。8 s! q* F+ J @
9 P/ B: x: }0 H. ^: Q$ L" Q2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
! B/ r& E% l# W: v$ ?! h3 E* D2 R9 W% E3 D. }- B
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
! {1 s! t7 _7 S( k$ C" k: n/ m& o7 |) ?" [% b a6 ?
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。, f$ t1 e, Z$ D. D6 g
# R; _" ?# {. y0 [* p) X! E+ i
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。4 M' i+ ?$ T8 B* k1 K) i" M
8 w+ G5 l/ T( n+ [* q& n
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
X$ [5 E8 E3 v2 N+ Z5 K( N+ K8 X& C. C T* D8 T
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。: a6 N4 B: o% Q
" l. }/ F6 M% a3 G- c( E# l
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。4 p# I# B) J/ R2 n. N! v" W3 C
8 }. n+ S7 k2 h, m
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
6 A8 [7 N; W. J2 Y
3 R' p+ b! }/ _2 e; o4 T4 t4 f10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。5 p! z2 H: F2 e7 y- c
. V5 _# Q; B Q1 }) p# C6 _: l1 ~5 Z
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
! W! G& d! l" c. ~, `8 R
' B0 T. ]2 C3 K+ v! u: S% ^12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
6 [" D1 Q7 o0 N
3 w a8 V# R: q2 R' J) N/ h13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。9 `7 x8 A3 y c
8 v; y3 @" c4 L, _1 x6 o14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。: g4 ^9 [5 ?' E1 \: u$ L+ s8 A0 U' E
5 F. @; e; `7 \% ~+ J f
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|