|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。& q2 k4 B1 ` q' B) M
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
) {4 `* x; }1 e5 A用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。7 z# c& c; ^" q6 g$ q D6 D, g
, D% P% `3 f+ u8 X/ }' k3 q- i
0 _8 `! } q1 L# P# N! Q
问题
6 Z b9 L( e! u, Y7 V( E- u
9 }+ O# Y& N7 T" }. \1.以下哪个不是合法的电子邮件地址?
! C0 I1 g% K% m0 R } J% ~% P4 M3 ]
A.john@89w.org8 \7 f, g5 B A2 v2 j5 y0 |% L
B."John Coggeshall" <someone@89w.org>
' y/ P% s. P; g# BC.joe @ 89w.org
( r0 r& @$ s+ }& ^6 P8 CD.jean-cóggeshall@89w.org, c2 O& ?4 }$ e6 p" O
E.john
. T) Z) r' J" Z M3 T! R6 Z8 u# ]- t+ B/ q5 H1 L4 W
' G$ S2 _$ A# x2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
' R( I5 h- b& E! U s8 u8 H R: H m' J& l% _2 S
A.Windows/Novell不需要第三方软件的支持就能实现该功能
6 O7 V# M) r# \1 zB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
4 j. @8 ?( f# v; y' [C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送- u6 c6 B2 z5 n$ e. i* J
D.有可能完全相同,这取决于sendmail_path的配置7 ?* ^4 p! \$ R$ s. B8 Q, C
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口( D6 y, J# P" l- e% L }
9 Z% Q0 `1 x& ]
& w: ~, I2 X9 s& s
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
; Q+ ~& ~8 Q5 I+ K" g, F
/ M- D% ?& g+ hA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数' z/ }! o; S$ u0 G ~. z0 P
B.用PHP代码,通过SMTP直接与MTA连接。
$ a; v) U, S8 x6 ~6 yC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。8 x, A6 i' H2 s' H5 {
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
% G/ F0 h7 i7 T# J, dE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾2 \) q# Z) `5 A% p1 b
/ R# z3 o8 P+ Q' w. x' v1 H+ ~
. t3 O4 T. j/ n
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
' }: d3 C; {# U; _. C' ?! K" ^! L
答案:____________
6 a' a5 g; a" H- x1 a+ `- S1 I# S, f% ?3 R
) p1 H) k( U2 N) W
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
$ a" `8 M9 t) [+ i3 J0 z, o' N! D9 u$ N" ]8 [, _
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
2 j- k% M$ s4 v5 D0 `B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片. G4 h" X; N7 B5 R
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID9 P( e; x/ D2 F# F
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名$ l2 ?$ l& i9 X1 M$ N$ J
E.只有一个答案正确
' D+ Z" k, i2 B! R9 @0 M3 |
8 ~% s( H7 n/ @# x1 X$ o1 s( n- S) g& t
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
9 C$ j+ f1 H7 G0 A' ?8 |
2 R3 l u4 \6 W HA.从UNIX或Windows/Novell发送邮件时都会用到
- R- Z4 S" R" c& F8 hB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时' i% b- G6 G R
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时/ W7 O: N+ s `( |
D.PHP里用不到这个参数2 A3 t' ^1 N$ c# m# s
$ M* B4 q* T7 V$ T6 G
- w l6 E2 o5 ~- J2 {/ O4 I7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?; `4 C7 a9 I6 N7 a ~+ a/ B7 o
: v1 }% L; D8 s6 fA.只有在发送非普通文本(ASCII)数据时
# Q4 _, L1 S5 Y" L! o+ _# iB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)( v- K h4 j( c& z0 i3 w& v3 E' E# c
C.任何时候都可以用它来指出MIME的编码类型! F" a" S9 I+ Q
D.只能用来指定特殊的编码格式(例如base64)
; ]& _+ f5 A2 B9 g( [E.以上都不对
# K& |6 \. `3 j* q$ Q* U/ {. h; R/ p3 @" X) N; [. {
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
2 X$ l# o9 f1 Z/ p7 Y/ ?8 f
4 @2 b- Y+ x0 X- VA.分隔符至少要8个字符
, t" Q: c y$ ~: i, m6 X7 VB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
: w6 a6 l5 n D6 ]9 u, KC.分隔符在MIME邮件中必须是独一无二的
$ f E" p+ {2 d/ [$ E4 }, D; SD.分隔符不能嵌套的其他分隔符中. T( P" d: V4 n) x# `# C
E.用什么做分隔符都无所谓1 l1 ?+ O U* Q1 @
# n- C, x* }4 v7 ~) U. `7 s; m, W. g/ d9 I" O- n
9.考虑如下E-Mail:* }3 ^$ n/ _; Q5 j {
4 k3 T/ m6 O0 z! \. Z$ c8 ^ L
From: John Coggeshall <john@php.net>
' T% [6 V2 ^" {3 B* zTo: Joe User <joe@example.comt>
8 E$ N# P. |" [- M6 K2 d6 ASubject: Hello from John!2 t& T7 k/ a& R2 O0 \
Date: Wed, 20 Dec 2004 20:18:47 -0400
6 d3 y$ J2 w" G% `6 U- dMessage-ID: <1234@local.machine.example>9 T+ A& g, g8 f# x7 A2 T) m1 z( `
Hello, How are you?
6 g$ D+ ]3 B! E( p- D$ U5 N& Y* V
2 r" Q0 K# {! n5 B) R5 K$ r) [在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
( ^- o5 J' k% D8 w
6 R7 s) f5 `4 C6 o! ^2 |# jA.MIME-Version
- Q5 c" t2 }9 n. z/ `& B5 MB.Content-Disposition
0 b7 ~- y/ \- h" m9 [7 _* bC.Content-Type: p' E0 h# ^! R' ~- k3 a- I; @
D.Content-Transfer-Encoding) n5 j7 u9 a. ]9 J( D
E.Content-ID
0 _/ P) H$ U( g8 y" r( L
4 i% S- ]- k- Y
D% c h+ a* k& F& Y9 T1 P+ H10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
i) Z# v4 q& C! x5 F( j/ O u% V
+ M9 ^0 K4 |) b+ X5 [A.multipart/mixed7 X; C/ B3 j% B
B.multipart/alternative
! G6 S7 _" x! R8 d# x' |C.multipart/default
& o. ] G- q) @. w7 h! C" a, XD.multipart/related
* X; g% n. g8 F2 T: ME.不可能用content-type实现
; I6 v8 _6 @; q/ T" v' E1 e# N2 s- x: \. g! G6 \; l* M
2 t+ g' G+ w9 b0 p( p: U. L4 N
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?. y9 {* w% z1 F- n" L, D1 |
3 Z7 S+ ], z3 ~) U
A.安装sendmail服务器
" y! C% ^- {: d; _B.安装Microsoft Exchange
: U4 F3 b( @' K" _- {/ jC.在你的电脑上安装任何一种邮件服务器
( I# X) b9 v# g5 R$ `( t: mD.改变php.ini的设置
7 U9 k; B: v" h# u4 g& @E.写一个连接公共电子邮件服务器的脚本) ^8 v2 v- ]; T8 T
( \; X8 q0 V1 j0 g0 q9 g3 @$ |' a3 d9 i |( F) ~
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选): A0 q- O* ~$ {( o! P8 Z
& q( |6 T \/ S' U2 x( k, bA.使用GET方式传值
6 N K& L9 q- v& m8 E- IB.用htmlentities()处理电子邮件地址: O- ?1 ^' X9 B2 C
C.使用POST方式传值
4 {+ F6 N& Q1 e+ @1 y; RD.用htmlentities()处理邮件正文
' T+ i: l1 V# R, o7 O+ W8 cE.确保填写邮件地址的文本域不能有换行符( r" l: ?% q3 u
* J+ H# O m7 f+ N2 |
2 L( H5 @( [- }0 P6 h. n13.如何将一个数组作为附件发送,并要能在接收后重新组合?
( b' g. j, E* w, Y
: G# N5 N2 z! V. D4 j6 FA.用serialize()把它转换成字符串,再用htmlentities()处理一下
/ ~" M5 N1 }9 F6 {& }$ L/ c, YB.把它存在文件中,并用base64_encode()进行编码
5 R9 Y2 B1 _! T2 }C.用serialize()把它转换成数组
1 H9 P/ e7 B4 S0 O& p2 y0 V$ ?7 sD.用serialize()把它转换成数组,再用base64_encode()进行编码
x( H0 m7 B- I$ \9 I, ^1 OE.把它存在文件中,再用convert_uuencode()进行编码) C+ E% G+ f4 p8 n$ r
W) c! Y" T; M. q
8 _& C% x7 \6 d2 j7 x% {8 Y H
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?1 K1 E6 O- p. |1 B& O3 S
* d/ O* @1 F! |9 qA.堆一个检测脚本出来0 n, I" N+ t l' v- \' O& n. v
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
% O- \8 ?. p! V' e1 o1 V* WC.写一个识别文件MIME类型与内容是否相符的函数
& h2 C4 \( m9 w& r5 e& ED.使用mime_content_type函数
/ C9 T/ j' S2 b) P8 K( PE.把文件上传到外部服务器上* J) t& s. T: F5 j
* t8 Y. J" p a" R# f+ k D" @
+ R( f& h F5 k1 R15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选). H% R% P. W: C/ z* r3 e2 N# P
6 G1 L0 o2 p) t. _) @
A.添加一个From头信息
# y. C- O0 \1 OB.使用-f参数4 F9 w: O" B2 @0 j( R! O' K% E$ T- }
C.添加一个Reply-to的头信息$ Q1 o; U1 M v" y
D.确保运行Apache的用户有修改sendmail设置的权利! |# J( O/ K* \; L( h% R
E.确保Apache在root用户下运行
, r4 X6 A9 A4 s. }: T答案速查 @# O- H" Q% ^" E+ S
1:D0 f1 g$ ?. \9 b- M# [+ i
2:AD2 v% k# g3 G1 M9 N- V" }
3:E
) j9 x- { K) _) G6 L$ V4:Content-Type:MIME( }( |1 }6 u. c5 F
5:BC
; e# x1 a3 Y9 q$ L9 N6:A
5 g/ _4 p/ W' p$ P7:C! d9 `: F) B. v- h8 k
8:BCE
0 w: b4 Y- ]* p7 X9:ACD8 ^1 t9 G' z; ]% q
10:B' `: L! e% d. I* @8 G! \8 c
11:D4 Q Z6 w4 K! P- s
12:CE! N/ V: f2 P/ T& ~2 X& v* p* c/ q* O
13:D
6 x% c) i7 {) C( M q% ?8 b& u14:D1 b/ x: E0 _5 e) ]7 R
15:ABD
4 X9 Q6 A9 w$ o" G& z O) W2 }2 e
' ]1 [3 g. [5 I; i2 q- D* W" M! ^2 A
" ?' E9 ^+ |% _8 @( D) L
, E. Z8 y* u3 M3 K2 M答案详解
: h" J+ E" v9 S( G% U7 l6 N; u i- Z1 H5 ]- ]
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。1 Q( \/ Q: X5 p
# F+ h% I& 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程序自己来处理。
. l# T' ^6 c5 V# l, a
8 a8 o1 r# K# }; i0 ?* B3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
V+ f9 ^ s8 s ^
& }5 T( o9 O' a. x ^ C) `0 s$ K4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。1 u% W) H+ K5 Q/ S+ S- o
3 ]8 Y) |) c6 a; e6 u9 K# P5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
1 v$ e: R+ B7 \0 l/ R4 J) {5 v, o* J2 n& A6 y V4 C6 ?6 M
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
4 F' k- x! O8 g# p0 V6 _2 S$ Q7 p% i9 I# x: P
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。/ _% ~/ v5 W1 B g# Z, _
' a% l, ]4 @0 m# m( C$ B$ e9 N6 W8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
" a) E5 c1 |5 { ?6 z7 J2 O0 [& \: {' T! g) X( D6 `' I! E
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
4 ?' I5 s% p* P
! p# q2 F/ ~ W3 y% i10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。 B) E7 I; R( R% |, a
8 e- p6 U4 M. Z5 C
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。/ i# [' ^; C4 O5 N8 V
2 G, T8 m0 B# k- X5 s* }; c
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
9 r3 k7 }" p- @' o) G; g
& m2 q1 @0 P* C$ U5 |13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。# K. |' ?) t2 i0 w5 i
( l5 A ?2 Y! W" q4 D
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
7 H7 t, q4 e* S& H
; g. u; V0 J! ~* r7 }15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|