返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
4 ^, O' x: v/ a& |' a还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
7 r% P; x# G% S! Y, U/ f用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。2 E3 x% a% K& H5 d- J

2 b& K8 ^5 L0 O: V! c. Q6 f* f* U
问题
: [8 B- |+ r0 t& D& q6 X6 Q2 P- q: J- ?4 b- E5 I2 g& y  \: G
1.以下哪个不是合法的电子邮件地址?, ^9 N8 C+ _/ u3 ]/ B0 U) [3 Y" r& e
: ]8 N0 q) y4 P& D
A.john@89w.org' p& L0 f4 e4 ^0 v& f9 t6 R
B."John Coggeshall" <someone@89w.org>( R- {* Y9 O! n
C.joe @ 89w.org$ s6 k- k4 I( j. E$ x0 f3 k% m
D.jean-cóggeshall@89w.org
6 e/ j3 i7 j3 j0 G2 I0 n+ u# V- g: ^E.john  ]) u* M8 K* B/ N4 k1 |$ `( K" S3 K

0 L( w( W7 L* R2 }
1 K  k6 v% _. o. g# g2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)1 a( ?; n3 p  N; P2 o2 r

" ]0 P, F: h( |6 mA.Windows/Novell不需要第三方软件的支持就能实现该功能
7 u4 I) Y& _! X8 r" @B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。. X. m# m4 J5 y# e! m/ T2 C
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送& D2 ~( ?' @2 G+ I
D.有可能完全相同,这取决于sendmail_path的配置! j" n6 M" H& _! I% V1 R! \
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
6 [. M* \0 o0 A" t* n
0 ]0 k! g% T* z( |7 H7 I
% s) T" Z3 g: ]6 O$ B3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?% D2 M, N5 g: J, {  X

0 p; l3 b1 F+ e: T; M5 t, H& k9 t1 oA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数# O8 L8 C, j0 r/ ?' d; q  C
B.用PHP代码,通过SMTP直接与MTA连接。' J, V2 u0 R2 j( S9 L
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
3 Z1 {3 ^9 f5 m' R! e2 MD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
( K) G( z; \! p9 OE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
: R( F! @6 E! a0 o* Q  N; M
4 u; a2 P, {4 E& W' u1 X, b  c5 Y8 ~7 t
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
/ [% h' h+ ^2 I4 E! m6 s( T% O/ `0 C5 n
答案:____________
; U0 G. t2 J" Z( D9 B/ @# Q; h& L7 I3 d, T5 g( ^4 j- o
( s# V; |3 G! D$ D  E# j* W
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
5 v5 x+ Y- g5 I  J( |' M0 V6 ~$ H, I/ @/ S( ~4 ^% c: p7 Y
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示! ]# u2 y/ h8 |# F: @" B! |; m. ?
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片2 q; g8 P8 ?, }: I$ W) e
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
, @; Y% N% w% s, E8 m$ \D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名0 ?  o5 }9 C+ m+ n: W* t
E.只有一个答案正确
+ \/ S- P* h" ~& @3 v! ~5 Q) X3 \& f# b  i% S0 u

) p% g5 Q' u) a' R2 m6 Y' f6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?; \& X2 U' N3 x5 K3 A

  v0 q6 Z! P! S# n6 [6 }1 `A.从UNIX或Windows/Novell发送邮件时都会用到
) P8 s/ t6 m) pB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时7 |5 y; J0 `! A1 k4 K: Q" ?
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时7 C: M; j, D$ i1 A$ d
D.PHP里用不到这个参数- z9 a( q, {2 R4 K
. X$ ~, N% }+ N) W1 u
+ ?  ^  u/ @# ?, e7 H6 Q! k
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
- o2 t1 c* `& H% p8 z+ p3 l1 ?
2 d$ M% E( z  X( x* ~A.只有在发送非普通文本(ASCII)数据时
0 A! X) T$ y2 c! S! k6 _3 I6 MB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
0 G7 L7 f! X5 |. U: I; E7 b8 fC.任何时候都可以用它来指出MIME的编码类型
/ z1 A1 S5 K) }8 }7 ^D.只能用来指定特殊的编码格式(例如base64)0 E$ @- }+ s$ T5 a) }# v( X- c
E.以上都不对! f& l7 e5 o/ d( }8 b% r" W

% P* g$ s9 F5 f0 D8 z, Y- C8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
+ @; O+ `! I2 z+ _, E2 J9 Z! o$ E8 ?, b  ^
A.分隔符至少要8个字符
) w6 ?" {3 \3 w8 E2 tB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)( Y' B, w+ Z+ @; e
C.分隔符在MIME邮件中必须是独一无二的
$ V7 l5 x0 }+ a6 V  D! \# tD.分隔符不能嵌套的其他分隔符中* K1 L: a  g8 v7 d, d
E.用什么做分隔符都无所谓* ]3 Y+ A. J9 q+ \

/ W, b: f/ U# q7 B
9 O1 G2 u. q& Q9 W9.考虑如下E-Mail:
  {4 _  _- o* G
$ k1 _8 p: s/ n  J1 w" UFrom: John Coggeshall <john@php.net>$ x2 C4 J) ]* h" B$ n7 r+ F
To: Joe User <joe@example.comt>9 ?/ G& d) Z, V
Subject: Hello from John!
3 |7 d$ Z' A0 R( b1 nDate: Wed, 20 Dec 2004 20:18:47 -0400
4 e% [% M5 F' R* j# XMessage-ID: <1234@local.machine.example>
8 H4 w. @. q- X1 t% y& f1 zHello, How are you?
8 W( _2 ^) Y' \7 \8 P2 }2 _$ _
- r4 j- W4 C, z& F. S8 E在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)7 F+ ]! I4 u" V) _# S
* D& A8 E; ^4 `8 @9 t) @# `- T" P% G
A.MIME-Version- g; d8 \8 Q5 `  `* x2 \7 j
B.Content-Disposition( Y7 q! a- y  _4 s' g% T  a& l
C.Content-Type# ^4 ~1 a' f4 i; _7 j
D.Content-Transfer-Encoding
! _6 ?7 ~- H1 ^' R  x# bE.Content-ID4 o6 ^- h- I: t: n
. b& L/ H- U9 T0 s

9 e4 s5 U7 f6 H1 y2 m8 r10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
' l  z( X( X3 F0 c, O& S- y* k& Z8 Z, X1 p4 J
A.multipart/mixed$ g# _1 ~% B, u' q
B.multipart/alternative& }! |5 A0 A% L0 d
C.multipart/default% ]# g0 U! e2 U& Z) f; W! l
D.multipart/related
6 K9 _0 w9 h, wE.不可能用content-type实现
- h( E6 U1 `  |: ?8 y0 q' d5 A- v2 V3 d+ i2 k7 p+ L5 ~3 ^: H
5 c7 R# o2 O: `  C
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?- n7 t6 K. d6 Q" Z
- \' r7 X2 i) O7 ]
A.安装sendmail服务器
. V/ }' o7 g: U2 @, y4 SB.安装Microsoft Exchange5 `8 M; t' y. ^, }, e+ x
C.在你的电脑上安装任何一种邮件服务器1 p% D/ H+ G; H) u5 U6 H" @; V
D.改变php.ini的设置; A/ O* {! `, R& v. w2 h
E.写一个连接公共电子邮件服务器的脚本8 `7 l& _. m, H0 M  E9 M
. g. g1 _1 H6 t; g, g8 b) T

9 v: u* }: v% f4 r, A! l/ I0 Q) S12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)2 ^9 V+ p8 v( @/ P0 I! f! D

. ^9 q8 J( [4 d) Z( y3 AA.使用GET方式传值
' @, s4 {9 u  k9 nB.用htmlentities()处理电子邮件地址
! V2 G( U1 G; [1 K8 WC.使用POST方式传值
" H. ?3 O+ w( S% {D.用htmlentities()处理邮件正文$ i' O1 I! {& w
E.确保填写邮件地址的文本域不能有换行符
" d, L0 ]  e6 O* C
, c9 O* E( a. O8 y' T
' w3 Y- z! \& B# |13.如何将一个数组作为附件发送,并要能在接收后重新组合?
( q- O: {5 y! O: k6 j- H$ {+ K# f  K* k! K  ?; I4 {
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
2 h. V: V5 U1 L, gB.把它存在文件中,并用base64_encode()进行编码
# J; L$ ?1 Y' d0 Z: k$ PC.用serialize()把它转换成数组1 R. y+ F& |4 o4 Z% `
D.用serialize()把它转换成数组,再用base64_encode()进行编码6 t8 \) U; \; W: K+ E
E.把它存在文件中,再用convert_uuencode()进行编码9 z2 G5 |) A* \% r, K8 }' b
2 l6 h; J' M  q0 a+ D* R1 n& h
$ ?  k5 L% F! s* A
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
0 G& a; Z: H- e9 H$ O4 Z
7 B# C, S% g! _5 i* F# WA.堆一个检测脚本出来2 M  e; T1 b( K- }7 l1 z
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
7 K% ]( b3 C: N  V; qC.写一个识别文件MIME类型与内容是否相符的函数4 n; q0 {. Z4 y; ?" D. A* k2 o
D.使用mime_content_type函数
" }4 Q6 G/ ?  H3 K) W! BE.把文件上传到外部服务器上
" [" @& U% T+ L- }* d, o  g9 j/ \3 E

0 J/ B  c( ]5 Q* a2 J# x3 M# f15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选); E8 S5 J( a8 {% g8 q
' P) e8 g& b) z  e% B# }
A.添加一个From头信息& k' i" U" J7 W9 B. m
B.使用-f参数
2 c5 }0 l  V" X7 mC.添加一个Reply-to的头信息% u: H/ J# M( f3 S! [0 M" u
D.确保运行Apache的用户有修改sendmail设置的权利
" p7 b! I1 s- o- {; c9 T* x1 h1 l) QE.确保Apache在root用户下运行, \: p+ K' X" F
答案速查
: a- J7 T* @$ _6 w, {+ s( }1:D# X* J3 }" |" k6 ]' m$ r) c! u
2:AD
# v0 W# F+ O. r3:E
1 s' a* r2 o' z- X4 c/ [- `4:Content-Type:MIME* v: V$ _8 o. U% O' f/ c
5:BC
1 g7 P4 _! `: o& O$ x6:A
. ]% z- U# _( Y$ c% l7:C
- X# A& ]: B1 i0 r" Y" t8:BCE
: m5 R3 I% v, K, h% b( V9:ACD
- i! W5 r( O+ P8 D0 u# H3 o10:B$ t# U8 p* `: r9 K! C
11:D% L0 `& `$ G$ l% b! P7 Q
12:CE
& D! j1 ~0 W! Q4 Z2 I( f1 T13:D# X  r- F3 f, K
14:D
& f( v* ~- f/ w: t. z7 H) F15:ABD6 C  C/ D. E' Z8 \/ M/ r

! y) k8 a  l" w' u) H% P: `7 S+ j1 c* S& q" e
9 U. e  h6 X5 z4 r& P% x2 r$ S! U1 M
答案详解
4 p* |' _( S! z0 p
) m4 g8 M# `* D& d3 {1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
9 V" B6 v4 k: U: x3 ?+ w1 y% W$ n; T  `
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
! h; o3 ^1 ?6 N6 w
# z4 e: T+ s8 l3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
+ q& k: X4 w# X. ^; w/ D+ I- L
3 J' E& P( ]! ^+ p- O- q2 r3 }5 j4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。  Y6 a& H4 d+ M& |
$ D' m# v7 w* |7 J
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
; q) H; y1 w9 h2 s) A7 q/ D3 W) a* o9 u" f; r+ \
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
7 C1 n$ x- x' _( M
6 ?5 J  I/ ^# j- l! v7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。# C( f. [% k4 b- v
2 B" m; P- m0 A
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
7 B" E7 r) o3 R" M  a
8 I) a: D6 l# R( {4 k* ]4 y  g* A9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
# S) j* v0 {+ H0 z/ f  T* a( O" [" Z5 I" R
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
3 o' c6 M: b+ R9 ^' Z! }6 l! @1 N
& v+ T. m' J% R, b% l11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。+ i+ C/ y! [  a! h; A& g. M0 m

% a& o8 G' z! ~' U, X: w( D9 Q12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
" |6 h. J* y% b8 `( k
# \  t2 p1 B: }+ w* z5 P13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
+ R7 F, s) Y! V
! W& q, `% X- p14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
1 ^5 w. m7 L9 o& d9 ~0 b5 i
$ F3 H% a: N4 |* ~( _, N8 b15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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