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

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

没有了E-Mail,这世界会变成什么样?网络交流把人们拉得更近,让公司能够更有效的开展业务,不幸的是,也带来了垃圾信息。
  e2 U( z; p0 q% V: n7 A  }还好,你不需要成为一个反垃圾邮件专家就能使用PHP处理电子邮件的功能。事实上,不管你是在运营一家在线商店,还是在编写一套论坛程序,你都会发现发送邮件是你工作中很重要的一部分——与用户保持联系这点非常重要。
/ H9 K" X& [) ?$ c  k: a5 Q  l5 k用PHP编写邮件管理脚本很简单,但也不失挑战性。如果你只是想发送一封文本邮件,mail函数对你来说就够了。而如果你需要处理更复杂的电子信息——例如HTML邮件和附件时,那么你就需要深入学习一下E-Mail的工作原理了。# K* h! y% i# a& q

& _3 W* w- y0 q  i' c) C( K; ]
5 O8 u0 P( m/ J- |1 o% ]. Q7 [问题$ X0 z. n" `6 R7 E/ D* t6 B
5 h' ~5 q2 I6 e+ t% V7 e
1.以下哪个不是合法的电子邮件地址?  r" {1 _9 r2 W2 Y
- _5 d# V0 D% j: B- p
A.john@89w.org
: f; a4 c& `2 D6 TB."John Coggeshall" <someone@89w.org>9 t2 r0 L" v9 L9 k
C.joe @ 89w.org" U* ?; j, t) }$ F
D.jean-cóggeshall@89w.org2 ?" P! Z. P: x$ X8 k$ E8 v; B
E.john1 O: W6 W4 R( g' T5 [& m, Q6 i% x

0 R4 K* x5 m' {) H) W; S: ~1 \; Z/ |, a/ |0 v
2.在PHP中,使用sendmail程序从Windows或Novell系统中发送邮件的方式,与从类UNIX系统中发送的方式不同。以下哪些选项说明了这个不同?(双选)/ ^4 h$ U- R, t) V
% [; f4 H- P; Y0 a+ C
A.Windows/Novell不需要第三方软件的支持就能实现该功能
# V; L9 ]. ^2 ^# C  F1 R+ w, \& YB.UNIX中,sendmail_from的配置来决定了邮件头中的From:信息。: t- T7 @5 b( p/ o
C.在Windows/Novell中,你无法发送有多个收件人的电子邮件,每个收件人都必须单独发送, @2 h, H3 u8 q: g( R6 d! V; E7 r
D.有可能完全相同,这取决于sendmail_path的配置) `+ u5 ^1 j5 {) D
E.不同与Windows/Novell,在UNIX中,你必须用SMTP和smtp_port配置好MTA主机和端口
/ K$ o& z7 _" U8 B- K; E! U. T9 Y& J+ M1 o+ ?- T
' V8 ]5 G- @2 |  S. H
3.通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循什么步骤?
1 d! C* @2 m# \7 g/ c- c) E& [8 m" x
A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数, Z5 E. C- L$ Z+ u
B.用PHP代码,通过SMTP直接与MTA连接。
3 K" i# i- R* |C.将附加的头信息传递给mail函数的$additional_headers参数(第四个参数),每个header一行。: M8 H% @/ A2 h5 V
D.向多个收件人发送E-Mail是允许的。PHP不支持发送MIME E-Mail。9 t  I2 c, a( T; }
E.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾
* e2 G6 [# m, e4 Q3 j, U% Q2 p% m2 }) `- r/ u/ k
  `) f. j" C3 B+ T# D
4.使用MIME发送有附件的邮件时,邮件正文和附件必须靠一个特殊的分隔符分开。MIME E-Mail的头信息里如何定义这个分隔符?! x- }' x; h# ^) k; B

- E5 |6 C% x8 J! R" d答案:____________
. V4 x  a7 L& r; S! G
- l3 [2 H! C5 I$ O# s# _0 O7 ?
& E& `% L" {2 \$ _9 I. f7 D5.使用MIME发送HTML邮件时,经常会用到一些经典的HTML标签,比如用<img>嵌入图片。以下那些方法能做到这点?(双选)6 \  v% p0 D' n  o& {, ^3 x
  S/ a* Q! P3 m7 Y0 T2 j) I
A.直接用<img>标签把图片文件嵌入邮件内容中,邮件客户端能自动显示
8 d# v0 \( d' D, N% b2 vB.通过给<img>标签添加一个URL的src属性来调用外部服务器上的图片* {& x" J2 R$ k6 I- U& b8 X
C.把图片作为MIME内容直接嵌入邮件中,再把<img>标签的src属性指定为内容ID2 |4 |0 N% r1 G- r6 M! q1 P
D.把图片作为附件,再把<img>标签的src属性指定为图片的文件名4 j. K1 {" m0 i! M2 s
E.只有一个答案正确' c" {2 D5 o7 U" W6 f
6 g5 T2 o1 g9 W

8 ]: ?# C+ Y! h# K' G6.以下那种情况会用到mail函数的第五个(最后一个)参数$additional_parameters?0 S4 n3 `( p! }  T

7 ?' S/ F8 D) E7 bA.从UNIX或Windows/Novell发送邮件时都会用到
! K3 _* q9 ~7 D# s  V. Y5 cB.只有在Windows/Novell平台上用SMTP命令向MTA发送邮件时0 T# K# L' y/ V! M; S/ ?
C.只有在和sendmail或一个指定了sendmail_path的打包程序协作发送时- k; _9 i! W. f2 Z+ A; v8 [
D.PHP里用不到这个参数5 u7 a# W% P, S2 X! J* v& ]& ^7 D
8 d1 d" r8 P5 k) ]
# H& O+ x4 ]0 X( J! g$ L
7.以下那种情况需要在头信息中添加邮件内容编码(Content-Transfer-Encoding)?, ^! W1 c& q& D2 U+ \9 W2 y

% i3 W2 j# l; E) YA.只有在发送非普通文本(ASCII)数据时
* R0 g& S, I& x8 i, ?B.需要指出E-Mail的格式时,例如HTML,普通文本(plain text),富文本(rich text)
3 i3 |# _  L7 F# u0 y2 jC.任何时候都可以用它来指出MIME的编码类型
1 k& p# G: W) z9 L, z6 N4 {1 RD.只能用来指定特殊的编码格式(例如base64)
6 x" k2 P$ f* N& I6 DE.以上都不对% t8 K) O( _9 s& F( u& k
- ?5 y0 c, p( z4 s! P2 U( [
8.以下关于在头信息Content-Type中定义的MIME分隔符的描述,哪些正确?(三选)
. S) F6 k( r4 y' F% [
% u2 |' U- T* F; k$ M0 GA.分隔符至少要8个字符
' ~) H8 V% M4 E: P9 lB.分隔符必须以两个连字号作为前缀(例如:--abcdefghi)和后缀来表示起止(例如:--abcdefghi--)
2 Y& d# _0 A, I7 T+ J. GC.分隔符在MIME邮件中必须是独一无二的
/ r+ B2 g2 O6 [" Q1 FD.分隔符不能嵌套的其他分隔符中3 [5 \2 |* i4 ?+ ?" }# t9 A) J6 h
E.用什么做分隔符都无所谓
* U5 C# N( e# k7 B; [. U+ a' P* t5 W8 V/ P' Q1 c9 }

. x  M. Y4 g5 `# f, `; d1 h) g9.考虑如下E-Mail:
+ ~: C' k9 W8 W1 o* V, N$ T8 v: Q" r% T4 q4 W/ |: h
From: John Coggeshall <john@php.net>
! q) Z; Q7 n" W4 Y7 N! kTo: Joe User <joe@example.comt>
: k  g& B1 L6 JSubject: Hello from John!
5 v- v. u& c! ~$ H$ X$ s/ vDate: Wed, 20 Dec 2004 20:18:47 -04002 ?2 r( V4 R: [! v$ I! A6 y
Message-ID: <1234@local.machine.example>
  m8 g- I4 q( c& j0 WHello, How are you?
/ y. Z: ^7 J8 Q' j+ b6 \. G! C* c5 M
在头信息里添加什么才能让它成为一份MIME邮件?(不定项选择)
0 c9 ?9 x8 f8 H3 \4 w1 M, I5 s6 k( K7 t: B& r3 R; f% I8 v
A.MIME-Version) T6 I9 N2 T, {
B.Content-Disposition
5 q! D4 ]" S7 y2 V7 z" pC.Content-Type7 P8 @- s5 V1 a  L0 @( N2 U% P$ B: k$ C
D.Content-Transfer-Encoding
( J* s+ C1 U) Q2 B0 ]5 i; iE.Content-ID* o9 Z" h% B  L8 q+ p' k

7 H1 ^2 C3 D5 N
+ |) q& l2 Y" K2 l9 I10.发送一封包含HTML、富文本和普通文本三个版本的邮件,要想客户端能选择一个合适的版本打开,MIME的content-type应该是什么?
" I4 L/ ]/ g  ?, H+ o* V% p! V" k
A.multipart/mixed
9 K5 O! f) \8 |B.multipart/alternative
: f( N$ H& o9 F% m& a! PC.multipart/default1 \8 P  T* `" [" l9 ]6 ?! W
D.multipart/related
4 t: I$ W1 P7 [) x* [E.不可能用content-type实现/ x+ E) V6 z# z$ H+ e* F
  d& u$ o: K+ _: p) q
, W' ?9 d6 B5 V7 s# D; u
11.假设你的机器上没有安装sendmail,要想mail函数能在Windows下使用,需要做什么?
( m) L% [) e0 g+ {4 w  @, }& V3 M
A.安装sendmail服务器
4 R0 ?; |: k& m+ D. m2 XB.安装Microsoft Exchange" E$ b: g2 y+ U% d3 E7 c
C.在你的电脑上安装任何一种邮件服务器
* B: E6 i7 j3 `( ^  O" ?1 H, e9 CD.改变php.ini的设置
; v$ s1 S& g$ ~/ n3 `E.写一个连接公共电子邮件服务器的脚本1 y# z4 v( a. t" N( D% J
( e" a; ~* |& L. U0 R! R

& C" H2 L0 j5 V* f2 O, y4 E) W12.有一个向用户提交的地址发送指定内容的文本邮件的表单,以下哪种方法有助于防止通过该表单进行跨站攻击?(双选)8 g1 R4 G5 |; U' `# q8 p

- U4 B# t8 y7 j5 z3 L: mA.使用GET方式传值3 \4 Y: h4 }0 ]/ M
B.用htmlentities()处理电子邮件地址
; ^/ W2 C! H7 [7 R. W' O- I$ LC.使用POST方式传值; }8 A! T3 Y# ~+ V8 s
D.用htmlentities()处理邮件正文2 B4 P+ u* o: W+ M
E.确保填写邮件地址的文本域不能有换行符
; B/ ?, z" \% Q! ]
' v. i* s8 l) `2 d* ~7 a2 a5 g4 f- W& R( i
13.如何将一个数组作为附件发送,并要能在接收后重新组合?
; O/ d. D& G( @9 T( }# r
2 d8 s1 x/ ~% v! c, s* i% cA.用serialize()把它转换成字符串,再用htmlentities()处理一下) R- T2 r& V1 A0 W, U  g  w' V" q
B.把它存在文件中,并用base64_encode()进行编码
2 J0 t5 I0 s! L- sC.用serialize()把它转换成数组
# J+ f3 h; y9 R2 _% _( UD.用serialize()把它转换成数组,再用base64_encode()进行编码
; W3 r7 [9 Q  WE.把它存在文件中,再用convert_uuencode()进行编码3 T1 A/ G$ v" l- \9 |  y5 D

+ U8 x: i$ x/ j2 X! k; V' D$ W8 p. I7 [. n/ p: ?3 F
14.要确定需要嵌入在MIME/multipart 邮件中的文件该使用什么MIME类型,以下那种方法最好?
( \( q6 g- Q5 ]7 a6 {' j
! M  y9 p9 N1 RA.堆一个检测脚本出来
& i+ o4 X# S2 V9 jB.创建一个MIME类型和文件后缀名的列表,根据后缀名选定需要的MIME类型8 V: ?' G* r) v& m
C.写一个识别文件MIME类型与内容是否相符的函数$ V" F. Y+ |. W( i9 i5 k" p" T
D.使用mime_content_type函数1 [0 i# y; D' Z
E.把文件上传到外部服务器上" E% n2 [, ^( L6 p, k3 C

1 j/ C. ]6 Z* Y, }! Q9 A) Y' z0 T% C9 j$ ?  Y, @! o2 }4 N
15.在UNIX环境下使用本地安装的sendmail,如何才能随意设置邮件的发件人名字与发件人地址?(三选)  ]4 s% s% T( A# i; u

& T, ?4 L8 Q! @. YA.添加一个From头信息
& }3 v0 R/ \8 _  B0 k3 hB.使用-f参数7 b) f( @# ~: C% T, H% ~# C
C.添加一个Reply-to的头信息9 S5 C8 r. m: d6 ]/ u
D.确保运行Apache的用户有修改sendmail设置的权利% S6 l# u- }0 `. O: Z5 u8 }
E.确保Apache在root用户下运行' o% Y! r( M3 a; a% e
答案速查
# G6 Q" u2 D5 U4 u1:D
! X+ K/ ]% k' H& ?& W$ S2:AD
4 }, s; |& s8 t3 d3:E3 B. ]3 W9 x6 \% R
4:Content-Type:MIME+ k: h- x9 X* j/ L2 ?
5:BC
- ]4 Q; C4 X: W1 u& j: T" I6:A
/ @, L; k( {, Q7:C
/ B1 C4 R: ?! A8:BCE
% `' O* f  u0 B6 }9:ACD9 F$ y. @5 ?) R5 u5 c
10:B
: M( }& K* i" }0 ]6 h/ k( l3 N3 s2 c! h11:D
  E' @1 d1 S3 i; K12:CE
. s3 J: @+ P% m: e0 F! s13:D
0 u& _. v! |  y. x14:D! {! ]- R/ A( B! S3 Y7 t& x) o# f) s/ W
15:ABD2 j1 O: h. |" T* W8 R
& U' Z, F& }- @3 E

, O) q- L. o* a( v+ x# a: r/ [: y& d" i) _! H) I% f
答案详解
& d' ~' ^: t2 l" T8 G* T
. k, q' b# M( P- S# g. U1 k1.列出的E-Mail地址中只有D不合法。A和B都是最经典、常用的电子邮件地址。C看起来不合法,但邮件传输代理(MTA)会自动过滤多余的空格。E可以在本地发送时使用。那么就只剩下D了,它里面有一个非法字符。
2 E  M8 h0 I2 A  k' U& V6 L' r2 Z! z; v- ~
2.正确答案是A和D。UNIX版本的PHP需要用sendmail程序(或者功能等同的替代品)通过MTA发送邮件,Windows/Novell版本的则通过SMTP直接用MTA发送。然而,如果允许的话,Windows/Novell上的PHP也可以进行配置,来通过“sendmail封装器”模拟sendmail发信。也就是说PHP在这三个版本上能够以相同的方式实现此功能。注意,在Windows/Novell上使用mail()时,需要配置sendmail_from。而UNIX则把这件事交给sendmail程序自己来处理。1 @( B* Y& j; U' v/ A; q4 T  ]

- f, B% Y0 O$ B& s) s% S) w3.PHP可以用mail函数发送任何格式合法的电子邮件,于是编写用SMTP发信的PHP脚本成为了下策。要在E-Mail中添加额外的头信息,则必须向函数传递$additional_headers参数,每个头信息以一个回车符和一个换行符结尾(\r\n)。发送复杂的邮件,比如带附件的或者HTML格式的邮件,则不仅需要添加额外的头信息,还要添加MIME类型。所以答案是E。
5 b( |& v1 g6 m5 t  |) N; ^( R) n1 M9 D$ d) L
4.发送由多个部分组成的MIME邮件时,你必须指定一个分隔符(任何US-ASCII字符串),它必须不同于邮件主题中任何一个部分。分隔符必须与MIME信息中嵌入的任何一部分都不同。分隔符在Content-Type: MIME中定义。
- g! c! {3 K4 G8 v$ l; b4 o! r2 w1 a- H. B
5.有两个选项指出了在HTML邮件中包含图片等资源的正确方法。最快的方法就是直接引用一张远程图片。然而,图片以及其他资源能够以MIME内容块的形式嵌入MIME邮件自身。这些内容块会被赋予ID,可以通过把src属性设置为cid:资源标识加内容ID的方式来调用。因此答案B和C正确。0 e! M* j8 j0 |  @' S; p
& a! L) O# @( W+ @1 b  ]
6.mail函数的最后一个参数用来向sendmail程序传递参数,不过这只能在安装了sendmail的UNIX系统上进行。如果Windows/Novell系统上配置了sendmail_path,那么这个参数同样也是可用的。, O: D' a9 U+ \5 R, g  ?" M
/ _. V0 P+ i4 x" e0 @, E  s
7.答案是C。MIME头信息里的内容编码(Content-Transfer-Encoding)用来指出MIME邮件中各个片段的编码。头信息中包含一组指出了编码算法的二进制数据。默认情况下,7bit,quoted-printable,base64,8bit和binary是可用的编码类型。不过任何人也可以通过使用x-<unique name for encoding>来声明自己的编码格式。
7 s1 _4 k$ W2 V. s6 y- C) H# i. C5 E# g7 i, C1 \0 F9 e
8.正确答案是B,C和E。分隔符是MIME邮件中至关重要的一部分。虽然分隔符的长度没有官方限制,但由于分隔符由文本字符构成,因此它绝对不能出现在邮件主体中,否则就会造成混乱。考虑一种灾难性的情况:假设我们用John做分隔符,那么邮件中提到的人名John就会分隔邮件,导致邮件内容的混乱。
. ^  {4 L* H' _' M2 J- }2 ~9 c6 u) D  q7 ]4 E& J/ I3 D3 A
9.要从给定的文本信息中创建一份合法的MIME邮件,正确的答案是A,C和D。MIME邮件在开头处必须有MIME-Version头信息,而邮件的每个片段(包括“root”片段)都必须有Content-Type和content-transfer-encoding这两个部分。答案中提到的另外两个头信息是可选的:Content-Disposition用来指出片段要如何显示(比如显示为附件),Content-ID是片段中的各个内容的唯一识别符。
2 `- m5 D" D8 d+ _  i' r  }1 b& k* e: T5 y* b  U; \: u! t
10.正确答案是B。这种特殊的MIME类型用来定义一个含多个内容相同的子版本片段的母片段。比如说,一个multipart/alternative片段包含一个text/plain和一个text/html版本的片段。然后由电子邮件客户端选择一个最合适的版本来显示给用户。通常情况下,最好放入一个文本格式的版本,这样不支持MIME的邮件客户端也能正常读取。
; S& k0 y8 D( v- @
6 ^6 ^- C  S! x1 |+ X9 _11.在类UNIX系统中,PHP依靠sendmail程序来处理邮件。而在Windows中,除非已有sendmail包装器,否则将使用服务器的SMTP配置来进行。答案是D。) k% C) N; p% Q# v

6 T+ M& i) I- O0 x! F! |. v7 S( [# i* f12.在普通文本邮件中使用htmlentities()不能防止跨站攻击,反而可能会让邮件内容变得不可读。强制使用POST传递变量只能让攻击变的困难,但并非绝对安全。确保E-Mail文本域(将变成To:的部分)中没有换行符,能够防止恶意用户把自己的邮件地址添加进收件人地址中。因此答案是C和E。
+ b3 V" B; l* D# h! e1 S- O8 |( P: N3 y9 Y- N  h
13.把数组序列化成一个字符串是传输这个数组的正确方式——第一步先让数组变得可以通过E-Mail网络传输。接下来你需要对它进行编码,以使得它能够安全传输。在PHP4中,最简单的方法是用base64_encode把它编码成每字符7bit的形式。答案是D。
8 a+ X9 F' c6 z& F  |4 n+ j( V5 W: M3 i) \- Y
14.要判断一个文件的MIME类型,最简单的方法是使用mime_content_type函数。答案是D。注意,虽然别的扩展库里有能更好的解决这个问题的函数(译者注:比如PECL的FileInfo),但在这里使用mime_content_type仍然是可以的。
) P1 S9 u( |% M
8 F- `$ u( h- {5 R* [/ f15.在头信息中添加From不能完全保证sendmail不会在邮件中重写你的发件人地址。事实上,你需要通过发送器向sendmail传递-f参数。除此之外,你还必须确保运行Apache的用户有修改头信息中的From内容的权限。因此答案是A,B和D。

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