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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
3 r' }  U' z# B  b$ Q还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。+ K5 O' y+ ?0 I" K7 }
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。' Q) ]; s6 O8 e7 E

/ e" j1 K4 o4 N1 M0 w" D% X7 Y3 U& F
问题
2 G1 k8 Q" _' Y# E6 L3 v
  C! w* G+ P% m+ I1.以下哪个不是合法的电子邮件地址?& C/ y. Y- F' m$ x( G- s" S+ {! O% k

1 r) r/ }; t3 d: uA.john@89w.org+ d+ A; J. `# H3 Z( }
B."John Coggeshall" <someone@89w.org>! n9 g5 k: N3 Y% w& h' e9 Q
C.joe @ 89w.org$ S+ c  `, K9 `7 c0 p
D.jean-cóggeshall@89w.org
) l! ~9 C' A: gE.john
' ~& k# B8 s0 T& i0 ]4 E2 z+ o
" j: u, q4 L1 B4 J8 |7 X: Z6 ]- z0 d( y8 n# z
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
# Z% X0 c) n! A( o' t
* |) [+ e2 s0 `; W/ H- \& OA.Windows/Novell不需要第三方软件的支持就能实现该功能1 t9 Z- M2 m( {! j0 d! q
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
/ v( Y: V' h) C: `1 S4 u! VC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送+ F3 y# y  s) s# p! f. @4 E
D.有可能完全相同,这取决于sendmail_path的配置
3 J1 j0 v# @3 R  I% pE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口% e) Y7 u2 k) h( ^6 [
2 ~' _- R5 Z" ~( E$ Q

& o" `4 }2 t( l. J9 N. f" c7 m3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?; c9 A: I7 C) M- m: ^! k

9 T! u  G1 w% KA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数. L0 P* }8 ?) X" @5 L% G6 |2 c
B.用PHP代码,通过SMTP直接与MTA连接。
3 C" Q& g3 `0 YC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
4 |% M! J: @- ~) fD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
) o- J6 w4 ]+ k# gE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
/ {. O" Y- a$ ?7 ]0 _9 v9 L4 P/ w9 s, G- h9 |" _' K

  D2 `( h( d2 l( M2 @4 ?: d2 V6 v& U4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?# A& n9 J8 B; K- A& G) Y" s1 ~

1 d% d: C4 W1 q5 \/ _' ^答案:____________2 W# ]4 `9 s6 x# |0 Q
6 h* q3 @& P! ~7 |5 i5 m2 S6 x7 \
2 x6 R3 z" f3 V% M/ B! I; C1 J( p7 ?
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选), q% H9 f. \. A# r3 T8 c

6 ^9 \' L5 C7 k) t+ u9 f) tA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示# x7 N* w8 h% i2 w& T0 z$ |' N
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
, P( }# R9 u2 a  }4 AC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID, d  m$ ^! h7 i2 {" R" ^' H
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名
' ?1 d+ `* `+ m* P" UE.只有一个答案正确
' L' A& G8 T! j) o# l8 t" ~2 Z3 v0 v0 D8 ]
8 U4 R. G1 Q' \% D' B. }9 F: L/ x( S
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
* g- a' y% i) i- ^! @
0 u9 X5 \/ ?, n; {; h" UA.从UNIX或Windows/Novell发送邮件时都会用到8 [+ J  ]" Y6 }
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时! U( ]8 j- R# I- n7 N, z- y
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
/ z" C: K5 M/ t: rD.PHP里用不到这个参数
) V# y# ?! u, h9 @2 p
% Z1 F3 k$ O0 A  ~9 F. A5 M2 _# S- D+ c& v7 g# w
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
' ?7 j/ {: Z+ y( b. e" E0 D
2 ]4 R) J3 K' D6 E) OA.只有在发送非普通文本(ASCII)数据时
9 Z( r3 `9 D1 G. ?- f7 g1 HB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text). o1 n2 L3 X$ o
C.任何时候都可以用它来指出MIME的编码类型" J/ }) V# w6 e4 L
D.只能用来指定特殊的编码格式(例如base64), R3 \" w) }+ U$ n# x. x8 \8 A
E.以上都不对6 ?, D: ]9 j% I0 g4 L( j( f

7 E( U5 N" T) H9 L& q8 j8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选), m& ^' G0 S. o1 Z  \+ X7 @0 G

  X: O$ z8 B7 C0 tA.分隔符至少要8个字符  I. N$ l3 ~: ^) J. R. b
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
% m, Q8 X2 Z' G# lC.分隔符在MIME邮件中必须是独一无二的- t2 r9 q' b, K: @9 j
D.分隔符不能嵌套的其他分隔符中
& d4 b+ p* [  g/ U. {$ JE.用什么做分隔符都无所谓
3 G' t& \/ V1 _2 B. ?: F* h6 X6 V8 V9 B; P# F3 c: f2 V! {

5 A; p- f- r' ?4 l9.考虑如下E-Mail:' R$ }5 ?& c* M$ w5 j: l
9 a( E5 F+ j: {
From: John Coggeshall <john@php.net>
3 ^* D( Q- T$ d# z$ D5 [8 b4 n2 h& BTo: Joe User <joe@example.comt>$ y6 u  D* t/ H+ p' b6 z  _
Subject: Hello from John!, P: X1 ]) @6 r0 z
Date: Wed, 20 Dec 2004 20:18:47 -0400
# D9 [$ d" b! E; }) `9 N; qMessage-ID: <1234@local.machine.example>
1 X  l. R9 k, A" R% E( AHello, How are you?
0 j6 u1 D; X. [# F. K2 o6 h+ _' f4 `- F1 Y3 W
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
" q  Z( ~" h7 E4 Y: f( X2 K8 V$ b5 `. s, K$ ~
A.MIME-Version
1 [- D+ f- }6 B8 dB.Content-Disposition/ K7 W' u; g( b; u. E
C.Content-Type
9 `) A; L6 ^: s" R/ b& [5 |4 f# cD.Content-Transfer-Encoding
8 a" z8 d& Z& G8 XE.Content-ID6 c( ?( Z( u- h$ t# @+ C' _; {% r

4 i' i6 O+ A9 t' G+ m0 J+ R7 }" P: j( N/ k; D1 j
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
. g( @4 n  ~9 o
, H+ @* B, w" z  Y  ?2 f2 wA.multipart/mixed! k( I# \( K$ l4 ~# `5 A
B.multipart/alternative
% a. c% I) D0 P" gC.multipart/default/ z. B8 Q. z! t
D.multipart/related
' x, O' W% R, R, ]$ v3 uE.不可能用content-type实现
5 w+ t! W0 G" K; _, V! M! Y# C' H5 j- F8 A% G$ K! N
* M; D) O4 C* u+ b+ l% y( Y
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
; ?, m4 U$ [7 o  [/ K! N6 v7 t. i/ e7 W4 Z# B7 I  g
A.安装sendmail服务器
: |# ^) w4 k" kB.安装Microsoft Exchange
" X# z1 T2 o" q! l: i1 kC.在你的电脑上安装任何一种邮件服务器
+ m1 m1 @3 Q1 WD.改变php.ini的设置7 @. P, `. Q8 h- q
E.写一个连接公共电子邮件服务器的脚本
4 M8 j: o: `3 H( Z; S
& b% }8 _) O$ ^. I2 H, q5 {
0 z, J6 N% E/ A  ?12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
4 E% Q( k7 p$ n8 Z1 s& I4 A/ p
- v9 s% U& h( z7 EA.使用GET方式传值
+ V; m/ W+ q% h( ~# EB.用htmlentities()处理电子邮件地址
3 `1 O& t5 ^* uC.使用POST方式传值
' u  @( Y' q5 B/ iD.用htmlentities()处理邮件正文
% Q7 D9 I1 g: U5 n/ D: PE.确保填写邮件地址的文本域不能有换行符
' W, ?; y! `, G$ d  R
: h$ g8 g, j4 q: l
( m: C3 t/ r# L& V% z( |13.如何将一个数组作为附件发送,并要能在接收后重新组合?# P' }* |0 R, v0 w( l1 R, W
! ~8 K. v6 w. w
A.用serialize()把它转换成字符串,再用htmlentities()处理一下7 T5 b4 x" i0 t5 p
B.把它存在文件中,并用base64_encode()进行编码& p2 W* j+ U  P" T9 G
C.用serialize()把它转换成数组/ L% B# Y" d% b0 {5 P, l% {
D.用serialize()把它转换成数组,再用base64_encode()进行编码
% [' V$ e! `' S6 Q" [* cE.把它存在文件中,再用convert_uuencode()进行编码( @" s7 d- U; A" O

, Y, Q1 [! y1 N6 ]# ~3 U
* G6 O& `7 m0 A8 ]9 [( s9 E, N14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?$ E0 I5 G0 m: l. ]- Q% |( n
% d  b. I/ N. M& L; e' a1 p( u7 t$ H- H
A.堆一个检测脚本出来
; i. R4 D/ X! a: `! TB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型. U; `5 U3 A$ B' B
C.写一个识别文件MIME类型与内容是否相符的函数1 l2 |& D1 \7 a, N9 @& p2 U
D.使用mime_content_type函数5 S0 G. M6 W  E% p8 N" J" J# j4 n
E.把文件上传到外部服务器上
2 \, m. [  X# D, H! l8 l" {. E
, @# Z8 m. J, X/ v: [) ~, i+ H! [& s- J6 u
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
$ {0 p. x5 U" t' ^" ?6 W
, o6 u* q. u5 `# C7 X; zA.添加一个From头信息
/ W, r0 I* ~1 ^1 KB.使用-f参数7 `$ V0 p2 g1 N6 F6 L; W
C.添加一个Reply-to的头信息: m* M+ a$ t  W* t6 t& s4 n
D.确保运行Apache的用户有修改sendmail设置的权利
# _0 f' [3 \$ k! T. Y- N: O/ AE.确保Apache在root用户下运行
2 R0 z0 N! I3 c答案速查6 s, Z6 }% B; b8 Z& }8 }% e
1:D
8 f4 Z( M& l* W# J" @, K2:AD
( p$ z* B( t3 e9 |) d, b) O3:E9 ~) U$ c' x; d% k6 G& d  Y
4:Content-Type:MIME
: w# z  T( w/ l( F7 N5:BC
& N3 v+ Q, r# r4 p* |2 U6:A
6 o4 V% E1 `4 Q8 {- X7:C
; P) }" W, j3 w  w# y' [- z  X8:BCE# \4 e9 n* z+ U& j; \& Q0 q
9:ACD
9 k! d0 L& {, X% Y* f  T10:B
+ _: m. y$ {$ e0 `' A11:D
4 y0 @5 t7 B: v, ~12:CE# k; |+ t2 y( I+ Z& A" S1 a
13:D
& P. v$ p* s; l: J% a: @14:D
* {$ H  O0 M  m2 G* {: K15:ABD
+ v4 B7 w+ c5 A* `7 L* K
3 L5 A8 V3 U* d& C2 _* G( L' {* C0 s/ k9 y1 p+ s) R
) b  A1 V  M, M- b% S; L
答案详解
. I- B7 a# ]5 t8 E; r0 W+ P- h! t2 s
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
% x3 T6 e1 s; D/ _6 O2 r! g* g5 a7 s9 W' c+ _
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
* I' P7 u; l' N$ |8 \( H# C* Q, b; d, B& b0 i0 N
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
5 v4 Q3 K/ b2 G& k1 o, Y5 x+ J* k# y" J( r% p5 B4 h
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
" G' ?% |+ m* O7 S7 p- w
9 z( o) R( A, s# L5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
) ~* F; a, O; n3 H$ m+ t7 ~5 C2 I2 S
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
( Z, {) _- a: T3 |, ]& h  h. D, M6 ]0 T/ Y- G
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
; o& I" [" t. ?7 x" l
' K5 l& L. X5 F7 ~/ S& ?8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
6 Z$ M+ x2 Z, b7 q. l  Y' l
: F( ~1 _0 y1 c" q: R9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
8 N4 l* x2 U/ _! l$ O8 u6 U/ E. ]  C3 o0 o. t+ }9 }% G7 P1 g
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。1 {  z  [$ d6 O# {/ }8 F

6 ?8 c4 [+ w8 A3 x* ]( a11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。& K$ u) c, J0 D2 m1 {* @
0 `( m0 X6 v/ V  R% I1 K) i
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。9 ~* N; s/ S& b. S- |' g

. _* C- Z# W3 F13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
& {0 [7 h! {, O2 d
# i9 ^2 o. o4 R+ g1 V  B7 n' g14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。/ v2 ~' J; H3 [" L4 Y) p% w" y
2 ^- B% _3 _+ v  @0 Z* B- K
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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