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

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

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

, W; @( j. _" y; b+ M问题
$ W6 c7 }# F5 {) E, P( y; U9 Q' l# x: w9 U6 a1 d- v+ a
1.以下哪个不是合法的电子邮件地址?1 T9 Q6 F+ P6 [% F9 J0 Q
: e9 a$ a- `' T, h& g# Y% {2 Y2 ^+ ^5 {
A.john@89w.org
" e9 r% g0 f/ z/ sB."John Coggeshall" <someone@89w.org>3 N9 ~: J6 w/ t6 @
C.joe @ 89w.org
' Z7 N; n! O5 X- r5 {, TD.jean-cóggeshall@89w.org
* E6 S/ W" a( l% B2 N  NE.john+ _6 m; E! Y( o. c3 L4 ^% M: y
2 `+ F9 t2 M5 N0 X. |+ |0 ^7 w

1 [3 ]1 B. P! O+ t% p' V3 `2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
1 E' x# r! D( R4 M- D& Q0 ^% w- K9 s3 w( N/ y. g; \0 e. S4 W& }
A.Windows/Novell不需要第三方软件的支持就能实现该功能; d/ ~$ O) L( b* W  F
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。9 |# V- w  s/ N, R& u
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送7 e) A% f) a- `" e  A: [
D.有可能完全相同,这取决于sendmail_path的配置
6 D: I- z" P% Q7 F/ ^E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口; w3 y5 r/ a* l, n3 i9 B, M  G$ _
# @& J# Z- ?1 G' e5 E% a
. {( {% l4 @7 o& s& @( ~: c; ]2 W1 H
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
% h1 \. O; h$ j- r: F9 ^6 I. {; A
1 X) @# R( d4 G- d$ j" U1 rA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数3 I# y$ Y! v0 ?1 i
B.用PHP代码,通过SMTP直接与MTA连接。
4 y5 y, H* k& DC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。
: e3 S* G% ^+ [+ j4 i9 Y6 AD.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。
2 z2 l6 T: Q) ~# a% R# P0 d1 UE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
; @" |6 X8 r% Q2 `2 [; u3 x, d+ K2 U- t

; w4 d  U# [, O' W' e4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?) i$ A, o  P6 Z

2 G2 ]2 k* I4 A+ `" w3 t8 P答案:____________
3 P( S( @4 Z4 i/ i4 g- H
% C3 E% }/ r$ d5 F( r
4 `( \- s4 J( @. }, k5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)) X2 ?$ ], a+ l! P- B9 i
; |8 q+ A% K; F3 @
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示+ m( m/ D' r6 \* N: @! s
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片. Z; j' T) t7 L+ S# l' K" N
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
4 K$ A6 T  Q" [8 ZD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名5 K7 H+ t8 k! n* B' [* C2 U
E.只有一个答案正确0 l) _+ U# W! Z) F0 P0 V
: A+ T9 X7 f8 r  A; t
( X* y# D: ?3 Q; r- W: L# l
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
0 ^# ]' k- {, d3 R% _/ v/ [3 {9 c7 E! k$ r+ r0 x; k
A.从UNIX或Windows/Novell发送邮件时都会用到' ^3 C5 J$ M2 m& i# [
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
/ y+ @$ z  l9 U! Q& G( s; gC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时! u" W2 ]. Z& w7 h) M
D.PHP里用不到这个参数
' S, q" I2 @( h! F7 T  U- _# T- s" j+ Q7 X6 v/ ^
5 r3 g  Z% ?0 B; p( t4 s- s
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?+ s& A1 Q5 o5 o$ a* s
. W- c2 f) Z! u; R
A.只有在发送非普通文本(ASCII)数据时* s* Z' B3 l1 ?
B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)+ }+ k1 J' I# Y$ L1 f; K* b
C.任何时候都可以用它来指出MIME的编码类型
) Y, a- T& [! F( |) n! |6 o1 jD.只能用来指定特殊的编码格式(例如base64)7 a* z2 d8 W0 T) p$ T
E.以上都不对$ G- d# ^" F0 ?3 i
; h+ o) h/ q6 X1 ^. S  T9 Z0 _% o
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)4 Q8 F1 d! Q6 @; t

- s% f5 q# u; L7 ?, `  xA.分隔符至少要8个字符
+ m0 r1 T, k( z# @B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
, S& q+ A' }: ?C.分隔符在MIME邮件中必须是独一无二的
' Q. k* i1 v/ S' |D.分隔符不能嵌套的其他分隔符中
# h5 ]' Y' a+ H6 }7 n% F- @# E- Y/ c6 k/ ZE.用什么做分隔符都无所谓& p3 [+ M9 I: N/ s+ v8 s

6 {; P% ^' f. U' ~6 K% d) t4 U
4 @- R6 l0 T  z( n9.考虑如下E-Mail:" K) b& p8 u. u
; }* [) ^: t/ s1 |  s$ {
From: John Coggeshall <john@php.net>
) J/ H9 I% B6 b. R1 L- j2 UTo: Joe User <joe@example.comt>
3 g& b# H  x: Y2 t0 _: o# {- G# zSubject: Hello from John!7 d! F/ J9 Q- h7 v
Date: Wed, 20 Dec 2004 20:18:47 -0400* k7 E0 U4 q: S
Message-ID: <1234@local.machine.example>
) Q. i1 [$ c) P' U( `Hello, How are you?( a' d# G  L; I3 F9 }$ [5 N% x+ h
+ k2 t9 {  b+ a1 R5 l/ P) F6 ]* K
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)1 a" ~  u& Q$ l7 }
  f! q" Q+ Z5 Z, K7 q& G
A.MIME-Version
' N+ W$ i7 O7 C  wB.Content-Disposition2 i" S1 Q$ r0 p$ L& R# B3 x% M
C.Content-Type
8 U5 n4 @, @9 c8 QD.Content-Transfer-Encoding& S7 T7 L7 |, M! B: Z' f/ u8 E; Q
E.Content-ID7 K. n0 X; M; k9 W7 D, r

6 L. `  T) w4 [: |
" Q/ v2 g6 a5 z& i, I4 d10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
2 p: \' m4 h. I( G6 s* B+ m2 G' {
A.multipart/mixed
& W9 @; ?  a& v2 ]( B0 B8 zB.multipart/alternative2 G# e. v- X( Y) c3 R
C.multipart/default
5 l. V8 E* X  A. P9 t& o5 b1 v* xD.multipart/related- }% x- P1 N& l) D3 p# C3 ?9 P1 o
E.不可能用content-type实现
; T8 t, m' u0 q+ i3 C3 g3 a5 e2 S6 C% z; b2 t9 l0 b
) l! l- X6 v' w- Y/ S+ N7 S7 A
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?2 ?# z) J/ q1 K2 S

8 G- J1 z* V; A4 |% X/ jA.安装sendmail服务器* u' s& T  _( q( y# Z
B.安装Microsoft Exchange  }% r7 k6 S3 j; p( o
C.在你的电脑上安装任何一种邮件服务器2 i( `7 F5 ]9 U
D.改变php.ini的设置/ n) ^& x0 P3 ?0 p5 D
E.写一个连接公共电子邮件服务器的脚本! @3 J2 H$ v* w* \8 }9 Q0 ^6 Y

2 B- o# \$ {+ U& I  s' U% j# h5 H4 l+ o* y
12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)$ f: y2 g1 G; X

, S. i, q: M" T+ Y: D, }# eA.使用GET方式传值
: o; b, @  W* x) e  uB.用htmlentities()处理电子邮件地址+ k1 O- G2 ?! N' s, b" x, K
C.使用POST方式传值
* t1 s1 j9 ~0 K0 n- s$ I" ZD.用htmlentities()处理邮件正文+ d2 j, F& b1 [
E.确保填写邮件地址的文本域不能有换行符: ~3 M! r0 |6 R
& Z2 g* {4 b2 Q# `9 V6 R

$ L% E) E- Z. j* m" k; N5 j) l13.如何将一个数组作为附件发送,并要能在接收后重新组合?9 a; x7 v4 F! p' G) A0 M, _
9 P, J7 {0 x2 |2 e: J
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
2 L, z* d6 D  @. D2 bB.把它存在文件中,并用base64_encode()进行编码  V/ S9 h" e0 ]
C.用serialize()把它转换成数组
2 a3 R( g, o$ BD.用serialize()把它转换成数组,再用base64_encode()进行编码
: I% v0 X2 C/ K5 S: ]E.把它存在文件中,再用convert_uuencode()进行编码- o% Z4 Z& s$ Z
* [# \! w0 K! z8 O; i- A. ], h

. K( C) V3 ^; `1 a* z14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
5 G. ]' j. j# j3 K* C9 P; f% [  o
. R0 ?& F  K( T1 [2 d" ]A.堆一个检测脚本出来
* E2 B1 n. U6 n' K6 @B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型% z( m1 c) {: U
C.写一个识别文件MIME类型与内容是否相符的函数7 B" t6 D, G9 R& T  R2 ~
D.使用mime_content_type函数
9 P8 R; ]' j0 [* VE.把文件上传到外部服务器上
8 F1 ^8 [9 n$ T4 D4 Y
8 n1 b- I2 o9 N# R: m/ k0 e# @- U6 `2 W/ Y$ I# Z7 X
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
2 j8 O1 V0 \  R" Q9 s( W
; K0 u+ i. p/ b& e" ?1 j/ hA.添加一个From头信息$ A9 X$ D* x5 `: X
B.使用-f参数- m2 f& ~4 [% Y! g# f
C.添加一个Reply-to的头信息
- }  p9 K& A$ R* ], G) p/ E: }D.确保运行Apache的用户有修改sendmail设置的权利
( {0 N. w+ \, o! v! tE.确保Apache在root用户下运行% N: \& u/ s2 |7 b
答案速查
' Q6 W! \% i+ o# Z. A' R1:D2 X# y* }7 e0 o4 i2 b$ ]) o
2:AD
: n7 x& _/ y0 ~3 T; `* M% X# X3:E1 h) j# {  H$ p# a5 e5 b; N8 Y
4:Content-Type:MIME  ?) V$ u" F. f7 B. s3 ?& ]
5:BC
9 @" r  q% N* a8 h6:A9 i1 P0 s/ j7 \, |2 Z0 I
7:C
- S1 N6 M* a1 V8:BCE
( D& o' I1 R0 J$ J, F* {3 Y9:ACD
4 e( G  p+ T2 g/ r: r10:B
" @4 [3 J  p" ^/ Y9 V11:D
. w9 o5 O( [( G4 ^. B+ n4 m% x12:CE2 y5 o* u! O  X3 i! X& y, K
13:D5 w; i. F0 L% v/ ^
14:D# T* T: a9 j, V& N! H) h; y
15:ABD- ^( I3 x- g- Q% S- i- k* \5 M

* V8 L+ M' p$ V. s6 r0 R
9 t0 \) ]1 P; R* @
$ ?7 e. ^5 J+ j7 S答案详解
; K7 h# F; x0 b# |$ A/ B( R+ S
% L  T# k3 M) e$ I1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
+ Y9 {  m: p, o( }1 @, v8 W2 c1 b, h' Q% w1 R' n
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
0 z! a0 F  O$ V0 R- W0 w* K* D# S2 K4 E( f
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
! d! ^/ P! \2 g. i! W# x/ T
5 w2 f0 ]/ [0 e: v9 I4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
( \( `0 ]7 [9 |) Q0 ?
+ n$ A* \8 a% P6 y$ [' q7 O5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。; r8 E6 |& o( U  p0 D1 Q4 h- B

7 H4 f0 f, h2 K6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。2 \! P# D; g5 B/ P( ?" e( s

" N0 D, v# A  f: V( A" t7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。6 k6 e! e3 ~8 l9 S0 i( g, H. n2 |

( {% d& I% `. b6 T0 [+ b: I6 a8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。2 R) W2 f4 u" `

+ s% Y7 ~/ p! Z# q6 P' H9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。! q; [9 E5 f. m9 A1 X' N2 K6 Z- v9 F

$ g* P7 p/ U# A' u10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。- i8 D" S: [# Z4 L2 R

& ]3 \  t9 ?0 Z, i! G9 V11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。
, B! ^: T, X( N) T' ~
1 Q) P  x! ^) Z12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。# n+ I$ H  t5 M/ @: x2 I5 i' X6 S

, Q* J  {7 i) I( h, W8 n: S; u13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
( q/ {! B4 }/ l2 Q# N# G& y5 X! ?
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
0 v- u6 G' H9 F
, e2 w# E+ \" m& \- ?15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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