返回列表 发帖

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
9 d# l$ u3 j1 Z- W" F. F* m还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
. v4 j7 I) K' a( o4 Z/ w- ?用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。* B# ]- Q' \/ `0 O# W5 h' [% H

% {8 g: V0 o# [0 P7 j, }+ C9 f7 x0 M- Y
问题
3 j2 o2 ~4 N0 }$ p, ?! o
7 P4 q$ a" m; p+ c& T1 j: m3 n1.以下哪个不是合法的电子邮件地址?9 Q, N! ]( f0 |+ B) n  N

; a- y. ?7 ^* H9 t9 _A.john@89w.org
& d; ]! [" C$ Z% aB."John Coggeshall" <someone@89w.org>8 `" F: g5 P7 }4 m  N" e$ C$ W
C.joe @ 89w.org
# t1 O5 D$ @: F( u$ a5 vD.jean-cóggeshall@89w.org5 s  j( [9 @0 j7 s7 u8 u, U' `
E.john
: m: O& q" Y+ m5 v1 n- ?4 {  n; I! H  Z: B" X- a2 z
- {$ J6 E  K! {2 [) N6 k5 T
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)
( t, n- m3 I  @7 c) ^: I' W2 z# x  w- S7 s
A.Windows/Novell不需要第三方软件的支持就能实现该功能6 g6 k1 S: C; X" K
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
0 \7 \2 c! C9 v2 fC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送) V6 @+ Z  l! q/ e2 K
D.有可能完全相同,这取决于sendmail_path的配置" i' P, I' [2 `* v: Y
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
* h4 B7 }- ]( o4 }6 B" h; `9 ?& q5 J4 u* @
1 B/ {& k- j5 n8 |- J
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?9 ^9 L# _4 O! i+ F7 A

3 L4 v0 ]( J3 T6 @1 CA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数6 }4 f& S- s/ A5 y# A
B.用PHP代码,通过SMTP直接与MTA连接。
7 g2 c( k  o, yC.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。9 a+ }9 v4 o4 q- R- k, T0 d
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。+ w9 Z5 S; n  E' l
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾5 f% J% F; ?: n% c

. l& g5 Q, H8 [9 O9 i. v: k. s3 ?7 \7 [! k& c6 _- g
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?! H8 i4 L4 l) {# `
; |8 Z8 H& ^/ l" `: m9 p
答案:____________
3 q6 d3 d9 f5 }* J
% \; G: M& L# a2 L; y/ C/ \' v" ^1 R0 N" A) r: B+ m
5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
4 Z5 f: _/ K& \( N5 Z& q
9 S/ @& N, K7 w$ w9 HA.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示! t: ^2 m- h# `" @
B.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片
  B  M) P! K5 g! p2 |C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
7 W% F5 W7 m1 n& Z9 jD.把图片作为附件,再把<img>标签的src属性指定为图片的文件名. C4 o/ Q7 m9 j3 w/ H2 }
E.只有一个答案正确+ H; i, S1 k% M/ o0 C/ I0 J, s
7 h# p' @% o" {) s1 f% ~& U
/ j2 U$ E* C6 F3 i( a6 G: L
6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
" J3 ]* {; K/ G) U6 O) R2 d1 K( ^
8 f* {; C' _: vA.从UNIX或Windows/Novell发送邮件时都会用到
" q& M7 G' I1 }# I/ X" aB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时% G0 C3 H8 K: I  D% d) N3 B9 w
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时" R. M4 k$ s2 S+ _& Z4 z
D.PHP里用不到这个参数
( K* q/ y. Z( J/ G, j4 t" o$ T0 T% G) X

8 m+ v4 z" G3 l7 t+ m/ v7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?; x' K1 P# ?: H. I: C/ e7 N4 H- w% P* ?

; P, b; {) k" R. @A.只有在发送非普通文本(ASCII)数据时
& A) r; a, y3 g7 ^1 Q* B- AB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
  n) Y; t* k4 b4 P4 Q: PC.任何时候都可以用它来指出MIME的编码类型
7 ^2 w/ D! \" Q( _. ~D.只能用来指定特殊的编码格式(例如base64)$ S# M8 X- ]2 {- I' x
E.以上都不对( ]5 m. w6 T) G( E5 [

0 g! D) M( W' K" S( A( W8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
! Y7 s; b/ U" g
. `* w) ?' n0 x  i7 k0 D- l% zA.分隔符至少要8个字符3 _( `+ A3 }5 H% _
B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)7 U4 Q2 r. O: R4 A
C.分隔符在MIME邮件中必须是独一无二的
! ?; Q& R) s) OD.分隔符不能嵌套的其他分隔符中5 G% o: j* j( d; M! t
E.用什么做分隔符都无所谓
" }( u! n7 R7 H  u3 W$ p; W
9 S! }0 m2 s4 s% R' j# S2 ~* g( g; v- L
9.考虑如下E-Mail:
/ p6 Z2 `6 U; f! c; N, F9 H5 O3 W6 w" f- E7 B: h6 q
From: John Coggeshall <john@php.net>- r" N; j9 r/ f! S2 B
To: Joe User <joe@example.comt>+ {4 E* O1 s$ c) t# c
Subject: Hello from John!
# ^5 _4 J- ]; S" l$ l) LDate: Wed, 20 Dec 2004 20:18:47 -0400
( q" Q; c2 v- Q* F8 W0 n) j2 SMessage-ID: <1234@local.machine.example>
$ e3 B( o% i8 g  U( B& i% CHello, How are you?) q. ?1 O# F) m# ~
' Y6 z' W' Z% W/ i
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
2 j2 V' O, U& y& v2 x5 i0 u+ ^6 f$ [# K
A.MIME-Version
1 V( v( l7 _/ I" P1 `( r) Q& tB.Content-Disposition
0 ]# k* g9 V% dC.Content-Type
' m( w2 ]; W9 s( y& A( fD.Content-Transfer-Encoding) l% h3 H" C4 N+ Z
E.Content-ID# t& I6 T9 z2 |, f* n* ^2 \
. a. C/ ~* F! i$ y2 a' c, A

9 U0 j5 ~  p( y& F9 n6 Z- ]10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?; f. I4 T* x$ G) t
) c5 W* Q1 @4 q9 T4 f
A.multipart/mixed
8 J, y+ V7 L3 U0 S# S# z9 v' [B.multipart/alternative( ?; U# J* T0 I- t9 \6 x
C.multipart/default; V  b8 g! U! q" c; v: e. m
D.multipart/related. w4 Y1 `, D2 o* ]! P8 U
E.不可能用content-type实现% e, D2 B1 |5 s4 S: }; N

( Z6 q9 W" g; |" l' @$ ?# A& r1 Z. j# Q5 |6 k
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
0 k8 B( Z! A1 h8 y# p0 x9 g% @, {- Q+ n
A.安装sendmail服务器" S: E* }4 v/ O, {( }; d
B.安装Microsoft Exchange5 A1 Z) f! d9 f8 W
C.在你的电脑上安装任何一种邮件服务器
3 S# I: J+ K; s8 l1 [1 @D.改变php.ini的设置
# |& `* R* q* B) \E.写一个连接公共电子邮件服务器的脚本( ]" ?; {' }, f; _* K1 f+ t
* p% j' T# w8 T4 M1 N( ]. G( u

7 M/ N: B9 K4 v5 j: E12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)
: U. k1 |5 E0 C, X: N0 A1 s3 I5 ]7 R8 j$ M5 n8 p
A.使用GET方式传值
( d! j' l8 M- z4 D6 ?3 y" _# v" R2 yB.用htmlentities()处理电子邮件地址
5 t1 ^2 P7 |6 `  b4 pC.使用POST方式传值
$ D3 N" s4 ~- N- e# o% zD.用htmlentities()处理邮件正文
: e& ^3 h. |- R+ r) N  M( OE.确保填写邮件地址的文本域不能有换行符
! ^& G$ K/ y1 I- `6 I  c7 R1 V5 R! m- y: i2 i0 C0 |3 @
5 K$ J; L! Q8 A, ~  L
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
% N' b& i5 V  v* q: p; d
( W4 X/ }/ k" g( Y8 }& x) X$ r4 tA.用serialize()把它转换成字符串,再用htmlentities()处理一下0 i, c/ g3 R4 t& c
B.把它存在文件中,并用base64_encode()进行编码' h: Q1 _3 P! F" g5 r' ?
C.用serialize()把它转换成数组+ X. }+ T; s; s) \" [( s5 Y% `
D.用serialize()把它转换成数组,再用base64_encode()进行编码
2 ^9 p/ P0 M: X) E4 P1 `  R% KE.把它存在文件中,再用convert_uuencode()进行编码
0 e* U) ~# p& L+ m5 R$ q: t
6 ?' B4 P! t4 D3 C1 {; t! ~' j* h% m, R, r% y
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
+ g. J7 q8 b' v! B( P5 `9 n% e* ^& r/ I4 W, d% z
A.堆一个检测脚本出来+ u" E! G" ^! N4 ?1 n8 M& ?
B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型+ ?/ w, H- a' ]7 \
C.写一个识别文件MIME类型与内容是否相符的函数
5 |  h- f7 [- UD.使用mime_content_type函数
- H( A/ \; b0 L2 D2 d  YE.把文件上传到外部服务器上
6 O: \3 \: l6 V' j
) V' A) R6 M" W( n3 t$ q: x, o4 N! Q4 x. f2 _+ }
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
: u7 b, E1 }& ^7 d# L% v! [* U3 [3 _+ @0 n- m
A.添加一个From头信息+ ]+ ~$ X; [% B, e
B.使用-f参数
8 Y. Y% {) e8 p) J: m# G' d- oC.添加一个Reply-to的头信息: Z- D) x! c+ V! D
D.确保运行Apache的用户有修改sendmail设置的权利, D2 m1 c4 S5 q: d1 A# q; N( q
E.确保Apache在root用户下运行9 b9 b% K* t2 G% f1 R; B
答案速查" R3 K. N- ?' r; O  E' b4 H$ q
1:D7 r; h0 \/ Y0 [6 S. P  ^" j; N: A
2:AD4 |8 b6 U8 C9 }& m3 n, G* i8 t7 U
3:E$ A0 c; {! S& ?" s/ H& M  u
4:Content-Type:MIME, P3 n: O3 z( B/ O3 w5 Q- u
5:BC, d: q2 R9 v4 f( R( W( ~8 c9 l7 K
6:A$ [$ n% u! C" l3 Z
7:C
$ K# K7 O8 k, Y8:BCE  t0 Q6 i9 p- W! C
9:ACD0 i* D6 r" y. @; {- s6 V
10:B" M2 d& y! b, i( }. N& }5 `
11:D/ O( I8 g2 E0 d6 x  o% R- W) T9 J
12:CE3 ], v  G* h6 B+ D) F
13:D
+ E, W) W9 Y$ J3 z. C  [14:D
& ?4 c8 {* L' {+ U# n" E15:ABD5 g0 h  F' t# _
2 o6 Z$ d% H0 S6 t5 \
$ h8 \! q) {9 V( M

( [# a( H8 _& p. `2 s0 W答案详解0 j3 `0 E5 ^8 ~, H+ M+ `& B2 n. P7 E9 U

$ o& _' d* a4 v1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。2 v+ H6 c1 j7 c
* Z+ L2 r! ]# @: \
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
5 _* \8 j" ^3 h7 h8 F
0 s) M8 m* t1 G) a, q  K: b3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。" `" C2 f) _! T+ k4 P
+ M' e9 t. u' E, z$ g! `/ q2 r& }
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。( ^. Z% n9 j2 n" J' I7 d
! I/ s/ ~( v) `
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
% S3 M! R  K& O$ S4 I6 e
1 J& a# u5 t& I6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。
8 x7 s. H$ q+ n' x3 c9 @# R2 v+ o0 \$ o. d5 j
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
4 Z! ?, z9 F/ t3 W4 v9 d# i" R9 X. h0 ^5 r2 `8 `
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
% C0 I. y$ r/ ^( N2 q2 u% O' L8 y* c
+ G' ^( ~* C. h9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
) s4 l0 M! k* t9 j( z3 a: A& s) J: J
  t0 U; |+ V+ D7 q10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
. |2 B( j8 j) t2 P; y$ c/ k8 U7 O0 ^& `' l' i
11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。. X0 K% ?$ m! ~6 C

' n0 X# p$ e9 G" `12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
+ x5 `. M3 l* J; f! \/ W7 J9 u; B6 p4 X2 W/ @, Y7 L- p, d
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。( H% {9 r3 f: t+ J4 L

+ S. V2 M( V* h* e. N9 r# U* N14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。$ M7 c( E" |" q1 `
' u5 k1 z3 e6 F. l! G9 Y
15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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