获得本站免费赞助空间请点这里
返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。/ c+ e- U; U, Q+ O8 _* K6 ~' g" Y
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
# K8 M4 L$ Y) p, c' e* x  T用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
/ V. S4 \7 Q% F6 X; Y! [
- y- u- b, r0 ~1 W+ T
! g% D, b5 d% Z) \% D6 z问题! d, A0 ~  C8 G2 H2 J0 M* o6 \9 }
% }. F. S$ \0 Y' p8 I
1.以下哪个不是合法的电子邮件地址?2 A( v+ _& e' E- `: a3 w
) M) [0 ?7 A! Q/ W( g4 o6 v7 v
A.john@89w.org- i, _3 \% B; C: J4 g& r; ~
B."John Coggeshall" <someone@89w.org>. F$ G& L. Z+ F8 A
C.joe @ 89w.org0 I# H& P) H& d% I! G# ?+ w
D.jean-cóggeshall@89w.org
8 u1 P/ @3 {3 F9 YE.john8 \) j% w1 l* H

3 m5 m/ J. R/ A" y) L% F8 m: k  v
( w! p$ G0 f+ W2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选): ?" }& k( f/ ?0 m6 h  `" u
* c. ?7 C# {5 ~7 _4 U: U# h
A.Windows/Novell不需要第三方软件的支持就能实现该功能
- s( E8 K* |' ?  j1 W0 g( A+ MB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
3 w4 t/ w9 _6 C2 VC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送0 y1 L5 B9 Y: R& l7 x7 Z# m' z
D.有可能完全相同,这取决于sendmail_path的配置  X' `6 y1 f, Z# |0 O
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口& v3 t& S8 {# _4 ]

$ G6 b$ |" g, p1 k5 P# Q) q, r# O' s( P$ i+ N: h
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
# p( E  S, o# e% D) @  G! H& l  h
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数7 `/ D1 v8 _4 y- H* u
B.用PHP代码,通过SMTP直接与MTA连接。
1 T4 d6 |6 d  P( y* k, J! o( cC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
# y7 ]/ E. f4 Y2 ED.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。" ?1 r; P( Q; F/ t$ Z; _
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾7 y) p* b& `1 w* b( p) s
0 l) i2 `$ o8 U; Q# g! J
/ T+ @7 k" P% |4 @$ a
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
+ w  L8 }" a/ f4 K$ o/ _0 g' m* K/ E- T
答案:____________
% `, @: R8 d0 e4 B! p/ k
; \; Q% h8 T5 P1 L' Q. V# x$ I$ }" d
) i! [& x# f" u6 M" {8 G5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
! E* G% N4 I9 l% d
; J2 ^- x) _8 u8 S$ |7 ?A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示, I5 y) B; j' E0 t
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
: H2 ~* r% p; k" D$ k' j% Q$ oC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
4 }6 {- r0 S1 {; ]" J- AD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
' ]) ?  ~5 }7 S: ZE.只有一个答案正确
& C/ f0 j( O2 v5 Y6 J; Q1 t
- t# ~2 q' R6 f7 e" K! d
2 C& a8 _& o! {7 ?& g0 a1 \* y6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
4 Z1 k' e* d- @, H, X
, u8 }% R2 |& ~. ]2 f3 M7 mA.从UNIX或Windows/Novell发送邮件时都会用到( h8 Y6 [* B1 `8 p
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时: ?( J3 h& _' W# f
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
! h+ N8 m& u3 T+ yD.PHP里用不到这个参数1 Z( _/ K2 h: ^0 S6 L
& O( q2 @' s+ y# u: D3 C# t2 u

3 y) O4 }* H% U: X# G! F7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?$ b/ }* x9 j$ w. m: j( R
0 d  a) n. a3 x$ V! N3 I! f- f
A.只有在发送非普通文本(ASCII)数据时8 h$ C: J* b7 n- G" }$ A7 b& p
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text), E- ]( z( P3 w, B/ I4 S1 y7 j
C.任何时候都可以用它来指出MIME的编码类型9 [* u, ^$ C+ v2 `* p, W
D.只能用来指定特殊的编码格式(例如base64)! }5 R3 Z- ?- a$ Y9 Q& H
E.以上都不对/ ^9 B) J  C, @" V

) d8 L2 P* }4 I8 r& D1 p! d8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
8 g/ `" L' G% z- |4 s" x$ K& y6 U/ N- Y
A.分隔符至少要8个字符
1 N  M% u# o- \# r6 k. a( iB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
9 S4 f, U) {& rC.分隔符在MIME邮件中必须是独一无二的6 k" L% g" N7 W0 H1 z
D.分隔符不能嵌套的其他分隔符中
1 u' s. Z: k8 f' m" ]) `E.用什么做分隔符都无所谓
4 e+ I5 |7 B9 Z! B2 l7 p
8 Y! B- {, y' i" U0 b
' k% f/ k2 s# I8 g/ D9.考虑如下E-Mail:
" d6 q4 l* G, X: I& h
# V9 q: o7 w) U3 A$ `$ |8 vFrom: John Coggeshall <john@php.net>' ~/ Q8 N# r$ M: V
To: Joe User <joe@example.comt>2 d3 |5 z& w* J+ e
Subject: Hello from John!
+ M) O" Q( ]' S- lDate: Wed, 20 Dec 2004 20:18:47 -0400
; s! Q$ H6 M" A5 Z& HMessage-ID: <1234@local.machine.example>
7 W& x/ I- L% q3 M+ ~& S4 x" f' PHello, How are you?
5 T8 f6 Q& K  F1 ~# z/ m1 A0 B+ c/ V. ~, R4 Z9 ?
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)5 w1 O# A4 s$ i+ f: K

/ `% G. L) W: H, p5 {A.MIME-Version1 A0 i' K+ C7 b* M& L
B.Content-Disposition2 d6 }* [, v1 D0 @
C.Content-Type
: [/ e6 T  F) N" b! A1 JD.Content-Transfer-Encoding/ m& g0 N0 |! R4 v. |) E! F( Q
E.Content-ID$ n8 c  E8 t9 l: \; f& d
! i- A4 M( a* A8 `" F7 g" i
( X  z2 o, O; w8 p  V
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
2 L4 L2 u: r! E% G$ h
- y* `! V% I9 x) |7 WA.multipart/mixed+ `7 n2 s% n8 y# m$ u9 b  [
B.multipart/alternative3 p  A7 J2 K9 s- ?2 n
C.multipart/default
/ P$ O- [' L: x( y( \8 eD.multipart/related
1 T/ Z6 u) _6 Y% v; u# k* u- NE.不可能用content-type实现
/ K& g: }* z8 A" T6 Q
' U+ o4 H! N6 I( R: A4 l9 X
' B4 @7 a/ C: D% o; j11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?7 _8 K; f6 a2 Y: U" d% D

0 B% v5 u, M3 S0 e7 s+ P- pA.安装sendmail服务器* G, u! {4 o4 S6 l4 g) o$ b, h: b
B.安装Microsoft Exchange9 N6 K9 t* T7 i4 ~( H
C.在你的电脑上安装任何一种邮件服务器: V! V$ G9 ~. _* H
D.改变php.ini的设置
) b: c/ X7 B; M8 VE.写一个连接公共电子邮件服务器的脚本
5 {. v7 }6 z; @) W' s" \1 {
" ?) [1 _5 w7 D  v( }. J+ W* {7 ~
* E8 b/ W& |; y! O$ F# @( V. [4 K' Q12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
/ |. s0 G- r4 b# f9 u# t) N9 ^7 ]) A' d
A.使用GET方式传值; \! H" z& t' d% g8 h) q( ]
B.用htmlentities()处理电子邮件地址
7 W  z( Q$ z' `1 M2 K% |$ E) eC.使用POST方式传值
" Q+ P4 K9 w" l+ B; M& y2 YD.用htmlentities()处理邮件正文
4 M3 x7 U; [6 J+ NE.确保填写邮件地址的文本域不能有换行符
7 j3 X! {" R7 T9 w
, N4 d* |) j: |9 k4 j9 B1 U
  L4 S3 q/ z7 Y# O13.如何将一个数组作为附件发送,并要能在接收后重新组合?
. {' M! e* V6 E3 i" W. ~" h; B9 ^3 O. j' j4 d' S3 U
A.用serialize()把它转换成字符串,再用htmlentities()处理一下5 }8 I/ j5 j  V: c3 p- p+ y
B.把它存在文件中,并用base64_encode()进行编码5 `+ P4 z5 M- I  }+ a) z
C.用serialize()把它转换成数组
8 Z& R  n2 t5 L5 e; L$ bD.用serialize()把它转换成数组,再用base64_encode()进行编码
2 |' c$ h$ j% I/ |& {E.把它存在文件中,再用convert_uuencode()进行编码, o: v+ }4 N/ K0 ^

) h, M& Y7 b  w4 J4 U, i9 r( g' o8 }$ `5 k& {7 c
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?$ U) U/ a# M. T
& \% r0 ]9 E; f% N5 m+ O3 t
A.堆一个检测脚本出来
$ e. ^: }, X/ j. y- F1 v) [B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
" k* i5 H) x, n8 kC.写一个识别文件MIME类型与内容是否相符的函数
# t4 Y9 K+ S# r' P# ]D.使用mime_content_type函数
. j7 J  a3 U  P/ u- i7 g8 i" w% TE.把文件上传到外部服务器上8 B/ a% |5 `# F9 W

' @. p8 n; F) q
5 O/ d3 F, `  }; m7 ?- N15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)) P4 K5 }$ H- h$ g* c5 ?
7 _. e# U! ~. m/ ^3 J* j
A.添加一个From头信息0 T8 ?  L  @+ b2 b7 m' M0 v
B.使用-f参数
- V. b  ~4 p* O" [! k. n$ v! Z  `C.添加一个Reply-to的头信息
; f9 ~$ l, y7 `+ q; mD.确保运行Apache的用户有修改sendmail设置的权利8 x3 h) g: j/ F" ~. A$ c
E.确保Apache在root用户下运行  U/ h4 [8 B- ?% g
答案速查% d0 d6 Q; K7 b7 |. q  J' R
1:D( h$ D" A: H* i2 n( g
2:AD
/ s3 N+ l* ]# h3 [2 G3:E/ H# r3 x5 K2 k$ s- {
4:Content-Type:MIME
9 P0 ~% ]0 G5 ?5:BC4 u( v) l0 {' }2 S- X9 Z8 G- k+ k
6:A' Y1 Y  n4 b% j
7:C& }- v6 j" [, [" J; e
8:BCE5 r& f3 W8 h1 q6 K1 f+ ~, y
9:ACD/ l, A* Y6 r& H" r* E* H
10:B, O1 U; `! S6 _# e0 K9 i' \
11:D5 _8 D  d- T3 u& d
12:CE
4 j/ M. _) A" B( o( `% W' a13:D7 `- P) e* @4 [; w/ k$ J3 M
14:D
* ~& `; E# d2 W+ _( d7 \3 ]. y9 U15:ABD
% K# y) \! D3 O1 x( ^2 Y  f1 s- |0 w3 X8 N% W4 {2 _
$ ~% h5 p. K. k" `9 {
4 M2 r1 |1 b; y; B8 u1 ?
答案详解
- Y; \2 E$ e. c& e- S" t! t1 I4 j  e8 |: i0 q1 U% U& I- f/ u3 e* E
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
2 {! d2 [+ f. D0 L  p$ |3 [7 M2 V3 c9 O. I6 X
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
) ]$ O: d/ T7 C* {& b1 Z
. ]1 c$ D: r0 ]8 r3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
0 Y- b+ |8 D* f
& X# l2 r! ~$ Q$ A; O# Q  F0 U4 x4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。) @0 T4 k; ]- d5 W3 f
4 F0 C& M$ f! C) ^* V8 k6 b
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。# R$ h9 g. c$ d( R) N; c# g

7 x2 U' j9 h$ i" K8 w6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。1 S1 B- p. g& w; ~3 k, R! J( x1 D6 Z
/ t5 A0 u& W( M) B- o6 n* U# T; ~. \
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
8 j: m$ s" Q. ~
- s5 K9 W5 y( F3 L0 W8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。. l0 o4 a& a7 g
: u# j( V( o- s8 `
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。( x' H% Z6 f6 N( a2 t9 J

" j1 z: S7 G  Y10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。+ ]4 t. ]8 y8 S6 o, R
7 T" N: h0 ]# F: B7 c! ~
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。* A; n7 {/ l5 Y, d* O8 L

8 ?" ^+ _5 ^+ `# ?1 r6 x12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
' p* v" y9 x, _9 n9 a! t  m4 B/ K/ Q& S/ [% W3 [$ h( l
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
* V2 Y9 T$ U7 C, }
8 i, u0 |' {( D/ P) Y- b14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
! m! e+ F) m  K/ j! ^" @. M% u+ H- N9 ?% T& k: {- J! x$ r
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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