Flash builder邮件发送的实现
Flash builder要发送邮件,常见实现方法主要有两种,一种是使用Flash builder的Stock类与邮件服务器直接通信;另一种是通过后台处理邮件发送,Flash Builder只是负责前端信息的封装。
首先简单介绍第一种方法,多数邮件服务器使用stock端口25,使用的通信协议是SMTP,如果是中文的非ASCII字符邮件还有知道MIME协议的内容。Stock端口和SMTP协议先不说了,现在所说MIME协议规范介绍。SMTP是传输ASCII 7位字符,第八位必须是零,如果一封中文邮件使用gb2312等编码就不能直接传输,因为接收方收到乱码邮件甚至发送出错,还有早期邮件协议只考虑传输纯文本,发展到后来为了解决可以传输复杂的附件,于是引入MIME协议,它主要就是解决这两个问题及如何编码。
SMTP是一个相对简单的基于文本的协议,如果与SMTP服务器建立通信,就可以发送经过MIME格式编码的邮件,基于这种想法,俺尝试使用Flash Builder直接发送邮件。实际上,在编写程序和测试上需要解决这几个问题:
1. 编写连接SMTP服务器及发送mail的类;
2. 邮件内容Base64编码;
3. 解决Flash AS3 Socket类不能访问低于1024端口;
4. 由于要解决第三个问题,需要一个跨域策略文件,如何放置这个文件;
基于第一种使用Flash builder的Stock类与邮件服务器直接通信方式,留待日后讨论,下面介绍另一种是通过后台处理邮件发送,这种比第一种方式容易多了,因为使用Java来发邮件,需要使用一个apache的email开源项目,有这个开源类库,一切都非常简单。
建立一个Java类MailNotification.java,用于发送邮件:
引入apache的email开源项目类库
import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
public class MailNotification {
定义SMTP连接参数,如服务器地址,认证帐号及密码,端口等等;
private final String MAILHOST="smtp.gmail.com";
private final String MAIL_AUTHENTICATOR_USER="nba1994@gmail.com";
private final String MAIL_AUTHENTICATOR_USERPASSWORD="nba1994";
private final String MAIL_FROM="nba1994@gmail.com";
private final String MAIL_CHARSET="gb2312";
private final int MAIL_SMTPPORT=587;
定义发邮件方法,可以由Flash builder远程调用,参数是收件人,邮件标题,邮件内容
public boolean SendMail(String _mailto,
String _mailsubject,
String _mailmessage
){
Email email = new SimpleEmail();
email.setHostName(MAILHOST);
email.setSmtpPort(MAIL_SMTPPORT);
email.setCharset(MAIL_CHARSET);
email.setAuthenticator(new DefaultAuthenticator(MAIL_AUTHENTICATOR_USER, MAIL_AUTHENTICATOR_USERPASSWORD));
email.setTLS(true);
try {
email.setFrom(MAIL_FROM);
email.setSubject(_mailsubject);
email.setMsg(_mailmessage);
email.addTo(_mailto);
email.send();
} catch (EmailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
System.out.println("邮件发送成功");
return true;
}
类结束标志;
}
由于使用LCDS的远程调用方法,需要在remoting-config.xml定义一个destination:
<destination id="echo3007A">
<channels>
<channel ref="my-nio-amf"/>
</channels>
<properties>
<source>com.les.java3007.MailNotification</source>
<scope>request</scope>
</properties>
</destination>
Flashbuilder测试文件,俺将这个功能写成一个模块
<?xml version="1.0" encoding="utf-8"?>
<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:services="services.*"
width="400" height="300">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
protected function button_clickHandler(event:MouseEvent):void
{
SendMailResult.token = parentApplication.echo3007A.SendMail( _textinput01.text, _textinput02.text, _textinput03.text);
}
protected function SendMailResult_resultHandler(event:ResultEvent):void
{
// TODO Auto-generated method stub
if (event.result as Boolean){
Alert.show("邮件发送成功");
}else{
Alert.show("邮件发送失败");
}
}
]]>
</fx:Script>
<fx:Declarations>
<s:CallResponder id="SendMailResult" result="SendMailResult_resultHandler(event)"/>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<s:Button id="button" x="63" y="213" label="按钮" click="button_clickHandler(event)"/>
<s:Label x="63" y="57" text="收件人"/>
<s:Label x="63" y="92" text="题目"/>
<s:Label x="63" y="120" text="内容"/>
<s:TextInput id="_textinput01" x="120" y="52" text="nba1994@21cn.com"/>
<s:TextInput id="_textinput02" x="120" y="82" text="TestMail天天向上"/>
<s:TextInput id="_textinput03" x="120" y="112" width="232" text="This is a test mail 好好学习... :-)"/>
</s:Module>
按button键,5秒之后看结果: