上一篇 | 下一篇

在Director中发送E-mail(三)

发布: 2007-1-25 14:21 | 作者: Zac Belado | 来源: 译自director-online.com | 查看: 185次

  原著:Zac Belado
*ok @Wr I   翻译:alphachi奥古多媒体4e2`fs/C L
奥古多媒体%[5[iP%?eL%O{t
  DirectEmail Xtra
eq1[TeA8p#E+j
IZz| O;f/pW:^   使用DirectXtras的DirectEmail Xtra或许是最好的解决方案。这个Xtra是跨平台的,并且也是Shockwave安全组件(点击这里观看Shockwave版本的示例影片),所以用此方法创建和发送email的方案能被广泛采用。它的使用方法很简单,而且允许在Director中定制整个处理程序。奥古多媒体Vx5Vk%lW3pS hY/E

9gJ2WFi U%^_ bep   DirectEmail Xtra的命令格式很简单: 奥古多媒体?%eiOZ3P K?Rz
奥古多媒体^"`#N/p(iwa
  *New ( Xtra "DirectEmail", string mailServer, string MailboxName, string Password )
.G g2cTo4W?e)s4@.n
  创建Xtra的一个新的实例奥古多媒体Yp WLU H&ex@/K

IR,D#Qk V3c C   *SendEmail ( object me, string From, string To, string CC, string BCC, string Subject, string Body, string Attachment )
3l#D^jT?)}3X   创建并发送email消息。如果此Xtra正忙于发送另外一条email消息的话,返回FALSE 奥古多媒体%Ya4U0G| sw

;E!Vy2l+t Rl   *EmailDone ( object me )奥古多媒体-K:i'm]&tR h.x~A
  如果email处理程序已经运行完毕,像netDone()函数一样返回TRUE
U:n5wo h$M"?
X#gf)bv1[   *EmailErrorCode ( object me )
KXC*]*u7~   返回因为Xtra实例运行而产生的最近一次错误的代码奥古多媒体 g_qI+O,cy/P

;vQV.f tS$D*\o   *EmailErrorMessage ( object me )奥古多媒体-v2^T4\9]
  以友好的方式返回错误信息。
8k5bh;az^/P6A
/`'V%LMf&K   *EmailAbort ( object me )
o @!q} C&~#n   终止email处理程序。 奥古多媒体_y3B"Mb/W
奥古多媒体f%CZC2}8emJ P
  *GetUserEmailPref ( integer InfoToLocate )
3U6`)ie?8r bs   如果有相关的Internet配置安装在用户的机器上,返回用户缺省的email地址和mail服务器地址。此命令仅适用于Mac机。 奥古多媒体 T4]2hm vXj+uW%O

h%L rMF ea%L   用这个Xtra发送一个email消息的步骤也很简单。奥古多媒体&ESg @c@y,M"{k6R

8C&u.y;p] @L
奥古多媒体bI&kF1^@{*q.L
奥古多媒体"~#o)w Yp i.W;wB
  Step 1 奥古多媒体\u |A_D^)H `2u
奥古多媒体2`op%m bH,o&[
  你要做的第一件事就是创建一个这个Xtra的实例,并给其提供mail服务器的地址,然后它将尝试直接发送mail。也可以让用户提供,甚至由你来提供硬代码。
RMB"}Y6P@2Q/Ah?
#Umpr9p&T%L2A global gEmail奥古多媒体${!I)X&DfP+w7PG;@l
gEmail = new (Xtra "DirectEmail", "mail.somedomain.com", "", "")

8J0O9PD"i2e4z/T   一旦创建了这个Xtra的实例,就应该将其存储在一个全局变量或目标属性里,以便迟些时候能够找到。注意,这个Xtra的最后两个参数(mailBoxName和password)在这个版本中并不能正确的使用,你只要用空白字符串填充即可。
^Wr(x!T `/s%sX
|#OM Tjrz:?V   Step 2 奥古多媒体G2rC.|2d4a)Tep;z

1_$r.v0k#B8y E2K   现在你需要提供要通过email传递的实际信息。在样本影片中,这些信息由包含在一系列域中的内容提供,这些内容都是用户输入的数据。奥古多媒体3nL$`o'J-SQ
奥古多媒体`.NGgV r
  首先,你要从域中获取数据:奥古多媒体q\0K;JvUZ|"iN
奥古多媒体/r@.\{tn#o0N#fn
奥古多媒体x`UN7qb zL
messageHasErrors = FALSE奥古多媒体!OM!gD|)u
errorMessage = ""奥古多媒体4P7L+hu-l7o0EW,L
recipients = member("To").text
I q(`Z-hS$[%l fromAddress = member("From").text
0zaJ{J8oY6^ mailServer = member("MailServer").text
\0P``Sr${ YI CCRecipients = member("CC").text
vrpt_ | BCCRecipients = member("Bcc").text
*`H_6Dd4b+Q body = member("Body").text
[;C-P:\'RW*v7b(O attachment = member("Attachment").text奥古多媒体D(tyR F:`
subject = member("Subject").text
奥古多媒体%D;tZQ }

jaFNQV7[!~8c*g"~L   然后将它存储到一些比较方便的地方,比如一个属性列表,主要是为了更容易参考。
"ke'h"Y\4I;h
r2Qc/|(v(\4T --将这些数据存储到一个正规的属性列表中
0E _ b;k*zt messagePropList = [#to:recipients, #from: fromAddress, #server:mailServer, #CC:CCRecipients, #BCC:BCCRecipients, #body:body, #subject:subject, #attachment:attachment]奥古多媒体o"K E4Yy)Z1M{

]0te0F+Oz   然后作一些测试,以确保用户输入了数据。可能也应该测试数据的有效性,以确保用户输入了有效的email地址,甚至有效的mail服务器地址。在样本影片中用isValidEmail()函数和emailValidationError()函数来实现此功能。本例中只测试了“To:”和“From:”。
+l;T.my(z$il Q
n4^9BDK if recipients = EMPTY then奥古多媒体!g3QihH
  messageHasErrors = TRUE奥古多媒体$W]I}'ly3X
  errorMessage = errorMessage & "You need to specifiy at least one recipient" & RETURN
lI6m9_[R!yF!L end if
b2ai%B"H'{W[ if fromAddress = EMPTY then
f4Dof!Q}+|!{M1f   messageHasErrors = TRUE奥古多媒体b1xTm o;ga D
  errorMessage = errorMessage & "You need to an email address to send the message from" & RETURN
w0Q b't r2W"R end if
"t0n@(z+]  --验证地址是否有效
E%s _9Bdbf ~ toAddressHasErrors = isValidEmail (messagePropList.to)奥古多媒体o\/o;z"h7~ dPb$t
fromAddressHasErrors = isValidEmail (messagePropList.from)奥古多媒体2mK#oe"@9NdVO
if toAddressHasErrors then奥古多媒体$nBb@(`8m)w
  messageHasErrors = TRUE奥古多媒体E*t ]Z{6W$R*J
  errorMessage = errorMessage & "The To: address you supplied is not valid because" && emailValidationError (toAddressHasErrors) & RETURN
~X3idh xWg end if
)h$?k[ q*IF\$D   奥古多媒体k1bIpp
if fromAddressHasErrors then奥古多媒体W_)p7l0uh9w7k
  messageHasErrors = TRUE奥古多媒体z`+m.]:E"S D
  errorMessage = errorMessage & "The From: address you supplied is not valid because" && emailValidationError (fromAddressHasErrors) & RETURN奥古多媒体S gV'g y'i)G$}E hb
end if
y1Sr`X C+@-i.U M+D 奥古多媒体.aPi` ["^f9I
  如果没有错误,将这些信息数据发送给早些时候创建的Xtra实例。
aFZ{8X6W bY [7U0y 奥古多媒体0f9_KSW*?/c6]z6P
if NOT messageHasErrors then 奥古多媒体apM2yu&[3ic
  isOkayToSend = sendEmail (gEmail, messagePropList.from, messagePropList.to, messagePropList.cc, messagePropList.bcc, messagePropList.subject, messagePropList.body, messagePropList.attachment)奥古多媒体 z w"WayOf Y
else
1}$z u4A3Yj   alert errorMessage
i @X%u3Hspf}v5@m end if奥古多媒体!I2?Gr&mKSgXa? R
  
X!O"J!D9F2X:i[ m   Step 3 奥古多媒体AW {Tsr#nP"Q;M2C8x
奥古多媒体A.V9zJ&u-N0b]8@
  现在等待程序运行完成。DirectEmail Xtra有一个emailDone()函数能够测试程序是否运行完成,这和用netDone()函数检测网络操作是否完成非常相似,只是需要用此实例中的相关参数来代替网络ID。你可以在一个exitFrame处理程序中测试这个函数,但在一个对象或行为的stepFrame处理程序中测试可能会更好。奥古多媒体.D%K2by0~+l~6@)A

0{%O2x Jb.~.fp   为了简单起见,样本影片将本文所涉及的全部处理程序都包括到了一个单一对象中。这并不意味着你也必须使用对象,仅仅因为本人喜欢在每件事里都使用对象。在一个exitFrame处理程序中测试emailDone()函数非常容易,一旦程序运行完毕,影片会跳到另外一帧。奥古多媒体H @x8a%uJI
奥古多媒体 k _O#a-J$U:R5dZ
global gEmail
8@ k/skw0x0W/KP on exitFrame奥古多媒体 _|AXl!C2z'Zb
 --完成了吗?
)t DY Jky i   if EmailDone(gEmail) then
T9eZ:R"C N     go to frame "done"
Ki-{2N#jY,{!B   else
I)mX3MP B     member("status").text = "Waiting for results..."奥古多媒体lZ Z@;Izp
  end if
j5s;K a~1WtF end奥古多媒体T y2Vl%VZ

0E _0{ xU   Step 4
jQ/o]A&K5W
`6l:R P4g   一旦mail程序运行完毕,就需要测试emailErrorCode()函数,以判断email是否已经发送成功。奥古多媒体6E;V#PL d k
奥古多媒体J$M@.nwI!g1Q._6J,O
emailHasErrors = EmailErrorCode(gEmail)
l4t#eHCTz5O If NOT emailHasErrors then
8m-N7\w%h?   member("status").text = "Your Message was Sent!"
$Q1G4? n0isz else 奥古多媒体R"u%HD7[
  member("status").text = "Error:" && emailHasErrors && emailErrorMessage(gEmail)奥古多媒体1v9L'p)x0Z4\3y#_
end if奥古多媒体?x,m9E"mj,j K

i'zV sVzvU/xR   如果发送成功,emailErrorCode()函数将返回0值;如果有问题的话,返回其他整数值,代表有错误。emailErrorMessage()函数将返回一串描述错误的字符,以便将错误报告给用户。
/H["y s-b5v 奥古多媒体c"rQ,az'L:KT
  DirectEmail xtra的另一个特点就是拥有测试和报告的功能,而另外两种方案并不允许这么做。如果在mail处理程序运行期间用户的网络连接被中断,Xtra将报告给用户。如果用户指定的mail服务器不能使用DNS,Xtra将会报告给你并能够将此信息反馈给用户。此外,它允许你在Lingo代码中初始化和控制整个程序,这意味着你不必受困于操作系统配置问题、缺少email客户端或者CGI的某些特性。
奥古多媒体7iAk u~f'u

t`U }{ |#W D   细节问题
|r&g{z;uJ 奥古多媒体0{Zd{\
  样本影片基本是按上述步骤创建的,但将此Xtra中的所有交互包含到了一个对象中。这样做有两个原因。首先,这样做使影片更加简单。除了实现基本的发送email的功能外,这个影片还有两个按钮剧本,一个检测用户提供信息有效性的函数和一个"go to the frame"的exitFrame处理程序。其次,只需很少的工作量,就可以做到大多数代码再利用。由于大部分代码都在一个对象中,所以几乎只需要简单的复制粘贴,就可以将其添加到别的影片中。
#U$Z"R!X x L"a C
,},y @lph7F;pq   在样本影片中,如果用户不点击发送按钮,将不会有任何事发生。一旦点击了发送按钮,sendMail()函数将测试数据。如果数据有效则创建一个属性列表,然后创建一个新的对象并切断这个对象的数据传输。此外,该对象被作为一个全局变量存储。
;GN|s\\4s
%l N k+C7m9T   该对象创建了一个Xtra的实例并将其作为属性存储,它只能在对象内存取数据。然后对象将mail数据发送给Xtra,并把自己添加到actorList中。 奥古多媒体TP6d:Nq?}Ar5W

CGgq0{-]H-P/n   在stepFrame处理程序中,对象检测email程序是否运行完毕。如果完毕,再检测是否有错误发生并将其报告给用户。然后对象删除这个DirectEmail xtra的实例,并调用一个外部处理程序stopEmail()以删除这个对象。 奥古多媒体2@3V+ZmI gT'V:e7Dj
奥古多媒体2\,v%S PU+m+U
  总结
.E ^+Z ZG8I/g 奥古多媒体BX@ ]&vXf#}
  在上面讨论的三种方案里,真正有使用价值的是服务器端的CGI和DirectEmail Xtra。gotoNetPage看起来好像是一个快速简便的解决方案,但实际上它有很多潜在问题,比如无法控制和无法测试。如果你有编写CGI的经验,或者有权使用他人编写的CGI,或者有权修改他人编写的CGI以使其更适用,那么使用服务器端的CGI也是一个可行的方案。但如果你想创建基于Director的自定义的email解决方案,DirectEmail Xtra或许是最好的。

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


最新歌曲
转机 放生 黄玫瑰 摇啊摇 那滋味 擦肩而过 你若成风 幸福一辈子 依然在一起 吻得太逼真 感动天感动地 坐上火车去拉萨 怎么会狠心伤害我
心碎 冲动 小太阳 别碰我 蒲公英 爱情小偷 只要不亏 一定要爱你 等爱的玫瑰 无情的温柔 北极星的眼泪 最后一次的温柔 亲爱的那不是爱情
光荣 火花 下雨天 我可以 樱花草 为你写诗 独家记忆 再见小时候 寂寞才说爱 忘不掉的伤 爱上你是个错 第三者的第三者 孤独的时候可以抱你
假如 城府 是非题 有缘人 舍不得 我的答铃 只欠秋天 外滩十八号 越爱越难过 123木头人 爱走了心碎了 爱上你是我的错 爱情里没有谁对谁错