返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
3 `8 |  E- p8 T" ~% u- U- O还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
) V, H+ X$ u% d- V, }8 p% M/ |用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。; ]4 h0 g4 o" [9 k9 F1 Z

( q9 W0 B# ?: ]9 ~
# [; \8 O9 @" Z4 K问题& ^, _5 s+ f5 r4 \2 @! Z
+ k+ I. ~4 V5 E
1.以下哪个不是合法的电子邮件地址?
4 V  P) i; f7 N7 o
/ w4 i4 ]( c+ U6 pA.john@89w.org! I! K: I% `% C$ r. T1 I5 m% R' b8 U
B."John Coggeshall" <someone@89w.org>
; ?8 w/ `& e9 C% l* o0 n; |C.joe @ 89w.org
) ~3 D1 e( H( g! B* W  _# B, DD.jean-cóggeshall@89w.org
; ]7 h4 j+ M' P$ bE.john5 c2 o6 E1 D* F' r- W- s9 t! q( X. i
* y# F. }' g* x3 d  y7 i' y  Y
/ j; |0 ?8 u- Y1 p6 g- r- [
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)* S* L$ v  _! k  @' R
8 _9 ^0 ^& }# s8 H* V
A.Windows/Novell不需要第三方软件的支持就能实现该功能: Z. |& s& ]2 A* e. k0 A
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。- w+ y( X- R( v
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
4 N: f* [/ o8 g# K: o1 D( o0 Z4 nD.有可能完全相同,这取决于sendmail_path的配置5 E& ]' S3 R* U- T+ i: P
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
/ c6 P$ M  z& m" z" N9 A
% n+ T- j5 @+ o( @
9 l# y" b8 P' J# ~7 N9 i) E1 ~) s3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
) M2 R: s- v6 ]7 z. d8 @8 `1 g3 u. N2 L9 i, |
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
# h5 N. h  Q7 g6 S, e( xB.用PHP代码,通过SMTP直接与MTA连接。
1 e- b# j; G6 H3 D  S( `C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。+ \1 E( X- w  N7 g. M5 l9 E$ J
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
- `7 Z( I! S; Y* r( ?E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾6 x# N- H& d9 \9 @0 v& h" t
1 |/ f6 _+ I+ W
7 _$ l& F# Y) b- h7 T3 a
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
9 Y- ~4 n7 N5 U0 L5 j4 G4 s
, u$ h$ k* ~( G' F答案:____________+ }6 G% i, e5 C' x( ^9 Y! \

. l" s$ }' X6 Z- t# |/ r+ u/ W8 t* _1 o( Y- [/ y( A& F
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)' j! @4 S% `$ Y+ D

- W% z* Q* D- c+ x6 F, Y6 QA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
! c+ l9 {3 a1 F! Q# Z7 `B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
9 l' Z' @- k5 XC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID* s! }2 q4 \  D0 O0 I
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名; a0 ], ^. f# H  X7 ^
E.只有一个答案正确
; a: [2 l( G' r8 ~; F; @2 r# b
* Z0 l6 D1 f% {* ~2 p
: {0 C" W$ M& O, O6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?. w0 e+ s, U* @  x
. _9 D6 M1 ?9 q0 g! V, b. g
A.从UNIX或Windows/Novell发送邮件时都会用到1 N; b7 ^  K& c  Z: P- }% [) o; t
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时' |* q: i$ I4 x+ z# S
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时+ [* X+ G- x3 f+ j% M, b9 x
D.PHP里用不到这个参数
8 x+ e, H  ~5 J0 ?4 g
- p: H% M4 }4 p! q% i" m
4 ]' T+ Y5 d4 c7 G: n6 ^7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?) C/ a; j! U. N& _8 N
; \$ F* `/ l9 @; P) |
A.只有在发送非普通文本(ASCII)数据时
+ z# d6 [0 x! J, l- R6 }1 BB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)( l2 Q+ h3 n4 M- i( |
C.任何时候都可以用它来指出MIME的编码类型# y% c# E6 M4 ~0 Z7 z. i6 A
D.只能用来指定特殊的编码格式(例如base64)
4 J* u5 v1 l/ e' @( UE.以上都不对
# V0 h0 g( d7 Z! S1 h% O0 ]/ I' W! m$ `  i( _4 B
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
: K$ h: N# U1 }! h' N* q7 ^: l( N2 ?4 k: z% N( _: o; M
A.分隔符至少要8个字符1 j" H& Y8 B0 o) D) T
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
/ N9 z3 q" O: S8 Q9 w) xC.分隔符在MIME邮件中必须是独一无二的
  P$ \0 ^" i* U  nD.分隔符不能嵌套的其他分隔符中9 B0 ?# O$ `! s# t/ {( I4 a
E.用什么做分隔符都无所谓
1 G% K& U5 s7 A6 \4 E5 u1 }3 d7 f
8 @2 w) z: M- [+ i) H, ~0 E
9.考虑如下E-Mail:, E7 t: \* r# o3 Y: ]0 C

$ l( {9 \& U1 v2 cFrom: John Coggeshall <john@php.net>
4 t6 _( N' Q4 G9 m4 l( B, ]8 DTo: Joe User <joe@example.comt>7 q) P& N! ~" e) E+ p5 L/ L
Subject: Hello from John!
. a5 K& r* k) ZDate: Wed, 20 Dec 2004 20:18:47 -0400
# L4 o. d2 k! hMessage-ID: <1234@local.machine.example>
- |* @  I1 U3 gHello, How are you?6 S- r. u0 N/ w, q4 e. o- X

1 X& n. V1 S  g6 v在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)! h0 L& ~; }3 i8 s4 `
7 P/ I, {3 A% s4 ~6 X- L' v2 P
A.MIME-Version
: U% @3 `2 L, t: G$ PB.Content-Disposition
( h5 P  C( C- `9 }1 u) C# D6 aC.Content-Type2 H# {: I, u7 X& w! i
D.Content-Transfer-Encoding
" ^- `+ K; j4 D/ JE.Content-ID
! ~5 I& d* I/ H3 f; O2 n, X, [5 t6 F! I& T
' @* y7 c  {/ _  J5 U
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?0 ?! `  A1 ^9 z+ ~# g  y1 Q0 Y) A
1 d2 O0 u' Q' {0 l
A.multipart/mixed
1 i: l4 j$ O6 a7 tB.multipart/alternative
5 r) `0 }2 A1 OC.multipart/default0 ^& [* ~1 B8 `3 h, q3 R
D.multipart/related; d  c. x0 T' ^4 C
E.不可能用content-type实现) K! C! X! D8 A9 ^  l% Y; q

+ a  k+ _/ t. E. H6 m# `5 M4 h2 h$ C& k, b9 G6 j: ?
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?* n, M/ W4 G$ Y, G
( {: P0 Z* g4 M; C8 C
A.安装sendmail服务器
3 x; R+ u% Q8 h6 HB.安装Microsoft Exchange5 c1 l8 k" K. Z4 d1 s' Y2 V
C.在你的电脑上安装任何一种邮件服务器4 U3 q+ }! ~- I6 Z
D.改变php.ini的设置
4 a1 @  i- H+ _! W2 f: hE.写一个连接公共电子邮件服务器的脚本9 B4 T/ F+ U* Y* }7 h! k
* ^/ R5 ~+ N2 G( a
  z8 r6 A. [' h2 F
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)8 r/ _/ A& c) m) k4 w

# M8 t% N3 M) s8 L1 t4 B9 MA.使用GET方式传值3 \  X$ n( y, L- G
B.用htmlentities()处理电子邮件地址
8 L; U4 L& _, P  g" X; l( r; oC.使用POST方式传值: T+ e; z) F% q, O( D
D.用htmlentities()处理邮件正文
- B3 T: E/ R$ S9 r3 @1 b* ?E.确保填写邮件地址的文本域不能有换行符
7 Y0 |7 ~3 k+ f# S! l  U8 U3 {9 @0 o7 o/ i- }  {5 R% o

& ]2 q5 P) t# j& }1 {& H9 |* e13.如何将一个数组作为附件发送,并要能在接收后重新组合?1 E5 x- Q+ h, R' o  I8 M2 y
: U) g/ o( H3 z1 l! z7 g3 z& `/ ?
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
2 g" u/ P+ }  e; PB.把它存在文件中,并用base64_encode()进行编码
7 I( \5 E+ D% QC.用serialize()把它转换成数组, A1 Q4 R2 E3 C
D.用serialize()把它转换成数组,再用base64_encode()进行编码
6 `+ ~  z) _9 m; m0 a- oE.把它存在文件中,再用convert_uuencode()进行编码$ V# q  Y* S/ y5 M7 X: Z

& y% t, |  j2 U* V& K9 M2 j% Q1 I, ?; L# j
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
9 u  A& b) F- \  L
7 ~  R, a$ U$ m# oA.堆一个检测脚本出来
" Z/ i, k8 ^/ |! `7 zB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型1 _( L9 S% d% |1 T9 \* {& N
C.写一个识别文件MIME类型与内容是否相符的函数+ T: L+ B- U. p8 x
D.使用mime_content_type函数: |" P1 N7 z5 m& Y! t, M1 O' J
E.把文件上传到外部服务器上6 Z" w! Z/ g4 a& d# s+ J# R4 [% M

+ ^  ]8 ?. u: e
- c9 ^) F* u5 l15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)8 Q6 L) f: P! X, M4 Y7 J

( x* ^. n( y0 [6 w; LA.添加一个From头信息6 q) r* e! g5 X8 ~
B.使用-f参数1 Y. A' ?9 H' @; H; V( G( }8 a
C.添加一个Reply-to的头信息0 R* v$ c$ S9 H
D.确保运行Apache的用户有修改sendmail设置的权利# ?( n1 z! u2 r+ i3 Z& `
E.确保Apache在root用户下运行; S% E) A% C; U$ q* z4 H
答案速查
# |4 _, u7 B& `, ?- P  I1:D% H8 [) w1 Y! g& x5 e
2:AD
; V0 L9 P* Q" i. X( |3:E
; J9 G" a9 H9 W. x7 {+ T' K3 ~! U! v7 x4:Content-Type:MIME
, m/ e6 Y3 r; v6 @( E5 t; @* T8 g5:BC
) z, ?  ]) g9 @7 O, S0 V  `; M( k6:A
- q2 A/ H4 \3 t* s2 i6 [7:C
% h" A/ \7 Q$ N% N+ T% n7 g3 O8:BCE
% J5 ?- ?; @+ C9:ACD5 A3 w+ u, a3 k4 |! H. }$ m
10:B! y( X$ ^' T- T2 z/ M9 j- \+ W
11:D
; t1 h, Y0 C9 v) y4 G12:CE
) ^  C4 }% `2 H13:D
: s  E3 t6 v% D) t  P1 D14:D5 F& t8 k( z2 Y  {& H. g5 }
15:ABD3 R3 s. A, v" r

5 Y; B9 [" T8 n8 P! C7 b5 w) k) F( u: _- I
' [9 E% @6 d% T- r8 G0 _6 `3 i( l
答案详解
: n( Z3 e5 c, r  m3 ]. N) Q8 Z7 g) @7 H& S  |
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
# z' d9 b- X* Y
- @! e) V% S, f2 h# S2 j( \2 S% e2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
: \' T: }) u! v% `* _: `8 m0 _5 _( u& o5 Q/ i, t, ^
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。) {3 }' @" D: V4 S- x

' u/ R  d! k7 Z+ E5 M4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。* f7 J5 i1 Y" H- U0 y

* R* a+ r' ]: U1 V5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。( X, Q7 {; W, j5 }

1 B1 `& m( N* @3 s$ _6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
8 |$ U1 [& V5 q" K" ]( [/ y- h+ q, |4 P0 `
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。' ^: O3 U& Z' E2 p

+ s7 p; e: W6 u8 o0 [8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。2 u: h& {* i/ e6 ^
8 x* r- e% G8 K; z+ @4 i/ i
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
5 e3 y6 n' V. v0 ]4 ]0 H8 F: J" w% u7 x
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。, r7 a4 X' |' [3 G: x; R4 x

7 g7 e, P' Z" E9 |' ?2 F11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。( n$ ?* W8 [. t2 d0 v; Y
) b; H- g7 w  n- O" V
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
9 G8 N2 x0 a* O! [+ Z# Q: q0 A7 V9 V8 g* f
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
2 I- m$ d- _% I+ f3 b7 G9 W( ?7 \6 G8 f
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
4 a* Y7 d9 ]+ i- @5 e7 X$ }, n& k  N8 E) d" f
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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