返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
* Q+ z9 g; z! b# b: {还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
% {. I9 q, i9 |  q. C& l用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
4 V1 y' l7 Y/ W: N# e; k# ^: Z
; k" s, G5 ^0 G) J8 ]  P5 j" \/ W9 t5 |5 w
问题
  L& B6 z7 O: O6 a) w; N: V8 m2 }) z; w: Q  H/ A, o. X/ d  l
1.以下哪个不是合法的电子邮件地址?. V# ?. s! ^- j+ g% ?3 `
8 ]0 G+ W: s* C! @. g
A.john@89w.org
2 c+ ]  t5 o0 x: {8 XB."John Coggeshall" <someone@89w.org>
; z" J' f: F% S8 M4 XC.joe @ 89w.org
4 F% e) _6 N6 W7 a' b9 l% y. KD.jean-cóggeshall@89w.org
1 N8 k! _; x' W( FE.john4 h+ B  P3 d+ q8 m4 G

6 q2 Q, t* K% y7 v8 b* P. o/ N
0 X7 m/ d0 I" ?$ ^) S2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
7 ?0 E5 h) Y& o5 d: y% ^
4 {7 \( X/ Q5 u+ R1 WA.Windows/Novell不需要第三方软件的支持就能实现该功能0 h2 _, [  r. @9 y3 @" O8 D
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
$ i' n' p( b( H! nC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送& ^1 D) J4 I9 |1 p4 ~: ?" |6 Y- K
D.有可能完全相同,这取决于sendmail_path的配置3 @* [9 a0 f, A4 ]
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
4 E# Z  w' ^2 O1 w* B, ?- [
+ a! b. P4 L. W- b( |2 C9 _- w$ j
- O! u+ U  C. L# g6 [5 n8 T; {+ O2 E4 o3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?$ t9 V* G+ r8 i5 r8 k
2 L5 ]; |% _/ ]! Q
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
# g) z0 |% D. O& d5 z8 TB.用PHP代码,通过SMTP直接与MTA连接。
! x7 |) a; k6 h3 QC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
( s+ b0 a4 Y$ T+ o0 OD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。; v6 Q6 |0 `' G/ ?4 q2 l6 G" y$ B
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
# E, t( e3 u3 J% X' `9 f/ |; O, M! W/ p9 k: f
( l5 t2 s! l5 S3 Q0 U2 J' R2 T
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?2 C6 ~( m8 z' C
0 w; _  i$ F0 ]* Z" v7 ~# J
答案:____________) e9 P4 X0 g% f  v  H. t, p

, T) t$ U' |- c1 ^5 D% s/ O6 H- }; J9 d; d7 u
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
; w! C" o5 K! \$ D- K- c1 {
0 ~" D" m4 X4 A1 _3 BA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示. f/ x% N6 c# A7 S. K6 J8 e
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片. |7 k5 E- P9 w6 }  r, \8 j  d* O
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID7 o1 j/ w; K5 h7 F( E
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名0 D' Q4 m: m! ]9 X2 m4 _  u3 t5 D
E.只有一个答案正确) L4 R* _3 z% a8 z* X" _

7 t5 c! S  d. [8 ~8 V7 B
% j5 m. i  D; @$ |7 e6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
9 T$ b1 Z0 `5 l" }
6 s; b' E* ^4 C! G9 Q, G9 {A.从UNIX或Windows/Novell发送邮件时都会用到" a! g( U! e6 P# @1 S1 u' r: q. C
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
( b3 G$ a+ ?# l0 i+ zC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
/ Z+ F5 P7 f' Q7 \+ dD.PHP里用不到这个参数
1 v" C1 q- ~$ @  L3 C6 m+ k) w4 Y' w! Y
: p" s8 |2 J( U$ h, y
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?% `' g7 h: [5 Q  \3 N( h" n& k+ [
9 g6 }; |% u, Y/ X+ a
A.只有在发送非普通文本(ASCII)数据时' ^3 Q5 X% E! O" b1 P
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)  V: P% p: M9 F4 V# X  J  h+ T, H& _8 a4 _
C.任何时候都可以用它来指出MIME的编码类型
/ J! m' d. {2 J1 J" s: u8 k- tD.只能用来指定特殊的编码格式(例如base64)
  o8 x: B9 t1 [7 nE.以上都不对
, \# j7 b; b, G: Z
# w3 Q0 \1 J! N( r/ C( _8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
8 f4 e# v5 `- C1 d" a# J1 ~. B$ v- E; q
A.分隔符至少要8个字符3 N' G( h! {6 ^( ~: {
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
/ B2 [2 G$ |1 `( k9 [; e7 O# |; mC.分隔符在MIME邮件中必须是独一无二的
, l! Y/ `& }! ?: f  ~/ FD.分隔符不能嵌套的其他分隔符中
  x2 _% r. ^( R7 m# ZE.用什么做分隔符都无所谓( m) [  |$ Y' t& [1 B' P7 i
% x1 G) ^+ g/ K5 P8 ]/ @

. L. W, T" i) R6 P& C, I: }0 \9.考虑如下E-Mail:
0 U: b1 i! g) v  w) B2 h- u0 u; ?, I4 K& a) g2 H
From: John Coggeshall <john@php.net>
+ H( R8 k# E- J& i/ @: d5 PTo: Joe User <joe@example.comt>
& M; c$ G8 u  ZSubject: Hello from John!( z/ q; ~3 w" G* y3 d
Date: Wed, 20 Dec 2004 20:18:47 -0400+ q3 l/ H8 c3 [9 h9 u% l) F
Message-ID: <1234@local.machine.example>
9 L- k( z5 l$ }6 O& x% sHello, How are you?
; ]4 M. X& ]/ {- x4 `$ n) a# F. B9 C5 x# S% W1 P5 g7 M: ]4 l
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)+ D; |0 q! B' f! W) g

/ O0 W0 ?( e5 E5 n3 OA.MIME-Version7 Q. Q/ `! d4 p% `
B.Content-Disposition
0 r! `6 ^9 T1 I7 {* w1 DC.Content-Type$ T. b3 M# n/ f& b1 W
D.Content-Transfer-Encoding
* p- n1 c& `+ H/ j9 D& M* `E.Content-ID
# C+ g/ T0 u, ~( x, g2 K4 }9 ^$ V, n/ O# ^/ ^" N% U
8 P' }7 Z7 d2 p* B( C( K4 N: ]# M
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
7 q* R2 S. o  y9 {& p
+ O. u8 }6 V, ?6 s, g7 |" qA.multipart/mixed
1 \) D$ N! U6 B/ F. E& }5 QB.multipart/alternative+ U% Q$ m& [* ]  _9 y
C.multipart/default
7 Y5 ~0 D( t1 [% C7 o# ED.multipart/related# ?% O6 X4 P8 X& X
E.不可能用content-type实现
6 z- O& n  ^: o, G8 d6 g5 z1 o& B  }" K
. `# p/ S& X# a5 e# u
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?! b$ o' `- x  S3 g) l3 |

; h, d" m. q; g$ o* lA.安装sendmail服务器
. y& ?$ C# y8 W  v2 B$ [4 |5 I9 @! [B.安装Microsoft Exchange4 U* x; g: u" u1 s' C
C.在你的电脑上安装任何一种邮件服务器
7 R% [" F: Z2 B: O7 y4 TD.改变php.ini的设置" R! Q+ I$ R" \# p5 O" F; P
E.写一个连接公共电子邮件服务器的脚本
0 |7 r- X4 N' Z4 I) v
. d. R$ C$ b8 p5 t+ ?. X' v/ y9 a% k1 y( B6 z6 N
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)0 E* g4 ]1 o1 A) A8 I& H

6 I" O; M" k  X$ LA.使用GET方式传值0 h7 u) ~' W6 ]6 ]2 w7 x- @5 k  `
B.用htmlentities()处理电子邮件地址
7 y" k; D9 B+ z! SC.使用POST方式传值; i6 f6 }0 K9 e; O+ G" |' u, A
D.用htmlentities()处理邮件正文
; m4 U1 A! [/ T! v9 U: h. `E.确保填写邮件地址的文本域不能有换行符
4 w5 N1 w+ F; q/ L) |7 D! y; r+ H/ c% q( H/ v

5 n# p1 f; c3 z* V5 v$ \: D' M13.如何将一个数组作为附件发送,并要能在接收后重新组合?) o6 G. _' K8 I* i

/ j; f0 s* Z9 m, r" |A.用serialize()把它转换成字符串,再用htmlentities()处理一下
* c6 c( H- r* W  X9 oB.把它存在文件中,并用base64_encode()进行编码9 f  a  _2 R( a& y/ ?% Z, _4 m
C.用serialize()把它转换成数组
' _) _* T+ H* p  D9 @+ iD.用serialize()把它转换成数组,再用base64_encode()进行编码
7 C% W9 Y5 g& r( E7 J2 q; J' [E.把它存在文件中,再用convert_uuencode()进行编码
. p% u# I* O# Y  v
% Q+ k, F0 @4 F5 t0 @) \& Y7 ^7 D# {- n" F+ I; ]4 S
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
; T; E# O* e! W8 }& E$ m! f# m' M1 ?+ t  ?, X  K0 P
A.堆一个检测脚本出来# @' K/ E- h: a. _& k/ v8 [# q
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型1 V5 K4 V( i! U8 I  l& Y. C8 w
C.写一个识别文件MIME类型与内容是否相符的函数% F. g& V9 y; L% n) e$ ]$ p
D.使用mime_content_type函数
$ u# K  ~9 C8 n! |0 U% ]% h5 E5 rE.把文件上传到外部服务器上5 v+ G( A( d1 o+ A9 ^  `# G

" \4 Q% U6 O6 \' T% w5 A) x# u' `5 \9 y! X
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)1 e( _& Z- n4 m* U
6 ?& n3 d1 A9 m- g
A.添加一个From头信息" i" L9 e0 o8 f3 Z
B.使用-f参数
7 n8 m& b4 h# c8 h5 iC.添加一个Reply-to的头信息
3 v* t/ r" V: ]5 v# Q# W6 F' qD.确保运行Apache的用户有修改sendmail设置的权利
( g* K4 a2 n3 ?0 k7 J9 kE.确保Apache在root用户下运行9 S. S9 h/ `6 `. ?3 q
答案速查
/ j! t' P( \( g; U- m4 A1:D
" t' D) J- Y" A9 m2:AD& z5 o* L- u0 J0 K6 p9 ~
3:E% {4 k+ }' Z/ }! {, P" ^4 L
4:Content-Type:MIME
$ e1 Q" s% v# M/ M. v+ R& l$ ^7 H5:BC
; z$ \9 p! I% K, W6:A
" z5 a( k. k2 o7 T! h7:C7 a, d7 w; @& j8 V9 T. o! e2 o
8:BCE% v- X( N3 q4 ^/ a" G
9:ACD0 V( |: C% A( E; _  l1 Z& \. e0 V
10:B# f1 c. v% K6 {# R$ R+ k" O
11:D0 z- m) L* m+ |2 o5 i
12:CE
1 ^0 Q. m) ~! q$ l- }13:D8 z* X& O0 _$ s1 P% ^& v" Y5 a
14:D/ `" G$ ~7 Y7 \( s
15:ABD
! p3 f, w2 N# I& c; z' G& q9 n9 ]: |% E" ]
8 e: p6 M  x+ r6 r, }

+ \9 E. w8 Z4 H答案详解
5 Z1 N" y& R6 Q1 @! g/ Z% w: x* k4 y# c- b$ p4 q
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
5 ^+ x+ W8 @) r. s# A. _- K5 D* `. d2 D3 L' L' V$ [9 a
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。2 z; ?6 e/ q1 |

8 b) o- @& Q) y& y6 }* |3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。5 ^# H% G9 Q5 O- U, D- Z" Z

& n9 R0 J0 r8 p, v4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。1 c6 P7 Z+ k; ^/ B8 g
/ c3 U0 i5 _$ k6 S9 q
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。6 v& G- {/ e& @
1 b* i: N; p; T0 q+ `) c) g
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
0 K* L4 Y! I' Q/ c7 [4 M1 u' O2 A) L0 |  `: A
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# [3 S# r% O. G5 F% R9 e" Z

& j1 L, v/ a7 h1 D: i4 J2 h8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。( R, {( E8 w. Q. c

0 V) C4 j& G4 g, H* k. ]; X9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
0 h! I* z( @$ u; L; K8 a
* i  E4 e5 J/ l- }0 q$ _5 ?10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
5 R, z0 l& k: O( I" c' U! J
! ^0 k: D* S" K& r11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。( I% ~9 w7 |, ?! S! V+ m
* L4 S. e& w, Q4 K
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。. n  \/ U& p9 {6 }) h9 T4 E# q  C

5 r8 `' y" d" _, p13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。- s0 P5 ^7 N( V8 I
. J+ k/ ]3 c8 c! F/ v- i4 x# y2 L
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
2 E3 H& ?' }, m" U/ `" E  k
+ Y0 L7 \( `9 o' }% W7 v4 T15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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