标题:
[Zend权威认证试题讲解]第八章 - 处理电子邮件
[打印本页]
作者:
admin
时间:
2008-4-4 02:46
标题:
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
0 A! \0 y7 S; Q1 z
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
8 i2 }& L$ d. y" x* K/ D4 Y
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
/ U' L7 C) D! x( v3 ?
9 G5 _! R3 M4 a
$ s% z& i( Z6 u) y
问题
+ }; z3 }( t) L2 m
; e' F( z1 P' h$ O% h
1.以下哪个不是合法的电子邮件地址?
+ x- H/ L' ^6 @4 W) K
. K' f8 H* Z% p2 J5 e+ W% C( e1 R+ X
A.
john@89w.org
, K. ^* _; y1 Z4 |0 q4 E$ H
B."John Coggeshall" <
someone@89w.org
>
: u5 s. i. Y$ r' U& V: Q
C.joe @ 89w.org
" ], J# H' I: L2 P/ U: G" g! ^
D.jean-cóggeshall@89w.org
- x- k* C. q% Q0 |3 x- U
E.john
2 G* a- F- O$ r( |) S" L8 k/ S. K
4 g& B- u, n3 A9 f; J
- ^9 {' ?; r# M( \, n: z3 O4 W
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
$ e6 k; @1 ?% ]: v9 e
/ X1 n2 Z; U! h# _ j
A.Windows/Novell不需要第三方软件的支持就能实现该功能
; {( c0 D% F; D5 S( f
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
+ X& ^ L0 B2 }5 N3 h$ a* P k6 n# B+ ?" o
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
% W9 l9 w- l6 ?- F, W3 E8 Y
D.有可能完全相同,这取决于sendmail_path的配置
: B2 f% r! F1 `7 g7 s
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
3 @3 H& n% C1 y- s: q B+ u
% m1 M/ X8 E- M, `4 H6 F5 Y/ g
+ y' {" ]! }7 ]; o) G# T1 s
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
; q, n6 @9 o# ?
: J7 z; s6 S# A( A, g) F' X
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
" G3 L3 x/ \4 [6 W& F8 c
B.用PHP代码,通过SMTP直接与MTA连接。
) _# D0 i% ?- c2 W: G
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
9 q7 j/ f% |: {- ^$ H
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
$ s4 o$ C! k% c4 T
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
- R( ?, ^& j- I M3 c# U
, `( G+ n% W- Z- g7 Q( E3 O
+ E/ _7 e5 X2 C( `; [; I" E. l, ~
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
0 [! [3 @( l* }: ^9 ~$ ^
4 r4 c, M- n c: A4 o
答案:____________
; ~$ L6 e0 f$ C
5 @$ |( f; d8 f6 f: `+ g8 j8 M" y3 [. J
1 o5 @4 y2 X/ |
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
0 |1 X" B; Z# T8 d0 ~- B/ F
1 D% H9 U1 F+ f# [) b$ D( B
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
2 c0 N4 G: S; P7 a; _
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
* g A6 k6 ^" X* @ {( u; R2 i1 `
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
$ R. \7 R) S/ ^. x* F! v! Z( Z& X
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
4 n* y/ `* D0 ~, \: I- y
E.只有一个答案正确
' X% [. ^$ [ u9 A2 N2 P
# ?. n1 ]( Q, a; L9 N3 U
; G3 S' T0 A: O6 Z% y, p
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
6 G4 ~( |" D3 }* P0 u8 X+ A
1 g# o$ j) A% o1 D5 {
A.从UNIX或Windows/Novell发送邮件时都会用到
; r+ F0 g$ F' t% x; e n1 i, j4 i
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
3 s, O: X1 H; v
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
4 t# @# _8 h, l# h8 T
D.PHP里用不到这个参数
' R( J5 }/ _- ]) ~& N0 S o
7 C; F, u' G6 I
& C1 o* l8 w0 K; G# O: F4 J
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
- a5 Q! N8 ^3 V8 k: V
9 F6 r5 s. I3 m( g
A.只有在发送非普通文本(ASCII)数据时
7 P! v! H0 r; D, f2 Y
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
5 F& A# h- ~: |8 w: ?
C.任何时候都可以用它来指出MIME的编码类型
7 e7 z; j7 v2 l: f: Y9 B, q- @+ q
D.只能用来指定特殊的编码格式(例如base64)
- x* f( f! H1 N- q4 h
E.以上都不对
% w/ m( m L1 z" E
3 t( y; \3 ]! o/ K+ L
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
3 l E' y4 E5 l4 f \" P
- V' P* L9 e1 S! B, u2 f% ^* ^
A.分隔符至少要8个字符
: J+ X' d+ R$ Y7 k. H- q8 b
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
% {' c! ]4 M5 {6 L% q
C.分隔符在MIME邮件中必须是独一无二的
% I7 g* e+ I0 L" N: {; ^9 D* @6 B
D.分隔符不能嵌套的其他分隔符中
7 W. A0 g C) U; `8 k7 r
E.用什么做分隔符都无所谓
2 q0 K4 E( O+ i- ]+ e# M
8 N5 K, h, @6 f& ?( z
' _/ K& X% P* V) N
9.考虑如下E-Mail:
5 }8 m I/ a2 P5 q* S* E
6 W7 w9 e, I$ f" ~. ~+ D
From: John Coggeshall <
john@php.net
>
/ f0 l h: Q5 N9 M$ ~) D# ~2 a
To: Joe User <
joe@example.comt
>
1 q' d' d# w# J: _& n
Subject: Hello from John!
" q1 M4 \1 v! z$ A& [7 Z
Date: Wed, 20 Dec 2004 20:18:47 -0400
; b1 e( w9 {: W; K$ B
Message-ID: <
1234@local.machine.example
>
. E. s5 J* T& C- F7 ^
Hello, How are you?
8 C$ ~, h2 v. y4 t/ V
0 R1 a3 o- ^5 Z$ C( e/ x9 m2 T
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
6 r1 H4 }& F5 o3 }2 q# R( P
& Q6 [/ f$ Q9 O4 ^5 |
A.MIME-Version
. ~+ d3 ^4 B/ ]1 N" `6 G( ]
B.Content-Disposition
- a8 Z4 k; P( r! l& I
C.Content-Type
3 |: W+ g4 @5 l# B
D.Content-Transfer-Encoding
4 U$ B+ \2 b2 W& Z2 h2 a3 s
E.Content-ID
0 a( e+ b9 D8 T5 K$ d: U
) M( g* s3 \& j( n& n, b$ V* }% g
+ n; g! V. j) o- g0 k
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
$ t1 z4 @0 t a. Z: J; Y
5 H7 U, U; N; K3 P' m$ P0 t( b
A.multipart/mixed
7 D% T7 R8 f3 h6 K. n- a
B.multipart/alternative
: l6 v u$ b' z' ?. T/ Q; Z! L
C.multipart/default
* e. I- Y4 Y* s3 O7 {: T1 T
D.multipart/related
4 g4 p/ T6 u+ e" @; O) a
E.不可能用content-type实现
2 w; K1 K) B+ ]! `+ J
+ K" Y. k! K+ y }- s3 k
* A4 Q5 G' { Q L
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
* t# U8 A3 U: J: a
/ V3 W4 K0 h" g# a3 [
A.安装sendmail服务器
1 m% n5 b' l: G; [8 Q0 ^) p
B.安装Microsoft Exchange
2 t: ]9 T2 p" [- s* h# e ~3 r' z
C.在你的电脑上安装任何一种邮件服务器
' W7 O; {/ K% ~" A
D.改变php.ini的设置
& r' H' f! ` v2 @$ q! Y
E.写一个连接公共电子邮件服务器的脚本
1 z+ W- m+ @' q6 p
+ z: f; P" r6 D0 u! r& Z- B7 [0 _
6 I Y1 S6 n( L/ z0 B2 Q" s
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
. b% F( E% e& g0 v$ {. D- J6 j
9 r2 L# P- M( ^
A.使用GET方式传值
0 t$ @2 c" P* y* b
B.用htmlentities()处理电子邮件地址
B% j, f& @3 j
C.使用POST方式传值
# p% e" D# n! @! A% z0 C1 V
D.用htmlentities()处理邮件正文
" W0 ?. S- y% Z7 w1 h) ?$ n( P
E.确保填写邮件地址的文本域不能有换行符
8 ]- n0 j, O8 _" }) ^
1 H+ I$ Q4 S$ V' ]
" \( `0 I$ V9 j- p
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
8 E* z1 c' d" G- X7 I
: F. I1 D! `$ ]) e" l. K- s; _" h8 K( N+ C
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
( c8 y N3 I' l& Y
B.把它存在文件中,并用base64_encode()进行编码
, h9 U6 i# X! P! Y
C.用serialize()把它转换成数组
0 b% y( ^1 K/ e* J G" a( z* g
D.用serialize()把它转换成数组,再用base64_encode()进行编码
8 `- K4 N6 r$ k* M: |1 |( ~( D$ K
E.把它存在文件中,再用convert_uuencode()进行编码
/ ~# h4 V! ^9 B! H# P/ r
; M/ a6 J* ?9 Q H4 V
) V/ @/ z1 {* F
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
% |# }. L' ?( i8 U& u# `
; o5 |+ p2 F7 X& G( g
A.堆一个检测脚本出来
/ z( D+ [( A* f, S* W- @$ ~# y1 E8 k. S
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
& x' S! _8 l& G5 [7 q) H3 v( j
C.写一个识别文件MIME类型与内容是否相符的函数
7 @- \5 e* r3 I
D.使用mime_content_type函数
3 U: m! ?% V" Z* ^0 }0 ]0 G) |
E.把文件上传到外部服务器上
" F# {% ]8 ]6 R& Z" m m
: p( }; T0 W# C! `/ r# w
: ~) o5 {) M% P9 S9 H
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
* Z: R+ G# z3 Z- h {+ s
. C& f4 o; X3 R. y. O7 S) K/ H
A.添加一个From头信息
- A! S6 [7 Z. n( W( D) j
B.使用-f参数
U6 N4 E: |. Y) y1 l" L8 G! f
C.添加一个Reply-to的头信息
' k; i' s9 P5 m# c
D.确保运行Apache的用户有修改sendmail设置的权利
( T/ ?. D& D K& M i: R+ B
E.确保Apache在root用户下运行
+ v/ c8 u) {# T- G# z4 Y7 U2 C" K
答案速查
; s% l$ s( L9 O( u$ k$ K. A
1:D
9 X" D5 A& c- f
2:AD
: C& [" w0 Y& U& ]# Y |% I
3:E
( u2 p; H" w- k+ w4 t
4:Content-Type:MIME
) \# ?: p I4 X# ?
5:BC
" Q( L! V' A/ r) G6 L+ w( }
6:A
, d; x# v7 C7 X$ J' J# J, L4 P
7:C
; h5 ~9 c! h: n0 N
8:BCE
$ t2 u6 l/ {4 n6 H& p5 u
9:ACD
% H. Y; g1 E# Y: [% e5 y$ _
10:B
+ ~, P c9 i; j' `5 {
11:D
% K2 X4 p5 C8 |1 y
12:CE
4 n* Z1 y: a2 F3 l( [- w7 g
13:D
8 a0 r3 d- K* \# C) \
14:D
4 l# I- ]$ ?" I- l1 ], h: Q. v
15:ABD
1 G- E; J5 {. V, X0 O4 I9 V
6 V0 S/ x# `) ^& r3 O1 S! d
9 H3 s/ |9 N7 m7 \- b% J
! B {& _4 N1 W) m& S
答案详解
x/ ~3 A1 X4 d+ m
/ E% X5 N4 }+ R$ z4 O
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
; q5 Z( L7 r) ^: n) t+ u) M9 F
$ t! W- L7 l" q* f0 y
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
+ R4 e( Q; l/ N, r6 H
9 d7 g; ^0 ]% ?7 W, f
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
/ u7 W& |. k; \& E/ k% ~; |9 k3 @6 m
4 Q0 K: a0 ?5 \, o& f
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
' o1 w& v7 C- `( y9 L9 ]# }
3 p/ Y2 s$ A2 D2 [8 A) z
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
; t2 o1 F: U' T( }
E: V+ g, N7 `9 D$ @0 N
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
* {* o! F* a2 [* z% x7 v$ C9 ~" B+ c; \
J$ a' v$ _" R
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
+ a& u9 U0 q4 r" e; F/ z
* |, k5 }, {$ [) [1 H
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
0 g: U5 u$ Y. }' v+ J% Q
( i" t2 B1 |- x, @7 z- x4 h" K
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
7 b- Q" r' a8 T
- R3 p$ o( Q3 t* c/ }5 @
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
2 w' F( l# m' _0 Y1 t l
1 a5 {! F2 O: q, O. u- `
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
) f$ z4 T7 [7 r7 @
8 I; V8 l* J$ j% l
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
2 g1 M2 K' X1 W2 e' C% m1 K, h
( j+ Z" n: J u7 i+ c
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
. ]0 O0 { c5 o' C6 C) w& z2 C
/ Q! y h6 S- O; G4 G& B' J* D2 t
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
|( X8 z7 f- P$ w: h1 Y# B9 L9 C9 t9 @1 @
9 q- C8 C9 C( Y" P0 B
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2