从来没用过flex的socket,今天无聊就写了个smtp的发邮件小程序,顺便复习了下smtp协议,别的不说,直接贴代码吧。
mail.as:
- package mail
- {
- import flash.events.Event;
- import flash.events.ProgressEvent;
- import flash.events.SecurityErrorEvent;
- import flash.net.Socket;
- import flash.utils.ByteArray;
-
- import mx.controls.Alert;
- import mx.formatters.DateFormatter;
-
- public class Mail
- {
- private var socket:Socket;
- private var isLogin:Boolean = false;
- private var smtp:String;
-
- public function Mail(smtp:String)
- {
- initSocket(smtp);
- }
-
- public function initSocket(smtp:String):void
- {
- this.smtp = smtp;
- if(socket==null || !socket.connected)
- {
- socket = new Socket();
- socket.connect(smtp,25);
- socket.addEventListener(Event.CONNECT,ConnectionHandler);
- socket.addEventListener(Event.CLOSE,CloseHandler);
- socket.addEventListener(ProgressEvent.SOCKET_DATA,ReceiveHandler);
- socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,ErrorHandler);
- }
- }
-
- private function ErrorHandler(evt:SecurityErrorEvent):void
- {
- trace("error!");
- }
-
- public function ConnectionHandler(evt:Event):void
- {
- trace(" 链接成功");
- }
-
- public function CloseHandler(evt:Event):void
- {
- isLogin = false;
- trace("已经从服务器断开");
- }
-
- private function ReceiveHandler(evt:Event):void
- {
- var msg:String = "";
- while(socket.bytesAvailable)
- {
- msg += socket.readMultiByte(socket.bytesAvailable,"utf8");
- }
- trace(msg);
- }
-
- public function Send(user:String, pwd:String, mailFrom:String, mailTo:String,subject:String,content:String):void
- {
- if(socket==null || !socket.connected)
- {
- initSocket(this.smtp);
- }
- sendMessage("HELO mail");
- if(!isLogin)
- {
- sendMessage("AUTH LOGIN");
- sendMessage(Base64.encode(user));
- sendMessage(Base64.encode(pwd));
- isLogin = true;
- }
- sendMessage("MAIL FROM: <"+mailFrom+">");
- sendMessage("RCPT TO: <"+mailTo+">");
- sendMessage("DATA");
- var dateFormatter:DateFormatter = new DateFormatter();
- dateFormatter.formatString = "yyyy-mm-dd";
- sendMessage("Date: "+dateFormatter.format(new Date()));
- sendMessage("From: "+mailFrom);
- sendMessage("To: "+mailTo);
- sendMessage("Content-Type: text/html");
- sendMessage("Subject: "+subject);
- sendMessage("");
- sendMessage("");
- sendMessage(content);
- sendMessage(".");
- }
- internal function sendMessage(msg:String):void
- {
- var message:ByteArray = new ByteArray();
- message.writeUTFBytes(msg+"\r\n");
- socket.writeBytes(message);
- socket.flush();
- }
- }
- }
|
这里用户名,密码要进行base64编码,用的是别人写的一个现成的类,下载地址是:http://dynamicflash.com/downloads/base64/Base64-1.1.0.zip
解压后直接把src里面的as文件拷贝到工程下就行了,记得要改包名。
首页上的测试代码是:
- <mx:Script>
- <![CDATA[
- import mail.Mail;
- import mail.Base64;
- import mx.controls.Alert;
-
- private var xmlSocket:Socket;
- private var m:Mail;
-
- private function init():void
- {
- m = new Mail("smtp.qq.com");
- }
-
- public function login():void
- {
- Alert.show("aa");
- m.Send("用户名","密码","发送方地址","接受方地址","测试","病毒");
- }
- ]]>
- </mx:Script>
|
执行login就行了,我用的是qq邮箱测试的,可能要打开qq邮箱的smtp功能,在邮箱-->设置-->账户里面就可以更改设置。其他的我没有测试,测试了的朋友可以告诉我下结果哈。