|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第八章 - 处理电子邮件
没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。7 W. _3 ?6 N8 [1 ]- j! p% {4 o
还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。. v2 J+ m+ S! C2 @$ |( E
用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。
5 [6 A, ]% \, t( u3 j+ E; U# x& t5 O p
; d& |. A- Y1 n1 B8 ?
问题0 g' @# J. u/ a( _
1 \7 x# N+ ]( H# V6 A& Y1.以下哪个不是合法的电子邮件地址?
! y- r) V: k: I! ~: A" p5 L& ^$ L; P7 J' m
A.john@89w.org
/ B- M( A, k2 z; G2 e0 X& tB."John Coggeshall" <someone@89w.org>) ?, ?$ r2 n# J( j
C.joe @ 89w.org) }9 \" o7 Y( a( Q+ Z
D.jean-cóggeshall@89w.org4 {3 D4 ~/ J/ {- o
E.john
: R3 o2 B2 F V7 j# o# |7 Y
( N+ q2 B- y# L4 D* t6 L; B
/ r8 |( j( z ~( U' y3 P2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)* E1 K) q( o3 n% H0 a: H2 [0 g
& X/ C2 Z. g4 t8 ^7 n0 E' K$ V% HA.Windows/Novell不需要第三方软件的支持就能实现该功能( n1 \; |5 p$ i* v1 G+ h
B.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。
- H, Z$ w* l- d9 G& zC.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送. m7 }0 u. t( j3 }8 K- S$ W
D.有可能完全相同,这取决于sendmail_path的配置& Q* y: s. p" a: R& M3 j& r/ v* v! ~- T
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
- H; |2 `5 H. L; d7 L- z8 K# `/ L
/ M$ H% x4 I8 K$ Z5 L
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?/ q, V0 [; v! \6 |
) B1 x5 Z- I- u t& ~# tA.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数- v# C2 d9 w1 s% h0 s7 ~2 S
B.用PHP代码,通过SMTP直接与MTA连接。) J; ]0 _7 N4 [ d
C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。; E2 R8 I' Z1 g; q6 ~
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。1 R* W; }! r" t
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
) h7 p% S& \7 {- R4 M3 b! ]
# p5 N) M* q" i7 S1 T4 L7 f1 M) `1 e* M* P1 A
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?
8 H4 j: [- j% Q! A- i! R0 b9 b
; w K, \6 w: @, d答案:____________5 r$ G# K8 j" k! y
# L( j" e+ j. M( f7 v3 W
5 a$ w8 z' E! O5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)
# c; W. R) u) G5 }! W4 W% S9 S' i ^% R4 C/ g
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
2 P) A' q3 N* @# f6 qB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片+ @9 H V6 J* Y1 x! b/ Z1 S3 Y" ]
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID
3 C0 w f" ^ f6 `D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名0 V' e9 o; ?3 a4 P5 {
E.只有一个答案正确
+ @4 [% M: v" j$ R# R3 ?
! S5 r& L; z5 i: u4 r
1 r+ `8 o/ y( K6 W' b6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?
4 s/ }/ V3 P3 ?% ?" T/ e- i! f( J8 g) L& ^4 t$ N
A.从UNIX或Windows/Novell发送邮件时都会用到0 I/ ~( w: T& g" r. D0 ]8 B1 Z
B.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时
+ ?( x( @" c9 X+ f8 GC.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时
$ j( M ?; i' s" ^+ w& mD.PHP里用不到这个参数3 `, c3 f+ D- A7 w# I% z r. D
8 [+ S9 H* M3 A" a
; U$ {! M6 q, c' N8 s. q" U7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?" W( r, g# E# {5 Y2 T4 k
, H8 h- Z6 Q X, p- eA.只有在发送非普通文本(ASCII)数据时
( `5 H7 z/ j' ~- c) i# lB.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)+ R, e+ _& R/ o4 b' S: A
C.任何时候都可以用它来指出MIME的编码类型
# }. C0 x _$ I% F( OD.只能用来指定特殊的编码格式(例如base64)
% `1 P# X/ } F! x Z. v1 C/ Q9 BE.以上都不对
; l% X4 t5 M: }4 K: M& C9 }4 n: V
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)+ F8 I @9 w) T6 f8 W! ~& y' X
4 i9 a) {6 p: n7 l! B6 c9 @2 W
A.分隔符至少要8个字符
- `3 e9 ?7 v6 I* [B.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)" f/ p1 r8 B, |- _! u
C.分隔符在MIME邮件中必须是独一无二的% ]- |" \ L1 u$ e
D.分隔符不能嵌套的其他分隔符中
6 F9 u/ e9 B& f# |E.用什么做分隔符都无所谓0 ?4 I. Y8 S6 Y& H8 ~
8 L: X# o2 z# u+ D0 n
) I# ^+ E; }8 [9.考虑如下E-Mail:( W* [% W4 j: @, c- r* m
2 a( B' c& C) X' _9 G7 }From: John Coggeshall <john@php.net>
! N0 v \, i* p6 o) bTo: Joe User <joe@example.comt>
5 y, R0 {8 M" A" G) XSubject: Hello from John!
+ z" \: c: j% l; a! p9 fDate: Wed, 20 Dec 2004 20:18:47 -0400
4 B' d2 D2 V/ A& G6 j, m- `; VMessage-ID: <1234@local.machine.example>0 q8 I# H+ q! \% ~0 B2 {
Hello, How are you?1 \& s5 \; s3 n8 _' Q
0 V5 d, U9 \& O7 K/ M' X3 [% k/ p在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择); T' M u+ `( W3 S
! ]7 X4 B# o1 u' _. Z9 hA.MIME-Version
' z8 C& }) g( ^B.Content-Disposition
, ]9 v3 W# n4 ^% B" ^9 ~; K* f2 ?8 ^* yC.Content-Type3 X4 R/ O9 v O
D.Content-Transfer-Encoding1 C) t' G& }/ e
E.Content-ID
4 c6 `7 d* s' m% ?, E7 B* x$ q$ i# O/ e. I. i/ ]: l5 B
) g8 V7 ^6 I9 U4 M1 i; ?/ n
10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
. k/ n8 S7 S$ l
7 H6 u* y9 A4 DA.multipart/mixed( C2 r/ X p( }
B.multipart/alternative$ x3 R/ v5 S- c8 q+ y3 G+ T
C.multipart/default6 y; W0 I j( f) N, i
D.multipart/related, B- j( }6 T) V1 Q3 G
E.不可能用content-type实现
d \* v# E1 ]) f' j' e1 P4 Y6 G+ E! e6 W
) e9 P; O1 m) o0 t11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?$ O0 G1 S$ J, Q- s
/ D0 p! Q6 h( y2 U1 [# eA.安装sendmail服务器
, I- J4 e- ]' TB.安装Microsoft Exchange0 \% P1 ~, ?+ n( G O
C.在你的电脑上安装任何一种邮件服务器2 Y0 R7 m& p) B. f, q7 w! ?+ R6 n
D.改变php.ini的设置3 ?* L \, N) M, M/ {
E.写一个连接公共电子邮件服务器的脚本
( h6 B% N) C2 C/ f* g
' Y2 X5 v3 N. e+ R
Y7 K8 K) l ?" X* h1 R' T12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)- u0 j8 l+ A' [8 k
( H4 u. F. l) s/ [/ n
A.使用GET方式传值
5 U k y* t. i* h' UB.用htmlentities()处理电子邮件地址9 p8 w$ ]7 S. \, i! Q5 H
C.使用POST方式传值
, [, s7 ~3 c# s8 J9 ?+ T0 RD.用htmlentities()处理邮件正文
: y/ d: [- a7 ?& Q yE.确保填写邮件地址的文本域不能有换行符% r/ o7 F- u) g5 D3 t! ]
) H( a2 e; H) Q8 {( l9 s
2 m% n# n/ h+ F5 @0 @7 v R13.如何将一个数组作为附件发送,并要能在接收后重新组合?
8 F# h2 R/ ~5 {/ @# Z2 N$ q9 D& R8 @8 `, V6 Q5 E6 [
A.用serialize()把它转换成字符串,再用htmlentities()处理一下
' X/ ^: T$ J* G/ m8 k& lB.把它存在文件中,并用base64_encode()进行编码
! E( \7 f+ p4 O! WC.用serialize()把它转换成数组! _. v- b9 \& [ d' v
D.用serialize()把它转换成数组,再用base64_encode()进行编码! ~ F" v& r) i' H: j
E.把它存在文件中,再用convert_uuencode()进行编码
8 u3 B, ^2 C. f6 K9 C
) E9 c8 c J) v% Y
- _: S9 p4 p* Z6 z5 Y9 o( [14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?) L! R. N4 q+ A$ w4 a
) p% E& b! L! L' b2 y! {$ u! Y5 d
A.堆一个检测脚本出来
3 A2 U4 t8 z. [B.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型0 U" ^, E; ~6 Q( H0 i9 T: ^
C.写一个识别文件MIME类型与内容是否相符的函数
& M0 T, U- x2 D- m: B4 E V4 LD.使用mime_content_type函数# ? {) i+ Q4 @7 k3 n
E.把文件上传到外部服务器上* I7 e4 S& y) z
, `. _$ O+ u) q/ S2 q5 A: {
# L. r2 [, H( G0 Z2 @" d' J' `15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)
# l- u8 R% l# F, y& y
* V' W* |2 W, K8 z7 F9 _4 g6 jA.添加一个From头信息+ x. Y: e* ]' S; I0 u; [9 `
B.使用-f参数
9 q" W- @! c4 [0 Z: `# o5 |! ]C.添加一个Reply-to的头信息2 D6 w. g. [1 k( T* s( N$ k
D.确保运行Apache的用户有修改sendmail设置的权利
4 M3 m0 C% _. v6 _. U" Y% ZE.确保Apache在root用户下运行
; S5 A4 u8 Q" A# r" X答案速查5 n7 f0 s8 s+ J I
1:D
1 d3 M5 c+ T8 P7 X9 n1 A2:AD* p* o1 I9 @& [& {1 s8 S
3:E
- n: M3 S3 e& b2 N4:Content-Type:MIME
& A$ a8 n2 a( [) x/ [) T" V5:BC0 B$ t1 B$ r8 L& U% [/ s+ U
6:A
7 f$ h* X: d( Y7:C/ o- L" y; y0 r
8:BCE
, H2 H4 z8 a7 g t8 s% y9:ACD* x) }. Z5 I' r/ ?' h
10:B
& r1 A4 j. i. Y- }+ r' J5 J11:D, g/ z1 Z0 c% T1 D
12:CE1 W# V( Z! { h6 I
13:D9 f" [ O- {1 w: h7 y
14:D
( \# q* j: G! e15:ABD
! k9 u' a0 d# E
0 a) h$ _, R! F. ^
A9 j. E0 O2 S+ B1 y4 m/ G! z
$ @5 t0 J }# H- O: [+ c0 Z' b( b答案详解" y. _& {& f/ i: n: w- H( m) ^
' |1 `% Y" {: g7 Q: V
1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
4 S+ j- D9 X9 V) ^6 \ R& _% w1 z1 H: a6 c/ g# j
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。
& e( V3 G5 T D. g. L2 o" A' `/ d5 j6 ]! c
3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。* S7 @' v2 O& \0 Z( F9 E
2 U* M B0 X6 ]$ ] P* t8 r4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。0 I/ F$ e L& U7 K* |
) e. A1 t/ v& Z6 b& X; L
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。
7 D& b; q* U' _
1 Y7 T9 y v5 M- w& z6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。' d' \5 Z$ h. H- s& o8 i
. l- f, a4 B. x( H$ r0 |7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
+ `; G+ u3 y- V; F, X
9 |! r: X) b- W3 e% `, L: f/ n4 n8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
/ y# m7 D% d+ k" T
: }2 Z* d' o/ [' E9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。9 X$ `, f, E! i! p
* E* G& |$ P9 m10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
& k b1 u- W- v( e. q
/ Z" t, _6 U- J- `; K11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。* h6 F) [, t) y, b0 {0 w3 F$ l
- R* F6 `! \/ I
12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
7 t( e2 r- U5 ?& }& V( R
0 x0 V6 ?! Y( w13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
. C" o6 m( I7 u+ @( v
( a2 _! l5 R; T! Y/ Q14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。6 Z, @* v6 W( O. N& O! x; W
: r% ]3 p Y6 X" K/ K2 e/ \15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。 |
|