标题:
[Zend权威认证试题讲解]第八章 - 处理电子邮件
[打印本页]
作者:
admin
时间:
2008-4-4 02:46
标题:
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
1 j' w3 Y+ f% |* ~. q
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
2 ?* U6 w! ^% Q0 E4 V. \7 ~% p
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
; f+ p, f7 ]5 ^* j$ p: `
) t! E% p: k4 u8 w* M5 o4 i
0 R& X! v0 E; h V' L
问题
s' R% E- U0 j2 j8 J. p1 @
9 C- ~ a7 T; M& v: g
1.以下哪个不是合法的电子邮件地址?
* {' J8 U# _9 i3 P; k# s. C' V; c! l
g% u% {6 S E; T1 ]0 I6 O
A.
john@89w.org
/ r6 d" x8 L5 U/ n; `7 Y1 r
B."John Coggeshall" <
someone@89w.org
>
3 w6 b2 b; F- m& s# w7 u& M
C.joe @ 89w.org
! k; W+ Y5 \# G) L# r
D.jean-cóggeshall@89w.org
, R3 h; z/ |% T2 E6 N
E.john
/ R( Y7 E- n8 J" h& }* P2 A2 w
# W9 o6 r; `, J7 `
+ S! s. \$ Z$ G4 U# o0 q: H/ H+ w# ~
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
3 O7 {7 H+ O9 U5 B
' G4 Y" ?8 x' \# T F+ t" n
A.Windows/Novell不需要第三方软件的支持就能实现该功能
/ y/ ]% _3 T" |8 v# b6 [7 f
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
) R1 _; N8 P/ N/ e
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
0 m# X: J6 J; u' p
D.有可能完全相同,这取决于sendmail_path的配置
! z1 P Q& z$ w2 C; D5 l
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
# {: e( s+ L8 B8 H `# x9 G
2 U5 O9 f& L0 v
2 Y, v6 }2 v" p0 ~, A& `
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
5 w5 ] T: J$ e" @ g u
/ A1 j$ j8 v" C0 S+ w' S# h
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
& Z. Y r4 _9 P+ R
B.用PHP代码,通过SMTP直接与MTA连接。
# o. `% V9 F3 }; S" t8 v. i4 u
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
6 q/ n3 _+ @4 u& k
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
7 ?# Z* c# ~$ o
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
( l' g; l" H& \: U8 [
+ Y: l8 x% ~9 z U' h, L# u
w; N) s3 y) I- g: E1 n2 k/ O
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
1 a, H# F o) G, O
" B4 ]# i5 |: w% s2 U" M7 L$ x1 y* S
答案:____________
) v* |0 j- x/ p
7 k2 F* `2 v \; K2 |
$ W$ h0 Z G4 m5 p* E3 v
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
. t$ p L" X7 Q. U; A2 a9 m. S& }
$ G& r( \' B+ Q: k9 R
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
s9 y8 n1 h! ?4 d+ b
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
. g; B6 j, m/ N- t# Y, p7 a" \. A
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
% o% u- v% A2 B3 f
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
" Q L; S% o7 B! ~& ]
E.只有一个答案正确
6 D& V( K4 q! S, v; T `, ~
' p+ }% V' Z3 D0 ]. V
, u- o0 G0 Z, _* X. ^
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
9 m) N2 U% I: z3 `
$ ]- p0 F+ @+ c1 W, t* g8 D$ o! Y3 q
A.从UNIX或Windows/Novell发送邮件时都会用到
9 b0 t6 E( i# B: E: e8 D
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
2 ?6 }- M& y2 r+ v" Z: d
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
8 R" {3 O$ c6 \- F9 t" h' P. S
D.PHP里用不到这个参数
6 r" m" q2 V+ `- z5 N
& h! t7 l8 Z J! A; f8 ~9 }1 j: \& M% u
4 S& m+ E! n% ]+ f: c9 E ^
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
2 Z" q5 q# ?9 L% v
- ^6 h; |8 j) b6 M1 C0 A6 D
A.只有在发送非普通文本(ASCII)数据时
" b4 i, T8 g8 a: ]: r1 W: y
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
4 Y+ q- C! U$ c5 V. m3 m8 l' q% _
C.任何时候都可以用它来指出MIME的编码类型
6 T: Y' P1 m0 u
D.只能用来指定特殊的编码格式(例如base64)
* p! l+ l4 `# l+ j& A( f* q
E.以上都不对
9 m; l$ f( Z" S6 @% g: _6 j
$ ^$ f& j; u4 L+ [% V
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
# @2 b5 F$ x, x' Y5 R
) f: i n j) K s; D
A.分隔符至少要8个字符
4 l% d/ ?) j/ l) H
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
% f& {6 l2 j- s; \( ~+ |- d
C.分隔符在MIME邮件中必须是独一无二的
/ }! t. O$ M C& e) N
D.分隔符不能嵌套的其他分隔符中
; Y7 z) L0 u0 @+ k6 O
E.用什么做分隔符都无所谓
$ c+ P. G+ T$ b
! |. b- F( q- w! F" e
1 [# R% i1 P( [1 t7 v0 N, v9 H4 J
9.考虑如下E-Mail:
4 p% e: `; Q9 v1 e5 Z0 r
' \; s. L Z( k7 B5 b* O
From: John Coggeshall <
john@php.net
>
& l3 q$ m; B2 L. _8 k
To: Joe User <
joe@example.comt
>
2 h( l1 p! P2 |! P5 D$ O
Subject: Hello from John!
: _7 Y8 W' K6 K! j
Date: Wed, 20 Dec 2004 20:18:47 -0400
! c) @, ? P' D& R! V7 X ?
Message-ID: <
1234@local.machine.example
>
$ Z7 A* l* ]. U W2 K. l' b( J
Hello, How are you?
' `/ i$ A. ]# q% y. ?1 `6 O
7 \: l- h. F1 w, K7 D9 {- \
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
- ~& H5 q* T* b$ U% v
$ [$ ~9 l4 H c$ J7 \) q9 H
A.MIME-Version
5 S7 r! O& l ?' n+ @( j
B.Content-Disposition
/ U$ ]1 w. F9 |6 M! F
C.Content-Type
; v- s1 j4 W6 ?* d" j3 E8 W8 n
D.Content-Transfer-Encoding
1 }" x( t% Z- ]! t
E.Content-ID
0 |& |$ ] [+ ?: A* g, P Y: q
. k1 Z5 [. X4 l2 v2 }) f. P! {
( Z5 @* U7 \$ s" H ~. @) g1 h5 w) X% `
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
8 M5 J% p9 J% d( r4 _
& E# a0 i+ U9 t5 d% @: B
A.multipart/mixed
# V; j* c7 }. t0 N
B.multipart/alternative
v$ O l& ~- R. [, F% Z" E
C.multipart/default
4 S. M4 `7 K5 L, v; k
D.multipart/related
" G# y3 A3 @/ k- c- m/ l+ n1 K
E.不可能用content-type实现
& Z; d( w6 U( n$ @
4 t3 C% F0 |8 v; W1 v4 w) J
& m" m: Z W: T- T* ]1 \
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
8 N# |$ I g) J
$ i# L( O1 K( x9 g9 y8 Y: j; T+ p
A.安装sendmail服务器
" g# W3 p4 E* c- `5 Z, c( \
B.安装Microsoft Exchange
6 K. S8 ~" v5 I" c. s
C.在你的电脑上安装任何一种邮件服务器
& L0 g1 R/ ?7 y$ y1 U
D.改变php.ini的设置
& M3 p# i- v4 E) F2 Y% x: i
E.写一个连接公共电子邮件服务器的脚本
' j4 f- Z) q+ Z m/ [; u
+ O9 o; h8 j1 M
" E1 R. o x3 Z# z3 Y# n
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
" ^, s! Z& f( k }. A3 Z* \
6 p3 U: k( c7 J( F. ?" F
A.使用GET方式传值
) I/ s" G9 g9 i- ]- G4 V; ]3 G
B.用htmlentities()处理电子邮件地址
6 s2 C) P" w: o3 y. |' K; [
C.使用POST方式传值
) \! [2 Q9 L/ i2 Y4 q* A
D.用htmlentities()处理邮件正文
5 \% @; I$ X6 y9 |# I! Y) ?' G
E.确保填写邮件地址的文本域不能有换行符
$ s: m1 D9 {) u% r' ]
. N w7 }" k: o* E6 _9 N4 C
" i' B+ W! k4 `+ T& [$ K1 ?4 I
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
, E) I9 D* {* W& q" G) ? ?' _* W
6 r6 U$ [7 `# Z# ?: c. D1 B
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
8 h+ F7 D$ R! ^3 I' `' G! m
B.把它存在文件中,并用base64_encode()进行编码
" J- ]% f9 [2 I, I8 e
C.用serialize()把它转换成数组
$ [+ o; N$ N* J" |' |* Q% H7 d
D.用serialize()把它转换成数组,再用base64_encode()进行编码
5 C4 W; z: s4 ]2 ?0 K
E.把它存在文件中,再用convert_uuencode()进行编码
2 b ?6 i) b% `& u% e- r; }. @9 c
7 U! U$ j6 F9 K# J. I+ z
/ N* [& Z, g) i3 c
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
; A* f4 f$ R2 S* w+ ?
- l; X/ `4 \( O6 o1 x; M; M- ?$ j
A.堆一个检测脚本出来
9 Q/ F& K# q" J6 [) q
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
& ?0 `2 u( O* y& F) X
C.写一个识别文件MIME类型与内容是否相符的函数
d5 J* m. ?" X4 G. d3 Z4 q
D.使用mime_content_type函数
& R9 k& `. U/ C3 O, N( e
E.把文件上传到外部服务器上
3 T" a l9 B$ _. e, h( e
, T. ~1 p% {' m# a( f+ g" v
% g0 M# S p& b/ {9 l7 q8 \' _& q- d% t
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
+ u b/ a- M! K _ H
* `$ r" c$ c1 w
A.添加一个From头信息
. h4 i' f& M7 O" ?4 s3 X5 o0 z
B.使用-f参数
9 w! B% S8 j0 D- X7 O
C.添加一个Reply-to的头信息
& h* P4 g6 u6 x8 t1 ~( |3 h/ I
D.确保运行Apache的用户有修改sendmail设置的权利
9 C1 G; G- T- |- E# m
E.确保Apache在root用户下运行
, Z6 l, `2 L- E4 R4 P$ ~+ z; z( |
答案速查
* K5 W" J: v4 c. d: w* \
1:D
3 h, y5 X- q) f
2:AD
3 R: E( J' { A; u! V( d$ R. e& k" Y
3:E
9 |4 T/ f a- C" n2 ]
4:Content-Type:MIME
" Z- Z& }7 e; V4 H7 y
5:BC
& T6 Q! s' j5 q0 p; I! M, B6 J
6:A
1 b( V' u. ^0 g' Y$ s
7:C
) E, C/ D& J2 Y" x
8:BCE
) |) s6 l$ B$ {9 j: c
9:ACD
/ @6 l7 W2 I }) J* m4 x& q. T
10:B
4 S- m/ H: w) B/ f) t2 F
11:D
+ I1 U+ g( d' n0 A
12:CE
" ^% s+ Q& M+ U2 n3 k
13:D
: G: R: V% S4 r6 k2 r( c
14:D
% b$ X, v( P/ v7 K+ l4 T
15:ABD
: l) w" @2 V8 _
" c( L% M' G) h( F- r) Y
/ z7 W- s# P. t% d7 @
: M4 ?7 T* z4 S( ?
答案详解
" d) e8 }" V/ ~# d, K
$ o# ?+ ]& m: i" t6 t
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
/ z. h- d8 @! h* m' a, f
0 J6 a0 R0 N3 u
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
0 z3 v; }+ M9 O* R
! m* D, S5 M7 n. [0 z
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
+ P/ ?9 S. u% A( R
^0 h9 C3 j3 V: c4 B' d: F
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
) ^" [! B1 K* e6 B3 @+ I' m F
! _9 H4 K; i% H* |
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
: V, G/ z% u/ i( {
& u1 a8 c2 y2 o/ D6 l& `: }
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
( X7 o4 A- E I0 q
' S9 n% F6 `/ T' Z4 M( b
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
; O4 o T: S' |) u/ [2 E) u
( G7 {$ |+ \, H1 ^& ?1 p6 w
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
& e. n5 ~3 O! g7 ]) i1 b2 W7 s# n
3 n6 F2 \5 B0 V+ e' A
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
B ?5 q9 e e$ o
" x: I, G% y/ P0 x' T
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
/ h' @3 M' g5 ]6 ?$ u/ A! `
! S6 W& ]$ x- I- N+ F3 F! H& x
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
5 r* K! y l$ C" m6 H3 U( m+ l. L
! Z$ A7 T k- d& [6 M" H
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
' F* F6 A+ [/ T
) K* W1 K/ e. K# q4 Q
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
) C5 N: \# R" l" H5 ~
% I; r2 J/ l' R a+ ~
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
6 x: d q* F6 Y8 f
% F7 e9 y5 m) A1 D6 X
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2