返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。0 y( ~' F: _: Y- D
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。7 J4 g5 r8 b* F
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。8 z% c3 c+ G* l  r
+ [6 A! f+ L3 D# `; W0 x. s0 u

; x, M  P$ J$ x3 [3 p8 }问题( F6 r- n3 S& K% v1 `
& i% i$ |' B! R6 Q. i$ V' `
1.以下哪个不是合法的电子邮件地址?4 r0 o: y3 j: A
; c  E6 _3 S* V, Y; `, O
A.john@89w.org. a( z. i& l6 P2 v- F* s
B."John Coggeshall" <someone@89w.org>, }7 m0 p4 L4 ~( M$ N
C.joe @ 89w.org7 {0 T" W  D) ]
D.jean-cóggeshall@89w.org
  E+ k7 |- U5 B+ tE.john- O% [4 v  b0 |* J8 u' L

: d( x! f) u: d* |! g. N) w' [
3 T: x2 X* z; _8 N2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
  M4 K" q7 [5 G. T" Q  M, O
% Z$ b! X4 Y6 e; V4 ^8 t. N2 n: lA.Windows/Novell不需要第三方软件的支持就能实现该功能# r, x! m$ p- A6 X% ]* n& i
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
7 i) T4 F, |, U9 C! rC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送4 G' N; Q3 V- N$ O; {
D.有可能完全相同,这取决于sendmail_path的配置
$ a% `' D/ _% Y3 NE.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
3 X& A& K0 v* d2 M  |  C+ s% i" t, I/ ?, j7 Z) G2 O' o
2 y2 N! Y, E* L( Q6 X: _6 k
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
4 |1 s, D7 h* \+ [- k  t5 j" ]% z) _1 s0 i- d
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数( \$ `* z+ f$ v/ Z' ~9 a8 X( Y
B.用PHP代码,通过SMTP直接与MTA连接。
/ N5 N5 J1 A- V9 z8 tC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
; F4 A1 j% T' Q( N9 ID.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。: R9 m8 M' w: O$ J/ c. Y, }5 z" \
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾7 M0 o4 E- ^$ |  t
, i4 p3 W0 k" H8 x6 F
) ~( S* M: o- X9 F
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?! ^2 m$ {: D8 t. V# r" ^' a4 D' C# J) x

5 U9 s$ |& y* ?: X: N答案:____________
' W- V7 w0 w" c0 G' {0 ]2 H. a3 ]# w
; H5 |8 g; X! M6 ~: H
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
  D! {6 H4 I. y' V2 ]  }7 x7 q* _! r* c* O  I& g5 @
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示9 B: t, r! k" n. _2 X
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
7 @1 u) [; N7 ]# BC.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID( c' Y: c, Z5 Q; h& {/ N
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名7 n4 }# [- o3 q& U
E.只有一个答案正确
8 L  X$ L* y; \" P; d1 ]+ m  m# _5 D" f- X" [/ I. K% v, [9 e5 |

# ~1 f- `* p) D) T0 f6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?- [! \) w  }4 N
" E9 L8 K7 j" D; [/ t6 D) A/ r
A.从UNIX或Windows/Novell发送邮件时都会用到% m6 c/ w4 w- _. F% \
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
$ j5 ?3 [( R. cC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时' {% M& J( v7 m% d. b" O
D.PHP里用不到这个参数
6 R, p9 p7 c# o) U; _% C2 a/ |
6 d9 u' L4 I! q# u# A# U) n! X+ }. f5 s! n
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
* D6 T" ~% d. F: T0 c0 o; X; V4 \% T3 p6 Q( c$ f1 e. J
A.只有在发送非普通文本(ASCII)数据时
8 R, v% G0 j& c$ ]$ \! C" A) qB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
: f- y: Q: I) y! L9 d8 n, {- gC.任何时候都可以用它来指出MIME的编码类型8 f2 `5 s. r8 t9 P/ M+ K
D.只能用来指定特殊的编码格式(例如base64)
* ?. J; z# Q! V3 |E.以上都不对. {  a; e" D* X% n( P" G
% w7 V  R* H# b* e
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)) |4 J+ y( g: [- ~3 v5 k5 I
; T& i' ]. F  _
A.分隔符至少要8个字符+ h7 J5 Q1 {. J( r
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)  c% ^! e3 B1 c" `6 N
C.分隔符在MIME邮件中必须是独一无二的  r9 Z* s" w0 U, ~! f
D.分隔符不能嵌套的其他分隔符中2 Z2 x) k- R5 T
E.用什么做分隔符都无所谓4 j+ W6 ]3 g5 s  \9 w
' P. f3 O& B- h) }4 U$ `" ]
; K. Z: i- n, m2 M7 J* R* r
9.考虑如下E-Mail:
! |! S/ {. I' N& [. _5 }7 D% n: N
From: John Coggeshall <john@php.net>
) N- \' d( }  W! ~To: Joe User <joe@example.comt>
, ]! H0 l7 C2 @Subject: Hello from John!
7 S3 I2 s& a% F. `' i/ [8 cDate: Wed, 20 Dec 2004 20:18:47 -0400' r: d5 y! u% l% h/ W3 J5 I
Message-ID: <1234@local.machine.example>5 f: ?5 ^8 N, o2 U$ O5 E  }
Hello, How are you?
3 @* J( l! R7 q$ j' A  B$ h1 p& O7 Y9 ^1 p! S9 ?- ]) g+ p: O
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
0 h/ o5 {) Z& ]  U( k. U' u
2 Z% M! ^! D5 c5 XA.MIME-Version
; g* ?2 @9 _# k! |5 P4 j$ w& |B.Content-Disposition' Q: W; n; D* H; y0 X$ M
C.Content-Type/ l! r, f0 T$ K, t
D.Content-Transfer-Encoding
' C  }( T1 g* ^: P1 SE.Content-ID
8 G$ H* e$ ?* n7 _+ y, W: X
+ |: m3 R) F' c  k9 f( q. m. \' i( H; B
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?" b: s2 Q  X3 P8 q  s' c% G" }

8 O  u, r9 U. E8 SA.multipart/mixed
) L" o+ c2 w% {B.multipart/alternative
# h. L/ e1 o0 W5 h/ n3 ~; YC.multipart/default
( r2 {, D. z- N/ ?# t, `D.multipart/related
+ {/ |% T/ X* l! z5 n" GE.不可能用content-type实现
" n' {6 i% |  N- C7 K
% S# j# c5 O6 F5 d' t8 K' i
0 }) D1 c6 J2 u* [7 o11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
" z5 X% @* `4 P* g% i3 R0 ~7 s0 ^, Y7 z8 p6 `& ~5 B
A.安装sendmail服务器. n( `5 F8 X5 H1 J' ~/ b: O% r
B.安装Microsoft Exchange2 x4 g$ H1 V# V9 d+ [$ Z: {3 _% i
C.在你的电脑上安装任何一种邮件服务器" h  w0 v: w  t" }- X1 l0 t5 E
D.改变php.ini的设置/ Y# ~4 W  [) q; J
E.写一个连接公共电子邮件服务器的脚本
8 |( o! Q7 C* b4 Z. g& W9 U* D7 y8 `3 `
" t+ x  n9 Z3 A1 Z. g. U
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
( S9 z) e+ J8 b: c& g( @/ ]
+ g( }: l9 r2 B7 U5 G9 \% c! TA.使用GET方式传值" N" E( }4 D* N8 j+ J
B.用htmlentities()处理电子邮件地址% T* B/ {' I9 k# [9 P
C.使用POST方式传值% |; i( @( L+ i9 b, J
D.用htmlentities()处理邮件正文
( p' ?. V0 U" L/ o' i) sE.确保填写邮件地址的文本域不能有换行符
! d6 r) K! F" g( G9 G5 p  Q+ y% t# N6 z% B7 [

. D5 |% K- e% }  y0 t+ [2 L1 b$ t13.如何将一个数组作为附件发送,并要能在接收后重新组合?
. j& u* s1 V- j) J
6 X. C, U* F$ n" R6 G6 n, eA.用serialize()把它转换成字符串,再用htmlentities()处理一下* m0 R2 O" e& R# B1 y' @
B.把它存在文件中,并用base64_encode()进行编码* J, v7 [9 \" w9 n8 Z6 X
C.用serialize()把它转换成数组
, g9 G; @, b7 e, H! FD.用serialize()把它转换成数组,再用base64_encode()进行编码
4 {2 N' `+ b& [4 l9 nE.把它存在文件中,再用convert_uuencode()进行编码* g/ R  L7 j0 ]( A( e; P
; W" K; U) c0 n$ ?' T) }" k" t

4 z3 e# s% o6 g14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
- X( F9 h/ T5 o+ Y9 p- O
# K  f! h/ a5 b1 xA.堆一个检测脚本出来
: N9 C& x/ L3 [1 D4 J4 b- KB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型
6 }) Z$ m7 p2 s5 Y/ |' t5 tC.写一个识别文件MIME类型与内容是否相符的函数! Z# O* S* k! `0 m4 m& }
D.使用mime_content_type函数$ M2 ^0 A+ @. R* m& D. B( H1 M( m
E.把文件上传到外部服务器上# m  F8 W; R9 _7 d. a
* D  |% V  V* D! d
' f1 C7 t8 G0 _, U" @; |' m
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)+ Y% {6 T- V6 z' g3 d
3 d, t' Y2 X1 y' c! L- s9 v" |! e
A.添加一个From头信息" o4 N) U& A$ X
B.使用-f参数
$ S4 F  e5 W& P% Y& o$ Q% vC.添加一个Reply-to的头信息
+ n  V" y' m" {$ fD.确保运行Apache的用户有修改sendmail设置的权利
& a& l0 K  f0 Q7 c. M6 a; `8 p: SE.确保Apache在root用户下运行( {7 J( N% s: s( w# r5 Q* ~# X
答案速查
5 z1 t) ]' p3 J" M0 C! P0 R6 I1:D
" W8 x1 d8 j5 m2:AD
# ^2 f: O* n% V+ g; F8 O5 i6 N5 G3:E
7 q3 W. \5 z1 M* O0 V4:Content-Type:MIME
- H1 g$ |7 e1 Y& T# T2 d5:BC
, ^. f1 o0 x% T6 ]) l6:A* o% @2 J/ F  I6 D  r
7:C  i; @, F# p( p, n) r0 L9 j" G
8:BCE
! g7 }* K2 f8 o$ q% z% S( \9:ACD
  n) P6 H1 [  w9 J2 U! P1 n$ Q& e10:B
0 `& ^- A0 {9 f* ]/ P1 ~11:D+ l7 X9 g3 D. I3 q! z3 ^
12:CE) r) j0 o/ M. B" b) K4 O3 u
13:D* J( A7 z/ F2 H
14:D
/ ]1 e, b1 d& T8 f+ b15:ABD# T* m$ U0 B  Z

  k/ ~6 P* S& ~
4 K) O3 {% l  @# a6 y  f" J
5 B$ j6 Q% H8 @+ i$ _" P答案详解
" L" X5 K" H6 {  `, S! B( M4 D# t, |: M* [1 t6 J, Y
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
$ a8 l% C9 U: Q3 ]7 F1 R- F9 i3 l4 U( [9 ]  l+ Y3 ^
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
  z& L8 j/ p5 p2 l1 }6 U  n6 u- l$ }8 O7 V
: w$ W, I1 K, d* w3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。1 D2 r5 c3 A: q& L

. ]0 M% u  V# I' w3 F4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
! {1 x5 Q% W. I4 t! \0 X* D6 `: q$ K/ ]1 e  @, m( A, T3 Z  u; {
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 _- H) m  c7 M/ K4 Z
; V* d/ q  q3 I9 j: t6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
' u& P( D2 b3 W2 S2 a7 W
% T7 W" F( {  q4 l( E# p7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。( L  l2 J9 Q9 E# _
9 r9 o- `+ d4 C
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
9 t  Q+ i! Q0 G
9 M7 u3 d2 s/ b# u, U9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
. o1 k% q* a5 t3 _7 z. B; G
1 v$ g# p# \! L8 O% o: r3 `10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。$ i7 k( e$ V* `/ p& K7 w# u
7 @7 _; V% e5 C  v; D/ M
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。5 [% j$ S% [4 J
7 d, K# q: x  q$ }( {1 P- ]7 L7 ^
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。( N3 v( g, [' g7 Q5 M0 N

) }3 P- w. z/ x. d5 b4 |13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
: H  [- F+ n/ a  B- _. w) ?$ `. e+ B- Z6 L) n- |& {& U5 q
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
( H6 O5 o9 h2 ^% z' G7 ]0 d4 r  D9 R+ V( J8 \- K0 g
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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