AS3 SMTPMailer的一点功能改进

上次提到做一个项目要用到发送邮件的功能,于是在Github上找了个不错的类库,叫SMTPMailer。

但是后期使用的时候仍然发现了几点小问题:

1.不能添加多个收件人。

2.发送的参数中包含一些中文字符就会出现乱码现象。

说明:测试使用126邮箱向126及qq邮箱发送邮件,使用文本方式及html方式都有。

针对第一点,我添加了个检测多邮箱的方法在SMTPMailer里面(多个邮箱使用 ; 分割)

 

public function checkMultiTo(queue:Array, to:String):Array {
	if (to.indexOf('; ') > 0) {
		var emails:Array = to.split('; ');
		emails = emails.map(function(item:*, i:int, all:Array):String {
			return 'RCPT TO: <' + item + '>';
		});
		return [queue[0]].concat(emails).concat(queue.slice(2));
	}else {
		return queue;
	}
}

 

SMTPMailer中发不同格式的邮件是分几个方法写出的

sendAttachedMail:发送包含附件的邮件

sendHTMLMail:发送包含HTML格式内容的邮件

sendPlainTextMail:发送纯文本邮件

sendTestMail:发送测试邮件

要在这几个函数中加入队列前调用检测多个接收邮箱的函数

//调整队列为多个接收邮件
c = this.checkMultiTo(c, pDest);
//加入队列并开始
addToQueue(c);
startQueue();

 

原理就是在开始前调整队列,RFC说明是"RCPT TO:"可以发送多次来指定多个接收邮箱,调整队列的时候就将这个取出来,根据邮箱这个参数生成多条指令,再插入原来的位置就可以了。

针对第二个问题,基本上可以判断是编码问题,RFC标准是以ASCII码来发送的,邮件内容部分有明确的开始和结束,一般不会影响到,一般是指定发件人别名,邮件标题时会出现这种情况,导致MIME Version和Content-Type指令不能被识别,而混入邮件内容,就好像是乱码了。

那这里就在生成队列前把这两个字段用UTF-8编码就可以了。看了下网上很多例子的编码格式,是以指定的字符串起始和结尾,中间使用BASE64编码

同样,需要在SMTPMailer上添加一个编码方法,很简单

public function UTF8Encode(str:String):String {
	return '=?utf-8?B?'+Base64.encode64String(str)+'?=';
}

然后在每个发送函数的生成队列前就对需要编码的参数编码

//对两个字段编码
pSubject = this.UTF8Encode(pSubject);
fromName = this.UTF8Encode(fromName);
//下面开始生成队列
var c:Array = [ "MAIL FROM: <" + pFrom + ">",

测试了下,126和qq的接收识别都正常了。