|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
D# w* J3 r9 @还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。5 E1 \) p* l p t: `
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
7 P; @8 w4 V* B2 h1 u o& a$ u# r0 O- z7 m% P! v! n
( z2 R* k/ c. o
问题3 F, Q5 v) J5 r, H0 S1 h- T
& I2 ?) L' G# h% Z5 m1.以下哪个不是合法的电子邮件地址?
$ l2 q7 B, Q+ D% M2 J Y1 F
5 x4 J# z' e2 ~( G" lA.john@89w.org
7 q8 w) [) V p3 F0 X2 s, p: bB."John Coggeshall" <someone@89w.org>0 O, t% F+ f$ Z
C.joe @ 89w.org
+ V1 R' g% O5 s6 m8 B% KD.jean-cóggeshall@89w.org
6 I- G, Q7 M2 R5 NE.john
! r, {0 T8 v8 p7 v% \- u. S, x; g1 E
; L1 _! V* @6 K6 n0 b& B! @
8 K1 v5 ]$ \# L* y0 i: `/ Z2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)" i/ z+ J, } _( X
O$ k$ Z& r/ u. M4 S) r8 ~/ j
A.Windows/Novell不需要第三方软件的支持就能实现该功能
. M0 ~: Y+ f+ F% |B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。1 D, w, c' u+ B$ F
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
/ t6 d, y6 E# i8 n7 BD.有可能完全相同,这取决于sendmail_path的配置+ G- M/ C5 _1 O0 _ i& [" K4 H
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口: K+ E# D1 ]9 U6 X, b7 p" A4 ^
5 c6 L) b* M* T
8 [) X4 q+ R/ x% n" s! K3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
2 z- F8 Z+ H4 }" \4 c4 R+ R
; k( Y* z/ i2 P; ]' U |7 N9 BA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数* p" h5 J8 `/ v; f* F& f' d
B.用PHP代码,通过SMTP直接与MTA连接。
6 e# |+ x1 I, |4 q' m( BC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
) x+ V; x3 Q$ Q5 ]# nD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。, |" G: D: I) a8 m' } a/ W
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
9 |& S# |0 Q+ m, W' l# R0 V f# u: u" r+ |
- s6 S8 O+ b* `7 J3 _0 p, p. e) q5 Q( Y P
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?8 q: l0 W# O# G4 c6 f
3 c8 u2 {0 M4 _5 ]4 A: H, P G6 S7 D
答案:____________/ L: R7 c1 d( o$ k7 T3 w
6 I: \% N- B4 C8 e G+ m
& s6 v$ d* x2 @# @2 I' ^1 O5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选) W$ U) b8 K* U
* }; a+ S6 D, p2 P/ m" U1 F8 A
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示* w, v8 g; Q5 \" e# v
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片) Q- B( i2 V% A7 [' A6 P; Z
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
7 B: g2 ^8 e5 }) [: lD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
) x$ |0 |% H8 m+ L! vE.只有一个答案正确9 K7 ^$ g; F( p% Q9 n" j z
: h& @ }. x% n+ N
+ h; ?. Q$ |. f9 r9 X. m6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?, G/ ^0 {( n/ Q
: R8 t2 D4 o6 [) G- U
A.从UNIX或Windows/Novell发送邮件时都会用到
+ o, O k6 S* b: Y$ r9 T3 i% AB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
2 D ~) Z4 d; R( k' T) D+ mC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
5 P7 [3 |& q% T. mD.PHP里用不到这个参数( k% X1 W; \3 v2 }* g
q5 Y% H- T8 C. [/ h! @
& l m' L6 E! O* h+ l( B: u7 `$ j9 r
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
' f7 `- L: N. I* P4 g% n) V& f- B9 U, i `$ R1 `& r
A.只有在发送非普通文本(ASCII)数据时* Q, O! C) R( \0 A. f
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)- l, N& E" }6 L p6 k3 R( D
C.任何时候都可以用它来指出MIME的编码类型% H% Q9 [- q) z w8 n" x8 Y& }
D.只能用来指定特殊的编码格式(例如base64). E$ F1 w+ S$ j2 O9 l0 Q. K
E.以上都不对$ K7 C9 z, l% r' ~! N4 N% `5 R5 |3 O
: V% m8 x! E+ v" O% X$ f
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
4 O5 v# d" `8 ?2 x: |9 x7 f8 U0 _: O; n7 D
A.分隔符至少要8个字符& q" A" K' m( m! N2 [$ j+ n0 {
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)5 Q: u* \8 M q% g! _ h
C.分隔符在MIME邮件中必须是独一无二的
, T& C# \# e3 N1 ^/ HD.分隔符不能嵌套的其他分隔符中
0 _: K; w8 g) FE.用什么做分隔符都无所谓
/ j9 r$ O( l `/ W3 R( h, B \$ e. {# |2 r, Y/ M# U
) A' K9 ], l& i' n/ O: v0 @9.考虑如下E-Mail:
. y6 o( u) b& ?/ }
5 v# `- M# Y# x( }& G ^! TFrom: John Coggeshall <john@php.net>: l! O1 {2 d/ t: g T2 E: d! C. g
To: Joe User <joe@example.comt>5 a# S3 q1 E1 R7 J2 t
Subject: Hello from John!8 o" n( a+ r' s$ ^8 S7 P
Date: Wed, 20 Dec 2004 20:18:47 -0400
7 u. P. w4 j6 wMessage-ID: <1234@local.machine.example>
w1 d! I7 @; @) X2 Y& IHello, How are you?
* e4 ?4 @' _8 Y$ E! R
1 V4 F7 V/ l8 }3 H; Z5 L在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
; t% }& V% O# N3 {: w# Q8 o/ Z- ^# R; j, {6 @" Z* M
A.MIME-Version1 d1 G* E, z; E' {8 j7 t0 m
B.Content-Disposition
9 @# {0 u- } G( BC.Content-Type
* y* n V& d$ y0 |D.Content-Transfer-Encoding
) }" u" |; O) ~* aE.Content-ID9 w7 \. Y) |9 A9 G6 W9 ?
2 e7 n. B. t- t/ t3 @& [" h" x) A s! e W( ^1 Y. L0 M
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?7 d Y, ]$ w; [" j; p
. Q) F/ `' h% c3 GA.multipart/mixed( \8 f% ~( ~& K+ P/ M+ {
B.multipart/alternative
" C$ x( @9 J- z, p) h- wC.multipart/default
1 z: {( t, C! L& ^# J+ F- m* f! q2 hD.multipart/related# k6 m* q0 V- H6 _
E.不可能用content-type实现& F F! Z& d; o9 J5 S
0 Y& S+ u% f1 m& B/ k P5 H; X. V0 q5 @
8 _6 m- \/ s* A7 ]
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
i# X% l; z/ M- i: {( F4 @% _7 w, ?1 s8 C# F; I$ a- {# ~
A.安装sendmail服务器, A' h- V# S0 X* ?- b- y
B.安装Microsoft Exchange# ^9 b5 M, d( ]7 H2 |6 b
C.在你的电脑上安装任何一种邮件服务器3 T# W' t# p2 V5 }. [
D.改变php.ini的设置
+ r* l* T* W1 Z, nE.写一个连接公共电子邮件服务器的脚本
: q! [6 M& z' C8 K3 }- C+ ~/ B! X$ w2 s5 R: j' g8 ^! x
% F8 l. a* e. P! ?. E9 X12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)4 ~: d P4 m5 d1 X8 [& H
3 c. g: }& _* I
A.使用GET方式传值
5 K- m; f5 k7 Z; `B.用htmlentities()处理电子邮件地址
& y9 r+ ?7 V ~C.使用POST方式传值
) m# v9 i. \; M* ?4 J1 ZD.用htmlentities()处理邮件正文
8 y0 V+ L; }# E4 K: ^! Z. G& SE.确保填写邮件地址的文本域不能有换行符9 A* j1 g2 o4 T9 O: m2 q) p- i
3 R5 {1 X1 w. E8 ]# e5 h5 Y* K. D1 A
' I& G5 B/ _; R) v13.如何将一个数组作为附件发送,并要能在接收后重新组合?
- C7 Q6 i* t/ J; l" }: |) s8 P- I3 Q9 S# y P! `
A.用serialize()把它转换成字符串,再用htmlentities()处理一下* f4 H. f S$ Z- A
B.把它存在文件中,并用base64_encode()进行编码
9 F' R9 m8 L! iC.用serialize()把它转换成数组
: h. J0 D4 r3 O. c7 n, S3 v! iD.用serialize()把它转换成数组,再用base64_encode()进行编码$ v7 Z& `6 ]( U: k% V9 p! ?
E.把它存在文件中,再用convert_uuencode()进行编码6 T) o" V6 x9 n2 L S6 I. a
, O, M/ ]: I# R
% J& F6 P) n$ i* D: j( g
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
( d" E4 K j5 y" ` s4 y; u; X8 |! |- \
A.堆一个检测脚本出来3 U/ z5 o/ s2 x0 l9 ^% Q
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
" |1 @' d: d5 b) H, |C.写一个识别文件MIME类型与内容是否相符的函数; K* V# n! s) `
D.使用mime_content_type函数3 D9 K% j5 I U8 p2 @7 Y) K& C* D% R
E.把文件上传到外部服务器上% g/ g* L6 \- D
# K6 z, G! |; F) e* F) y4 i# Q3 [& x( i6 p: n& h
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
; m& ~2 M. Z: i6 w/ a; Z
3 V$ T5 J& m+ G/ i8 b4 [& YA.添加一个From头信息# }* ~: t5 r5 m/ o
B.使用-f参数
' `4 A h; _, B1 EC.添加一个Reply-to的头信息3 P, y. G# f( |+ b" _% l
D.确保运行Apache的用户有修改sendmail设置的权利: Y$ h W }% j5 j
E.确保Apache在root用户下运行5 v$ [! Q3 d6 V3 K3 a$ Z( ^ G \
答案速查$ u- Y* ~2 ?+ a
1:D
1 ?. r4 \( @8 y+ @' M2:AD
7 b, L) N, I( o3:E9 p0 X& y( u: t
4:Content-Type:MIME
) d. k7 Y) t: s: T5:BC" { Y$ w8 t* _' b* W d
6:A" M, O3 p6 S4 }8 `
7:C
; @" D! \# w; }/ f) H8:BCE
S6 r1 {! C" h* Q9:ACD/ ]& T8 a4 ?( ^) S5 t! _
10:B, J& {- n' g# X$ W9 Q0 h, Z
11:D
* r0 y# Q* k2 d3 P* b$ y12:CE
; Q; H' l; K- z) K I( X( \13:D# {7 O+ B0 p1 Q" U6 h
14:D
1 Y) F1 n+ L: y15:ABD9 v8 p8 @& z8 c8 z: ?2 S9 n% @
8 r( d8 U/ o) ]/ P! u
' X. x8 I8 x) `, N
+ U+ M X8 M* I$ B/ J
答案详解
' Z3 A6 }, L6 w# L4 f! ]
' T& G. c1 `$ a- A1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。! p7 G. w' c4 p: E1 c% G
4 I7 q% I+ O) l
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
) I& @. j8 j. c$ U
& O4 ^6 N4 G3 Z3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
& d* m$ D+ h2 [5 f# P: C
1 S) A( _# D# O) |, @) g/ j4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
5 P, W1 |1 c2 O" L
) O* [5 K, Z; a# \3 @5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
8 `; P$ m' e6 U
7 L( @$ V5 c. y0 p( X& H6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
4 Y1 ^& L% j! k8 } `0 A6 [: {
( m! {% K2 ?" h2 Z7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
9 L0 N" o0 q" ^, y4 f1 s4 V- C/ E$ Z1 L) m9 x: _' u
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。; D. q2 [& j- o" h' E4 p4 M
2 h- n& u, k* c; h$ D V. a6 A9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。% o, D. o7 a* U+ A9 x& u
( P9 y$ D0 @& c+ G+ B( p10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。5 A# l" T1 K! {- O5 E: [
; C% ?" F$ G; A; g* c1 Y
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
& @5 p8 @4 L, D6 \% ?# I
* R" \/ k" w, p ]1 g+ B( s3 C- S12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。1 \% N5 [7 k+ U! Z
6 Y" h+ f/ |2 P$ C% e
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。% A# M0 \( U+ T' r$ I# ^9 w
) U+ I! _5 Q1 Y4 H+ |
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。6 ?3 a% C% a8 C2 ^7 v) m( Z5 w
- }, M: J0 r. m7 s0 K$ G+ E
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|