  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
* g) @" S( a5 Z9 w; g还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
& F4 p3 R9 ]6 P0 Q+ e+ m) T6 E用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
4 k/ D5 G- G# G" p! E9 H; w! @8 j }( s5 K2 o: R) ?3 n
9 P% Q' L% y3 g1 |# L' G. W% h
问题" M3 R, T+ [: X: G
0 O( r& H9 N$ v, |; M; I! Z1.以下哪个不是合法的电子邮件地址?7 g2 X) N1 Q1 d& t ~
/ ]) P l4 |( |9 L. }) M9 LA.john@89w.org# U% J- a; M2 U2 t d. }
B."John Coggeshall" <someone@89w.org>
- p7 H3 G- x( MC.joe @ 89w.org
0 f; a c/ w* g5 @9 u, U; cD.jean-cóggeshall@89w.org: @; ^( A, r' y( x+ j, @
E.john
5 s* a0 d. i% S7 V3 h# h+ p. f; c3 w F# E& Y: o3 n
o* I5 v! t# Y
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)4 @9 o! I& f! E1 R, G: \/ S {
' V6 ~. b$ W' c
A.Windows/Novell不需要第三方软件的支持就能实现该功能
/ |. l( }$ v* Z6 U: g" t/ DB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
4 A' n+ o! Y/ I! ~C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送7 l- h& s' E" e" b' w
D.有可能完全相同,这取决于sendmail_path的配置$ ] R% [" j: r& q
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口5 g7 |) k' m, {* H0 U$ Z4 o
2 M6 O' m+ X' q: W( }' `$ ]2 w& _% ]8 ]2 H; _
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?, @; q. L1 R6 [! g- p
9 [: M p" g3 h- k6 F
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
0 c8 T( I7 H, b% ~# F DB.用PHP代码,通过SMTP直接与MTA连接。
6 ^+ }0 R& _3 r8 W: @C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
# p( N/ ~* i, r4 ?9 nD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
+ T' u$ [6 X4 L9 j8 \5 uE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
5 A. K1 f+ M# f/ h8 C+ o5 K
# d1 K& {4 X5 q1 U: p2 S2 S! c0 @
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
5 s* {1 I6 {3 Y! J2 J, _& N: z$ X: N
答案:____________# h/ x+ _) \3 g4 \7 W
& t, Z3 z* n4 h
8 g2 I; b1 U6 H: G% v9 g O5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
- o! v, Q6 V- N) c! I0 X* _6 }6 c v( j8 L2 J% c0 \
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
9 T( V: K- Q0 FB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片# G6 |; V A) K
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
& x/ N$ N) I: d7 k/ f& SD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名% ^1 d/ E( E; F7 e8 t5 o1 d! ^
E.只有一个答案正确4 J2 d+ h2 r' i: a7 S
/ P2 u$ B* u* P B- y8 C' L
6 {' U3 H1 t/ F U$ t4 C ~+ b" ]
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
$ q3 Y5 B1 N1 |( v, i9 i
4 d c9 t. F" b6 f9 H uA.从UNIX或Windows/Novell发送邮件时都会用到
2 ?/ C" E/ A8 z: {; r9 zB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时2 p6 Z; X# N, D5 d9 G
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时& T/ f f. E3 @6 O8 Z0 X
D.PHP里用不到这个参数- F+ u: Z# S" i) S' q5 U& r
1 n# X; K- M$ ^
) W2 z+ k) R* B$ e& G5 I4 o7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?3 K- o0 b5 w. q" |# [9 ~5 _
6 y8 u3 m: H# r1 ^5 x7 F# p
A.只有在发送非普通文本(ASCII)数据时
' [9 y6 S6 O4 d! y! g* mB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
8 I, }9 g& x$ z6 R/ YC.任何时候都可以用它来指出MIME的编码类型
j: c/ a- f) t; h1 H0 t- FD.只能用来指定特殊的编码格式(例如base64)
* Q7 h9 X. [2 V+ H8 hE.以上都不对- L$ u- _8 T7 v0 Q1 _" g& `& }$ {8 R
$ Q7 d+ T5 S$ G9 e* s" a8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
' R) W' K; E, J3 N7 E: C8 f" N& @& f& l* _
A.分隔符至少要8个字符3 b) ^8 T3 u$ H/ v6 g
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--) R& u" U! m# H) ~& S
C.分隔符在MIME邮件中必须是独一无二的* p3 L: Q6 H! x$ S8 f
D.分隔符不能嵌套的其他分隔符中
1 ^2 Z( B2 t2 }5 C* k3 |* k1 }# iE.用什么做分隔符都无所谓& j, d% @* Z+ q7 Z9 ]" v
7 Y2 Q9 c7 C( Y! \
8 q6 \4 `" o* M. V9.考虑如下E-Mail:
' x- l, M K. x4 }8 ~ q- ?0 @' R; I
# A& k" S; W$ V1 ~8 o' G8 R5 NFrom: John Coggeshall <john@php.net>
: U2 l3 X- b( \/ B( HTo: Joe User <joe@example.comt>% b& S. f5 G9 n* ?! {
Subject: Hello from John!
0 t" l5 w3 ^, X* f* T' ~Date: Wed, 20 Dec 2004 20:18:47 -0400
( f5 b. L$ O# m8 \Message-ID: <1234@local.machine.example>- j- i2 i R/ T/ S+ c
Hello, How are you?/ }, r: H& L# T1 d0 H
0 r6 l7 \, |) d4 E在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
: _- a. C! k6 m$ S7 l
7 w8 H2 V+ X8 iA.MIME-Version
, q/ o# e! M" E5 V( M$ GB.Content-Disposition
# V$ _9 e, [. q$ xC.Content-Type
( Q" h: @7 }, O9 ^" YD.Content-Transfer-Encoding
7 n# v2 T- d* }9 \E.Content-ID$ W- x2 X/ `( G
6 s4 i- ~5 q% t" D; Y
+ |: j; i; U- m) g$ N- D* W
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
8 j- R. Y' O- x; m0 h
) h( ^4 u; ]* U: w0 q5 R4 X8 EA.multipart/mixed$ t6 E. \9 X9 x; _
B.multipart/alternative+ L+ S- S5 X0 E- x1 J1 Y
C.multipart/default. g: }- x, z* x* t
D.multipart/related
0 f3 b# Q$ d# i, @' D4 v2 U+ f4 [$ l sE.不可能用content-type实现
1 L6 d0 p# Y5 i* ?1 R( b0 a; @& z
7 A/ \, j- \$ r( e0 R
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
$ z) @, J* P6 l! N E9 ?( D
) H) F ], b6 `" eA.安装sendmail服务器
* C: n6 ~8 x0 g" o9 {; bB.安装Microsoft Exchange; e# Q7 q( w1 \
C.在你的电脑上安装任何一种邮件服务器0 N$ E" N& r# m9 f
D.改变php.ini的设置- Z( E) D: d2 ~! Q4 ?" M
E.写一个连接公共电子邮件服务器的脚本. p3 K( V$ e1 v5 h/ |6 \! l
, b; N' F% p% D! z% L7 F! h# _, ]5 P8 w
9 E+ e/ k3 {* m- _/ E* p
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)$ R- T- K: _0 y- g+ {9 M
; { I& x4 J( R$ ~ }; u5 Z- U
A.使用GET方式传值' e% ?, f: J: s/ {; i: ]: n0 B
B.用htmlentities()处理电子邮件地址
9 n, j$ r% @, _# H+ \' sC.使用POST方式传值9 {0 s' |* K5 Z0 n1 b9 ]9 b
D.用htmlentities()处理邮件正文& ^2 Y0 k" |4 i& u# m
E.确保填写邮件地址的文本域不能有换行符
3 V w( F! O5 q0 n9 \* C5 Z0 k$ Q4 K' I$ k9 P2 D* X
% Q ?. `1 y' p7 y7 W: H2 i13.如何将一个数组作为附件发送,并要能在接收后重新组合?% M, D, Y- I- l ?5 n- ? q6 a
5 n! f+ C- ]/ I& _
A.用serialize()把它转换成字符串,再用htmlentities()处理一下3 O8 A3 R9 q2 Z4 N
B.把它存在文件中,并用base64_encode()进行编码$ C) x( T3 m1 C# q& [" p+ Y- w+ q4 R
C.用serialize()把它转换成数组) V0 k% M2 V" ]8 R: D
D.用serialize()把它转换成数组,再用base64_encode()进行编码
* k: o/ H! `- d# E- w: Q6 \( eE.把它存在文件中,再用convert_uuencode()进行编码4 Y* H( Y* i8 q6 H
% l6 _3 @9 f, p$ U: A' P! \) F/ F0 F) J9 @
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
* L. |" j; J: m/ J1 b) ]7 a. _3 y/ i( r+ T3 x; u4 V M/ x5 e. z
A.堆一个检测脚本出来6 s9 @/ h6 |2 N% k$ q' W d
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型0 ?' @* x/ @0 h0 j
C.写一个识别文件MIME类型与内容是否相符的函数( ~% e' V% p7 w4 T$ q# u
D.使用mime_content_type函数# q$ c5 N8 y8 ~6 g/ D5 Y
E.把文件上传到外部服务器上
& o4 _7 L5 S, C. G% I3 x: M5 d1 b, g, X- |' O) D6 W: c
! J8 V8 {, I; h) r15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选); q- o' T* [3 f& W; r, q: Y3 Z
$ g2 Z3 H5 `( N- R
A.添加一个From头信息
* X% B, J6 {0 Y) O: JB.使用-f参数
) z& \* f( b; s7 q3 kC.添加一个Reply-to的头信息
# ~ {5 G8 d" O2 U& Y3 |+ WD.确保运行Apache的用户有修改sendmail设置的权利/ ^5 k6 _) g* {8 f0 G/ U+ b
E.确保Apache在root用户下运行3 a- ~; ?( w* J5 D8 P- b
答案速查9 P& F3 l/ c8 O& R8 \# B+ m
1:D
4 t6 T+ l# N7 z3 D$ E8 N2:AD
) g. {& F. F5 }7 J- r! @- ]+ a* _3:E
% g' c ^" ^: P% B6 h4:Content-Type:MIME
4 S+ F9 N. o0 Z9 K, D5:BC$ ^5 \* O& x2 X; G4 n$ H) R
6:A
- M9 i2 s, r9 P+ ^ W7:C* J! U5 _4 f) E/ g3 C( V
8:BCE) {0 [' C2 J" Y0 R' P5 ~6 G3 s z
9:ACD
- ^+ I" ^& _2 @7 M2 [! v, |10:B
+ T5 F1 Z$ u) ~5 Q2 g11:D
@& X' Z$ V2 y% P12:CE
% d- A$ j- U1 F5 l13:D
! p$ v. v( |& B# c" M" r. _14:D
& \+ W9 e8 ^' Q# M* g15:ABD
0 c) w J B7 L$ p" ~
, ~; w% p7 x* I
, A) ] P1 M3 y6 X* P Y9 X" x
4 y8 J q4 n3 Z t答案详解
9 D0 T4 B1 V2 J) A* y3 `, V$ r& A: ^4 G$ C( D0 f
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。- w6 E/ |* q9 A0 d, i! [* {0 q" v
0 Y0 [( h, h; ~; T# W# }
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 c3 D% R9 s' C0 d2 k
# {+ e# Q6 @+ i3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
& ?2 s5 s. N7 \3 R# `& J% m9 P& D. g2 e4 Y: F$ z
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。. t5 {9 ]- j: |, H# T
/ k, q W0 y! [/ E U4 K5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。# q d! R) z- ?, R2 h/ {
% ]8 k6 S) E3 @
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
6 O) Y' [: Y% X3 Q9 I0 _0 f# @% v F7 o L
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。% X" [5 C1 T' s, N T
) ?8 H8 @2 d" P8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。- h$ D( K' u; y4 A% [
) s) u7 ` b+ Z& P' p9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。: O; _" F% J5 [" i; L
! `& e9 D" `) z
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。+ a' | }* D e; A# j. [
# F6 I0 ]1 I0 M; z; {8 A" Q- F11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
8 b6 L% J6 }5 H# V: w4 C8 C
1 u3 c# b* C0 r1 n: y( y B12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
- E) z8 k n6 X7 [5 r* o0 W6 T. w! b' u' \# b- T9 }% `$ c9 E% u% r
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。$ f' o/ L5 ]. J* s& A" S
) V0 b9 \% \4 ^, Y& C14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。8 ~9 B7 r- C5 U( U
# h: P9 q) x* K/ u. F
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|