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的接收识别都正常了。