返回列表 发帖

[Zend权威认证试题讲解]第八章 - 处理电子邮件

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。$ s! h& B7 \  y# K
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
; }* T. i; A& T5 P7 V用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。3 f# J9 L0 g6 V9 M) L' o

9 @$ D& y/ ~+ a9 ?' g5 _+ }( G5 h) K: g- A, }& i0 }
问题
' M4 g% c& x' k
7 _! K7 I2 ?0 U& g3 M7 {& _1.以下哪个不是合法的电子邮件地址?
% x, o" f3 ?( P4 d6 N; f6 }% \) K7 M6 [5 r, E. M) h0 Q
A.john@89w.org- ?9 _4 |  y9 y7 {
B."John Coggeshall" <someone@89w.org>
# g) O9 B: p0 j7 n  ]C.joe @ 89w.org
- t. |# R3 r$ z) A; FD.jean-cóggeshall@89w.org7 A$ b& G2 X1 }4 v
E.john' T; z3 K( C" p
3 h' W9 k" X6 c# i! Q$ ?0 R, ~
9 m/ ]$ i6 p* e8 X9 ?6 H0 \% X
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)/ |# M4 \9 ^" _1 ^4 K3 E1 u  {; ~/ b
2 d: O5 Y3 i/ g; x( F+ g
A.Windows/Novell不需要第三方软件的支持就能实现该功能" ?: K* h- L1 S" p1 ?
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。/ T/ D8 T! Q! l! r. t! `
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送  n6 W- F2 g4 `
D.有可能完全相同,这取决于sendmail_path的配置
5 z2 T4 x( y9 `& Z0 A/ H: @E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
- m$ n% s  h) d2 y# i
% |: D. K; x9 q: l1 K! {5 u% K# g! n; e
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?; d  R* d) s8 H& Q* c; C3 _- X* x1 Z

$ g% J2 o3 o2 Q  p+ D* j4 lA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
/ a% _( T, Q; pB.用PHP代码,通过SMTP直接与MTA连接。
% k9 D% N# N( j* W- O' M3 X3 UC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。# n* [6 k7 y! s4 {6 S4 d
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。; L, T0 w( w* D- r
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
9 I: a, L& T2 n+ c4 j
* p& a& D: h; X+ i/ G: s; A4 b2 q, X. Z' s9 t* V- Z5 R$ t
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?/ _- |. C0 \( q8 q
0 p1 n6 G, g+ q. K7 H/ k
答案:____________
. y8 s  b/ H2 a) q7 g; ~/ L0 \1 r$ V. V. m! o9 g

: w6 e: g+ f7 w2 b: U0 K% s5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)1 ?  Z# n0 Z2 X' \

0 f2 Z2 G0 [4 E0 Z/ KA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示% Z# J' ?) T, c/ g
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片2 K, }* M5 f' ]6 X
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
/ e% z* k, N6 x& }D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
3 r/ K! w' w7 Q0 ]1 dE.只有一个答案正确$ {2 V$ f& O! ]9 z; o  Y$ y0 G% D

; T; J- Z; f. j3 z; l5 Q& v: a' {3 m* Y. i6 v2 ?! o# V
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
/ t. m$ M$ q+ V$ F. m. {9 j
8 Y  V) B6 j3 p; [3 O) w: S" VA.从UNIX或Windows/Novell发送邮件时都会用到! p' B/ M7 B# z) R2 l
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
$ _5 W; w! ^- I- b2 Q; @- pC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
3 S/ |" x  K6 q8 V# T9 OD.PHP里用不到这个参数* S& ^$ W1 R9 H9 C
3 s, H: U9 {$ ]7 f' [

6 p0 B; K0 {% T, ^3 a" C8 W* }7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
! x) ^6 d( [1 Q: s, q% k7 d; x: x& y
A.只有在发送非普通文本(ASCII)数据时
  R* l& y' s  R' |  w2 F" H$ QB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
) H0 I% P3 o7 W! p5 iC.任何时候都可以用它来指出MIME的编码类型
" ?1 i/ m' g2 [! R0 A/ `! nD.只能用来指定特殊的编码格式(例如base64)
: F5 J/ h( R+ l  g7 @  LE.以上都不对' k0 B. K5 M2 W* T; E

; T  x- M6 H+ r2 h' p8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
1 V+ U* v0 \' c. O0 U: I- `# k" @& }9 u  I  U) ~; [
A.分隔符至少要8个字符" R$ B* X, y. b. f: d4 i- |
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)3 m4 z; g, }8 a
C.分隔符在MIME邮件中必须是独一无二的* y6 T2 T2 n8 y2 G
D.分隔符不能嵌套的其他分隔符中
+ R8 T2 ]# c+ x" ^E.用什么做分隔符都无所谓' l/ f/ ^! W; \$ C* q6 w/ e

% A' b; K8 ?+ a% ]
& e$ a+ b/ _( W) B9 |8 l9.考虑如下E-Mail:( \( {+ q2 d+ e/ ]
* c; m/ p0 g4 S
From: John Coggeshall <john@php.net>
- B6 j# ^1 z0 \  FTo: Joe User <joe@example.comt>7 b4 n5 U3 @' x9 b" N
Subject: Hello from John!! t" @' z7 O; m5 f+ d
Date: Wed, 20 Dec 2004 20:18:47 -0400
4 x, L: ^9 q( c! F: EMessage-ID: <1234@local.machine.example># G2 L$ i! D0 p7 }/ F: t1 m" S& `# v0 K' B
Hello, How are you?
. ~/ H1 H. \3 A3 ]& J# g3 G
) _2 B0 }3 k' }) o在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)& J, j# a9 ~/ E( P

! j: o) M0 c( W6 d4 C. fA.MIME-Version2 C7 w+ w! ~. Q: D+ c
B.Content-Disposition
' p( _  r  w( U' u' ]; V7 u9 uC.Content-Type
0 H: U9 d& ]8 |  p. P( RD.Content-Transfer-Encoding4 J* D6 z8 x, Z1 j8 b% S1 }
E.Content-ID5 G4 |* l; K6 h, Z

7 Z& F+ G: L3 i4 d3 ?' w+ D
& x5 u6 R9 ~9 h3 ]# q' o- d10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
% e3 v% P+ C9 }) C/ r
' d: ^% x: L$ G7 D+ ~A.multipart/mixed  D/ ]2 r7 ~3 d# i2 q  I7 q
B.multipart/alternative
# U4 @4 a& A+ m+ S5 LC.multipart/default) [; g) c0 T9 @, R+ t9 k9 F
D.multipart/related% Y" v6 r2 Q( e8 k, }) {
E.不可能用content-type实现1 \6 F* t% ^1 P3 |4 V# I- Y
8 O: w: @3 E( B# ^" T" s

; R  L% P1 Y- L+ N0 ~$ G4 q8 v11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?" q5 U# M( \7 o) f' r
5 l( t/ L, ?3 g/ w
A.安装sendmail服务器
2 a& D4 X! M7 q* e' s7 U$ nB.安装Microsoft Exchange9 g3 {' [7 ~7 s' D, ^7 y
C.在你的电脑上安装任何一种邮件服务器
) S0 g4 e" M1 ~; FD.改变php.ini的设置* }4 D# B. w: x5 {$ `$ U7 v; O
E.写一个连接公共电子邮件服务器的脚本. Y4 A% ~: Z; F7 x2 W* P+ y
/ [5 a9 w& O6 d

. A3 o# A# i1 p4 e1 g- }7 q12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
: G) u- A) g/ u/ d8 K
4 h2 r1 ?3 w4 L( Y" A% F6 WA.使用GET方式传值% Q( D8 v: G5 d5 ~/ `6 K
B.用htmlentities()处理电子邮件地址
) W9 Y0 c6 M. S' IC.使用POST方式传值( M5 f5 ]' u4 D! H" Y
D.用htmlentities()处理邮件正文/ ?% ~$ H4 Z$ u6 ^
E.确保填写邮件地址的文本域不能有换行符
% s! t4 O3 e4 x9 z' q  c  X3 C+ @2 }

6 M1 _& F2 t& m0 \5 T13.如何将一个数组作为附件发送,并要能在接收后重新组合?) H" N- U6 O5 ^9 _

7 D: K' W9 R9 yA.用serialize()把它转换成字符串,再用htmlentities()处理一下; z- A! _# ~: V5 w! D0 i+ X& U" a) @  _
B.把它存在文件中,并用base64_encode()进行编码% X4 q- L5 N1 L  C7 v! x
C.用serialize()把它转换成数组
/ j! Q* f4 p+ p2 H2 j9 p. h3 f" aD.用serialize()把它转换成数组,再用base64_encode()进行编码
: L9 A3 q( u: n$ o0 ~) b) LE.把它存在文件中,再用convert_uuencode()进行编码2 |( h- Q( t. h2 d# ~$ K" R

; u" P& K/ r3 A/ M0 v. i; |( l0 P
5 g  g- t5 P8 C, J: y, h14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
- Z& ]6 {- S7 H& D' W
) V  V8 u& e( i( f# p: V( pA.堆一个检测脚本出来. a9 S' |% ]! @. @% N
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型# U" A& E% S  p, ?
C.写一个识别文件MIME类型与内容是否相符的函数
: T  i$ d( @  ?D.使用mime_content_type函数2 S! o3 R2 Z& N+ |, k, {
E.把文件上传到外部服务器上
& C' s, c3 e4 Y- W( [# J+ M3 x$ H' d( P. r" z# p

( _5 \% i3 l' k' W15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
: n. v+ i- ]! d+ }; j/ S2 q, z, Z4 b& X! Q3 i0 e
A.添加一个From头信息2 N7 q, Y+ L' h6 t% N& z
B.使用-f参数4 O5 n+ j, c: \
C.添加一个Reply-to的头信息
- ]/ p& G/ p7 }/ r! wD.确保运行Apache的用户有修改sendmail设置的权利, I7 V) N6 I! M& k$ r
E.确保Apache在root用户下运行+ J; t4 o* R( w" f
答案速查
  l( s( Q! p' C4 j8 L1 H3 p6 d4 a1:D
  h# E) e& Y) b: R5 |6 D, b! V2:AD3 I  K: a- z7 v* R% b, }6 T: B
3:E6 B" d+ \' t. D
4:Content-Type:MIME' Y9 E+ V: \% H3 V# ~) g
5:BC
2 m- ?  V6 J7 A- H4 A6:A8 P3 s4 e4 }, F+ f/ _
7:C) A3 c/ V  z2 [4 l5 K3 Q
8:BCE
# f# E8 \9 C; U/ q5 o2 j. l1 D+ D9:ACD
5 W+ J6 R9 w' B' Z10:B
* y# l$ l( w5 B5 w& c0 L11:D: i: N# l0 t+ O8 _. |/ d' c7 V* a
12:CE1 ]& z( |8 D5 c5 o" S$ D# h/ t+ e
13:D
9 [2 W+ ?8 U/ N; E0 R- ]14:D
( Q6 k4 N% j2 j6 p15:ABD2 y! B6 y$ Y' x4 E! M/ [6 E6 g0 h
' I/ g. x' W4 T

2 J, t0 ^6 y9 ?  F% |
1 ~  \% R- f# E( w; C% b答案详解
; U1 n! z! g! {9 p- u
7 l; R8 I; e: s* r. P1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
, Q; @: D$ t8 }% a2 N& \3 s# v+ v& F5 O# n" a: ^7 M, _5 n
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
( y; p( G, y1 Z9 B# K
  M9 u, i3 J& |3 e4 D- l3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
$ L5 e' E4 P) K  Q% T$ C/ r  `3 E& k7 Z- b# u
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。# P+ m1 }4 i3 R% O  @

. O9 f4 o- C* s9 z, n2 @5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
3 _6 B' S3 N1 Q) o8 N$ {4 k. {6 Z- G% X" W
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。0 l- g5 _7 |# n9 I; ?
8 b8 e. H, @/ h' B8 H& I
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
8 D1 o, Q7 a% Q- P6 ]- A' @, J4 u% Z# J0 Q; a
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。" }- i. k8 Z, z# c
+ g) d% i* L: n( ]% b# X
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
( {( `8 o) J7 k* S, m) |; x: s( h% k7 @2 [7 R
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
$ @0 j: |* m( m1 V8 Z) C& t* {9 {; a
* F& z  H3 \5 c  d11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
; Q+ W8 `) N0 e) ^- l7 Z) ]" R$ ^* i3 z* R  e
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
/ ?# g1 T8 I8 D2 R$ N5 Q8 O9 z
' ?% M' N7 o- v9 U& K* I* z1 C  X13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。  Z( ^+ q6 H4 y" ^# Z+ u7 I% I& Z
( W/ y0 |( C+ a: Z$ j* O& A
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。) R: r+ e2 |8 Y3 e7 I% T, L
3 H/ w  y/ a# x) |  F
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

返回列表
【捌玖网络】已经运行: