|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
/ w7 y0 L- y1 B! J3 s' i还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
( @/ E" G0 S. y2 \用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。5 e- E9 q7 p) F' \
2 M- g% x7 V; r+ e8 _( y" B9 F2 W. v: C0 D+ N! o0 [6 g% z
问题7 B3 a* @1 [% O7 o
7 O1 F# D' P h9 J7 s: v
1.以下哪个不是合法的电子邮件地址?
# b4 z8 P) f' ^& H/ t) s5 G6 a: g6 B/ _; g2 D
A.john@89w.org! i0 N, z5 C7 s4 i& s. m8 ~9 o
B."John Coggeshall" <someone@89w.org>- D' | A$ A( p0 ^1 O& g
C.joe @ 89w.org8 w8 n( b, M- q
D.jean-cóggeshall@89w.org) B, R' d" v/ l) H' u
E.john
; n) [6 F+ t$ t8 t. x9 f6 |# C/ }" ~* Y2 ~
$ \ p+ x' h6 _9 D1 n3 t1 Q; o
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
0 n2 G# K4 N- W" }' S7 D5 P
. h7 v8 X, E" Q* A6 T1 {+ LA.Windows/Novell不需要第三方软件的支持就能实现该功能
' ~1 j- ?2 }$ gB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
8 ~2 \+ P6 G0 [7 r2 bC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
3 p, c+ d" S- n& x3 i6 H' ID.有可能完全相同,这取决于sendmail_path的配置7 i' W/ s' Q2 m$ V% G
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口2 f4 F$ o- O7 x7 W
' Y; n' u3 @' a2 ^8 h# C0 e8 O; z& C6 b1 P2 x6 P" {' ^
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?% M% D: _" J( p+ \; `, q5 o" M
8 n; G6 r( z2 l [+ p1 SA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
# ^' u8 W) K8 s/ E% p3 D8 u6 @* AB.用PHP代码,通过SMTP直接与MTA连接。
$ m' h; P' ~& X1 B5 S O- L8 w: v% D3 `C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。8 L* p" R& e+ E
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。9 U! Z! y0 E m# w) J# O
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾' q6 _3 b8 J$ b' {) Y% E2 G1 o
" g r: B4 l# n+ `% a3 j% R ?& a6 D C/ l1 p6 v
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?! K) A+ z1 ]' q
- K2 h, I4 c, v答案:____________
0 ]7 Z8 d# F4 M1 P$ j/ D. z
( K: |& V" d, G5 c- J& s- s' P6 R. S. F6 q. E. _
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)- Q/ ]! } T8 N% W& m! a& b3 ?
, Z6 M) V; S! q2 c4 f: F' q* V
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示7 I0 `5 F" k5 ^. G- K! i! ?
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
0 Y8 i# O# w) W" T1 aC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
5 `! V. f, l6 dD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名& w4 i2 i) e: [" ~- o r' ?, m
E.只有一个答案正确
4 ]) W& S) P! {' `2 v5 h) b0 z" }8 i2 `+ M
: [9 S0 |% e8 D" o8 e
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?1 Y- S+ u, d' @) ~+ G5 i! @
, _0 r$ q) _, ^* M/ N+ Q: ]A.从UNIX或Windows/Novell发送邮件时都会用到
+ T: G' K' I/ S& J$ M( F9 b2 ZB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
A' S: f/ V: f) L- a2 ^C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时! k1 f( t3 @. T' Z
D.PHP里用不到这个参数
: B1 C6 q% a) }2 J. g% C) r
0 G( F+ `. G4 [8 [5 X( Y+ k/ S: D% K# f; H/ r* Z. ^! H3 C7 \- D: H
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?1 s7 p/ W4 v: |9 A% s! U
' i" E k4 m# Z5 ~A.只有在发送非普通文本(ASCII)数据时
7 t: s* f3 V8 c- X4 pB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)& J j: D3 Y" N O6 a+ H
C.任何时候都可以用它来指出MIME的编码类型
+ _0 ^) F: `3 z8 v9 `' k s5 iD.只能用来指定特殊的编码格式(例如base64)
4 B5 f% r' s, }+ @: v+ CE.以上都不对" q R& R+ e' c- C/ x4 F
2 M% B/ h. x3 e/ H8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
& a5 u. d" l% m
' w r% ?8 Q- q' L* @8 zA.分隔符至少要8个字符( L4 x( ?9 `9 v: `4 q; O' a
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)/ _$ r$ P+ E) A
C.分隔符在MIME邮件中必须是独一无二的0 Y$ T8 n+ p, Q3 O+ I
D.分隔符不能嵌套的其他分隔符中% J6 D& m; h# V5 y& W" a
E.用什么做分隔符都无所谓4 j z. z$ y6 ~8 n2 ]
; {" Q" D+ c5 v7 w% O- e2 e6 P
E4 z N$ w& p! T6 q6 O- w. G( {9.考虑如下E-Mail:: y" A r" g% I# k' _
; N/ a1 H, A3 v; l# o: E
From: John Coggeshall <john@php.net>
6 H) O- E$ H' H; N) pTo: Joe User <joe@example.comt>4 Q2 e6 z& O9 U8 r" \
Subject: Hello from John!
8 q. O7 y1 ~3 y3 iDate: Wed, 20 Dec 2004 20:18:47 -0400$ e4 [4 v7 l9 u4 g
Message-ID: <1234@local.machine.example>
; c: ~2 E+ D( n RHello, How are you?
% W! T$ ~7 ` x) W. w; W% ^& S. {5 T4 v0 ]
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
) g1 I9 _% Z& S* S) M
' T4 t- d# P8 o* t0 }% ^" h( N" ?A.MIME-Version0 t+ c5 k( ?! D1 x& W
B.Content-Disposition1 b" h3 s5 y* z; e
C.Content-Type# V& H! G$ M/ T5 X! L' j- @. H* e
D.Content-Transfer-Encoding
: w- F' ?8 \2 r/ w+ I6 K* KE.Content-ID
: `: U1 v4 U4 C* u; \8 O
9 [0 S$ b. c+ ?1 {! X% ~7 C& |: ]
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
; ?$ H$ K+ `. t' g) w
. V4 P8 s2 j6 \' i! X3 O9 I$ z1 k, XA.multipart/mixed
/ T+ z9 z2 K" I' Q- VB.multipart/alternative8 N( A) B8 n$ p' H& _
C.multipart/default
3 R7 {: M: m Z) O' j' T- eD.multipart/related: n% a& U* L, J% j, Z8 X) W
E.不可能用content-type实现
7 L( g5 ^6 l' |# x$ E
( ` Z$ J# Q3 U0 k1 k8 L$ }$ G% P( ~) v, B. \# x( b6 n7 g
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
0 N& @3 a% _9 h" l# U+ x6 o! K6 x* e0 l
A.安装sendmail服务器4 M+ d+ n8 Z9 [& A ?" k
B.安装Microsoft Exchange0 g* G- S3 H2 Y( h1 g
C.在你的电脑上安装任何一种邮件服务器' g* ]! j4 F9 G
D.改变php.ini的设置
! G5 }3 p& ^9 L3 f& ]+ r( v$ GE.写一个连接公共电子邮件服务器的脚本
) B" j, Y* I! Y6 \4 A7 z+ j/ }2 d3 m
% d% e" s" Z- Z! U$ f
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)* K- e& z. |# Q% K7 L& `; [) W
8 ]1 Q2 g" m& G# YA.使用GET方式传值
! S1 m$ y: d* ]. v% wB.用htmlentities()处理电子邮件地址- Y9 y! b% X: ]: q* l
C.使用POST方式传值0 ^$ q/ s+ S6 a% k; @5 B
D.用htmlentities()处理邮件正文$ \ ~3 ^8 @. n1 p6 L
E.确保填写邮件地址的文本域不能有换行符" Z6 o: M& n* a) H8 `5 I& }
. @0 l7 ^5 e4 O9 @7 N5 j$ p
. n3 H# O: R6 X13.如何将一个数组作为附件发送,并要能在接收后重新组合?2 l" p5 D7 Z' t1 R
7 s" d& E( `8 u% M: F, I
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
5 Q& P6 n+ e: j7 `: {4 L KB.把它存在文件中,并用base64_encode()进行编码% s+ Z% `3 I9 q a4 w4 e
C.用serialize()把它转换成数组
8 ] _3 U c5 [$ G/ t, YD.用serialize()把它转换成数组,再用base64_encode()进行编码) k' @( ~( g5 X: `8 l
E.把它存在文件中,再用convert_uuencode()进行编码# e4 W4 `% U: ~9 p. T9 F$ I4 m) |
2 Q: X" B7 q+ D) j% T4 d# r: E# I4 I( ?4 j7 u3 Y
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
4 H6 Y6 K# N) j& f2 Z' W5 X6 B+ P1 d" m0 ?) R. X0 O6 a- w
A.堆一个检测脚本出来
* ~% A1 N7 `5 H( SB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
# Z: s: S2 L: H3 Z" ~! pC.写一个识别文件MIME类型与内容是否相符的函数$ B8 K1 g* K% z6 ]: |6 |
D.使用mime_content_type函数' N. p1 ~! _8 n7 X
E.把文件上传到外部服务器上
; n* S9 i& f, \) X2 h1 | U# Q: F3 X& A; K [: s* J% f
$ @) P3 g8 N( c' N/ U* m
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)- R. [6 P3 T' Q4 u* l+ a
/ N- D. B3 G! ?$ e% E3 mA.添加一个From头信息4 S2 p# @1 A6 s: V
B.使用-f参数
! U+ A( T2 D5 jC.添加一个Reply-to的头信息0 @4 R7 g+ p0 ?) E; F& \7 u3 f% r3 ]8 G
D.确保运行Apache的用户有修改sendmail设置的权利
) P+ c u* ~7 |, T. f1 @5 c- }E.确保Apache在root用户下运行
F! t8 I% d$ f1 S7 `答案速查& X8 m; M; h3 _! a7 m# [
1:D
# E) o5 V% |, j+ A8 k2:AD, p" O& @) s; R! s) w
3:E& {8 h2 Q$ k) g( {) v+ x
4:Content-Type:MIME4 X5 h1 d% w* C7 F6 u# {7 w
5:BC
" Y5 I' H9 a" s2 U# [6:A
! v2 g- l9 i' a! m- s' D; [$ f7 k7:C' w6 k$ o2 f- W& g! Q- o2 L' W2 i
8:BCE
* Y3 K/ p, w; A/ Y( j! r1 O+ ]9:ACD
9 q; R% J T6 A# w# P* z10:B
$ e, a+ [' c/ N, ?11:D
) D! u: o* v- U2 u! N. ~# C' B1 t12:CE
( e$ w" c/ E: x+ b4 z/ b13:D
0 y2 I" F) X7 |7 x+ g( v14:D
: Z6 t, L7 z0 B! g/ S1 ]15:ABD
# t$ }" ^# P. J9 v* H5 l7 x* N/ x- v6 o7 E
) E @; L R* V& j) Z8 s2 a, f- o8 u! k0 s
答案详解- b' I7 Y& V: u
8 A+ z; @) W3 _/ w, h3 M
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
! K4 c- E3 ^: k& a) g2 k- _( A
6 e z; j j3 P! n6 G' ^2 i2 M2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。/ t9 M+ i. v b9 w
. O6 `7 q& P7 ]/ b( N3 d
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。3 S( M7 ]# S- ?7 H; a, |/ N' `% s" A
7 r$ m6 Q0 [/ T/ h) w4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
2 Z1 @3 ?7 g8 u* E
5 K. u: k, p- `5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
5 f- R1 A. x; C0 ]2 W( ?8 N/ y+ O; s8 N1 _- z, k
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
5 F4 G/ ^- t; w& v' m- M: v8 ^# e* \5 R" \
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。' T: [% H7 C4 h9 L! s3 G
6 d9 B4 X' H7 o- U) W) U* |
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
: M% X1 r5 Q& g# K, ]! Y
0 f2 I& P* G* T9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。2 P0 _ K8 @( E8 e& m0 |) R6 {
8 \, R, Z0 k N5 K10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
- f9 v c6 @3 O ~
q" ^9 u- g; B11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。' t" W1 K( D g# N, T3 I
' w" {6 Q X, @1 ^5 ^6 M1 \12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。$ S8 p# S! G: ~! J- s
9 c9 m, _0 D4 |4 \4 f- x. Z; ?13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。$ ]3 a8 F5 O! }8 h" q( {. k
1 `2 L" K" N y1 q6 b
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
+ r, N5 ^: y9 F# x7 W6 _3 h
; F4 }- s; ]0 d# |8 I15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|