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

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

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

7 [4 ]% u) a  z, N+ l4 \" c4 B1 C  I
问题
4 M% H" _7 ?0 x% A# e1 ^+ r
8 S2 f( q0 S1 Q1 E1.以下哪个不是合法的电子邮件地址?
  J& M, x6 h, w5 m6 B" b
' h' j& _' _1 w5 E0 \A.john@89w.org" N7 N2 t( u% m/ @& `3 c" m
B."John Coggeshall" <someone@89w.org>" j- o: A" e/ @& j6 [# W# K
C.joe @ 89w.org
2 a3 ?8 j, ?/ X; {( ?) ~D.jean-cóggeshall@89w.org8 W2 x+ g2 }! k# r) B
E.john
3 T. c; G+ d: D3 Z; P  B! l
' E- m: n5 `1 l# C& T
# U1 K0 ]6 w% a$ T2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
! [1 M5 ]4 B* p9 Z6 H, r
! L6 K+ }# g' B8 ~. ?A.Windows/Novell不需要第三方软件的支持就能实现该功能4 g+ V1 K. U5 T0 v" h
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
' Y* a# |  E3 R$ v/ t* yC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送
- X9 B- `1 t2 z; X+ x2 CD.有可能完全相同,这取决于sendmail_path的配置
5 s5 b3 \5 D* W# k1 ^E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口/ b5 g+ j$ ~8 H% x
2 g# i7 J# q- W9 E
( z2 H: d; i2 J- X  u* X
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?5 ^! h" N+ z0 V5 u! V! V
. Y. t! \. f+ @1 \  I$ E
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数
% W" O; y% `  n: K" u. OB.用PHP代码,通过SMTP直接与MTA连接。% u! W; z7 J5 a  ?
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。- o5 U( M9 D" n; ]0 Y# L2 p
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
& Z! G! u) I- AE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
0 E4 @' s  s! N( V, g4 k
5 N1 |- ^; n* J* K/ M9 a* W! Z+ R0 X* o/ S9 W7 l# ]3 K( i
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
  \7 z- [* L! d  E% T" T9 e) d  \1 W9 _9 H8 U
答案:____________1 m& @! G2 `( y- D& Z5 V. A' b
8 `2 t2 S! r3 V! U0 s& S+ ]

6 |+ {5 q5 J. D# r3 J9 {* R5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
( g+ _+ D5 f0 |- ]+ l3 C8 d8 V. X$ p1 v. f& K# X% A! b+ Q/ C
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
( U$ _% }8 @" q% e: `' F3 \B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
$ G5 r9 ?: [# c' M8 |C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID2 ?& C8 }$ _& y( r. H/ K
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名4 {2 d5 ~, a: h2 m
E.只有一个答案正确
. X- M+ V/ _" Y4 `4 w' X/ h
5 `2 u# A1 P8 [: n; [$ L6 s; `2 i8 [1 Q
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?  x1 F6 [7 g! R" }6 v4 c3 }9 y

2 G7 ^1 V& {" j" T( G; Y& zA.从UNIX或Windows/Novell发送邮件时都会用到
0 i; N# J# @4 pB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
  g, y" d0 V8 y! f2 C  i7 qC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
  F$ U9 T' t6 G  l( y3 N, nD.PHP里用不到这个参数
; k4 N* A4 `, c/ R# o9 E
/ {( O1 @; _3 a; r& ?2 @4 M) L$ L% g2 P! p6 Z; j# P: t
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?
. C4 i+ l6 l& t
$ z! c5 _- b! g8 }9 [9 BA.只有在发送非普通文本(ASCII)数据时8 Z: F+ a2 U( g9 ?1 j0 B& D
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)/ d# `8 ~" a7 [
C.任何时候都可以用它来指出MIME的编码类型
: H3 R( d5 m3 ]0 `D.只能用来指定特殊的编码格式(例如base64)* e, z' ~1 k* S4 ]6 _- R$ Z
E.以上都不对
, o. C. b9 i/ D* ~4 i4 _: ]
( ]  f+ \# u5 D. j. O* P" x+ v% B8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
. ^9 H/ U- t1 |5 m  U
" _9 P! b4 D6 E0 H9 HA.分隔符至少要8个字符
9 f  H9 p: w. {B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)- v9 p; u6 \* e$ t4 q5 Z
C.分隔符在MIME邮件中必须是独一无二的
0 l, g7 l- u. {" @8 tD.分隔符不能嵌套的其他分隔符中+ O# L" }' U  W  Q8 ^. \. @- e
E.用什么做分隔符都无所谓
+ L7 e7 @! B9 U. `. ]: _
/ {0 }, `+ B" w0 V/ P+ M& v" \
9 z- D# j/ i0 `2 `2 U9.考虑如下E-Mail:7 V3 ?0 o6 Z3 W9 q& G
1 d- F5 }) F$ c$ g& v9 S; {
From: John Coggeshall <john@php.net>
* {% f7 E+ Y; }/ N; iTo: Joe User <joe@example.comt>& h7 M. M# x1 X# }2 A) j
Subject: Hello from John!
8 M8 ]3 L+ J% q' rDate: Wed, 20 Dec 2004 20:18:47 -04002 w8 l0 Q% P% ?/ o7 i
Message-ID: <1234@local.machine.example>
; F3 \8 P- k' D# C) T+ G6 h1 x- BHello, How are you?
- x2 Z  P; b1 c  u
) v" x' X" G: O5 v# \在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
' F2 n4 U& f& u6 F1 z
" ~! P$ j' t6 v, OA.MIME-Version
# e- J" j. `6 D9 E9 iB.Content-Disposition
' S( w) e" h/ x+ t* v- g3 hC.Content-Type& P+ W/ N% x" D4 R) `, o/ x
D.Content-Transfer-Encoding
) e+ H1 g: ]5 D" n$ O! LE.Content-ID
8 E2 x* ?* U% F; `7 H" W& O0 w# m) a1 O7 ]1 ]; E2 z4 ?7 p

) e1 G8 g- c3 d& {6 T: e* H$ D, k/ }10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
" C  y2 T7 {* s$ I
* ?1 _# X8 O# u8 z* D1 _1 J' q& I6 C' ?; hA.multipart/mixed
1 R. P' i; t# M( L6 s. h( ^, ^B.multipart/alternative. [2 o0 z1 n/ _
C.multipart/default
+ |7 Q! {' a8 {D.multipart/related
; s0 m0 |8 B; R! vE.不可能用content-type实现
! D- v6 Y: K: s/ n4 e% n% @; ?$ ~1 {) K; {9 K' ~- k, D
! v6 [( S6 i) W* A+ \3 F, b$ R
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
+ R6 F1 P8 W+ k2 f/ u7 y& ?" O! q$ K8 N& Y: A; p  n
A.安装sendmail服务器3 ^7 k# `5 f0 ]- S; J  g
B.安装Microsoft Exchange
$ X4 n& h( V. J' qC.在你的电脑上安装任何一种邮件服务器
" M! x- W8 n  u: o7 w! v0 pD.改变php.ini的设置
' [: n) ~: R( R4 x3 J; Q  VE.写一个连接公共电子邮件服务器的脚本
: a& e4 l* X' u& J
, U+ m2 B4 n, n; e/ x4 Z  C& L' O; [7 e7 }# u/ e
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)- `8 C/ ?' i, Q+ y" S& y

! l+ K0 k. X2 e, B/ uA.使用GET方式传值
: c2 V2 q! b- k: aB.用htmlentities()处理电子邮件地址
1 I+ w, [7 E9 E* e6 vC.使用POST方式传值3 H: e7 a; g. V) r
D.用htmlentities()处理邮件正文
" U! g) W, f, S$ A2 |6 PE.确保填写邮件地址的文本域不能有换行符
: }1 \. B( K9 C- x* S" |5 |. l* |" h9 z# G( Y9 ^7 b/ Y2 o4 ~1 y

, `5 t2 K  E  o6 a13.如何将一个数组作为附件发送,并要能在接收后重新组合?
3 `1 @+ f  P, t; E  [6 W. ~. g8 `% W& y7 M, N: x) @* B; ]& T
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
# f2 k# i/ S9 z. X' gB.把它存在文件中,并用base64_encode()进行编码6 J, c' _$ g( V/ z+ N7 E
C.用serialize()把它转换成数组9 r! J. O4 E$ M) {- O
D.用serialize()把它转换成数组,再用base64_encode()进行编码1 A: w. p# g' u) U8 }1 y. Y( n* b
E.把它存在文件中,再用convert_uuencode()进行编码/ Z8 D, r6 `8 k" v: V) E
% x4 ?' b/ e5 w. D

" u% d4 B, Z+ B0 }14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
  Q& b# I6 {% C& q2 f* e5 K% Q& `" J% I
6 Z, J3 @8 \0 J9 `6 lA.堆一个检测脚本出来1 E. ]) |0 m1 V, G! U4 y% x
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型3 c% f4 p, I/ A' w
C.写一个识别文件MIME类型与内容是否相符的函数% D" v1 V$ n9 i3 B2 ]9 c
D.使用mime_content_type函数
* H9 b8 X6 {3 }1 PE.把文件上传到外部服务器上0 y- o9 l% v$ `

3 r2 y( Y$ {  h2 J2 x  p$ ?% b& N# m( J% P0 X) k$ g1 E/ `
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
- Q, n6 }# D' ~- t6 k/ W  {8 j' d. P0 c
A.添加一个From头信息
% |2 f2 x. k5 [# A" {/ Y9 c2 \B.使用-f参数
& j8 C' }! P# k( H1 GC.添加一个Reply-to的头信息
$ x  O) c7 [4 {6 s$ rD.确保运行Apache的用户有修改sendmail设置的权利
1 S/ F* t+ \3 _5 \$ o! k% `E.确保Apache在root用户下运行
4 ?5 [! e4 t, B  h, s2 [5 v. e% \答案速查
6 a( @8 S- ~$ k" n$ g1:D
/ u1 R$ ?$ a* {2:AD2 x0 u, d/ i; x4 z
3:E! b& [# p' X: k  {
4:Content-Type:MIME3 V- E7 a# ?+ w* t, S/ I( G+ B- \
5:BC0 F5 y$ G8 i8 }& \& w, H
6:A( x( @& I9 `  `1 w
7:C
8 M2 r1 r  s  \8 M8:BCE
/ P5 B0 t% u, @: J9:ACD9 J  O% N/ M' C% C, U" [
10:B/ \6 y& q5 E* y
11:D1 |/ f, y# r+ T- \9 _9 h
12:CE
' D/ ]! F% [1 H' v2 k) j; I/ o13:D
; t4 R" z/ d. e* p( ]! e" W14:D/ G0 n, J# i8 L9 C( {8 o0 S( A
15:ABD2 E  n5 a: h' G; @
4 t% ?' t# ]3 ?8 [$ F

; \2 C, G% N  }8 X1 c5 ?) Z2 c9 g8 \+ v. T
答案详解
% s" U7 W5 E2 k7 W9 N$ J! m( g0 H& A. N6 {% q; ]
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。2 H4 P" c4 p" l" {6 {# E

& J5 U3 R% I+ S& T0 b; k# h2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
" G7 f( i0 r" J' e7 ?) F  ^# Y+ G: q0 C
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。$ `  g; c2 v' f1 K2 w
2 o- N! u5 o5 E/ F  j$ Y! R
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
% d, V; ~( C1 G
( N5 C. o0 G* s, W5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。, f- |& P- D. |0 y* Y( ?

/ \8 r+ l# \* ^. W9 ^6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。: G0 j3 ]4 x% n) w
* i  m# j, j; n/ }
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
9 ?7 x+ W# P0 d" I. l- s/ A
- C" @6 e" K1 @3 l6 D: T+ ?& `! d8 A8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
, T+ [, N8 r4 f- d8 p6 r$ c& }& t# O
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。7 n$ o3 t2 }" ]$ @
$ k$ s& J% ^$ ]( k7 v7 ?( a
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
( P3 _/ i6 P$ d8 l" _" R
2 @2 V8 Y8 j5 I0 o- ^$ h11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
% R0 f% f+ O+ ~1 _, a( p7 W# A# P0 d( K1 n
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。  l+ \2 e4 N+ b  O. S& P
. W; l1 d2 _4 }( \
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
- z2 |8 e; T4 C
$ j2 i0 w- t- M. V/ [14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
3 L. H# O2 M' Y4 ]3 @9 e
. _3 k% ~" q8 }, P  ~: c* C15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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