发送邮件这种耗时坑爹的东西,必然要用异步实现比较好。尤其是用gmail但是gmail服务器还抽风的时候。
很原始的实现,线程。。
可以接上一篇的JavaMail简介写:
new Thread(new Rinnable(){
public void run() {
MailUtil.sendMail("一些需要的参数");
} catch(Exception e){
//另外一些操作。。
}
}).start();
涨姿势了,可以用线程池:
Properties props = new Properties();
Runnable task = new Runnable() {
public void run() {
try {
MailSender.sendMail(emailAddr, mailTitle, mailConcept);
} catch (Exception ex) {
//error message
};
};
};
executor.execute(task);
补充一个异步发送邮件全Source:
package com.xxx.xxx.accountmgt.util;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Logger;
import org.jfree.util.Log;
/**
* @version 1.0
* @author fengym <fengym@soulgame.com>
* Description 邮件发送器
*/
public class MailUtil {
final static Logger logger = Logger.getLogger(MailUtil.class);
private static Executor executor = Executors.newFixedThreadPool(10);
/**
* 发送邮件方法
*/
public static void sendMail(final String emailAddr, final String mailTitle,
final String mailConcept) throws Exception {
if(Log.isInfoEnabled()){
logger.info("send mail start!");
logger.info("To: " + emailAddr + " Title: " + mailTitle);
}
Properties props = new Properties();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
props.load(classLoader.getResourceAsStream("mail.properties"));
final String username = props.getProperty("mail.username");
final String password = props.getProperty("mail.password");
final String mailFrom = props.getProperty("mail.from");
Session mailSession = Session.getDefaultInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
mailSession.setDebug(false);
MimeMessage message = new MimeMessage(mailSession);
message.setSubject(mailTitle);
message.setFrom(new InternetAddress(mailFrom));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
emailAddr, false));
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(mailConcept, "text/html; charset=utf-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
Transport transport = mailSession.getTransport();
transport.connect();
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
if(Log.isInfoEnabled()){
logger.info("end!");
}
}
/**
* 异步方式发送邮件
*/
public static void sendMailByAsync(final String emailAddr, final String mailTitle,
final String mailConcept){
if(Log.isInfoEnabled()){
logger.info("send mail by async");
}
Runnable task = new Runnable() {
public void run() {
try {
MailUtil.sendMail(emailAddr, mailTitle, mailConcept);
} catch (Exception ex) {
logger.error("ERROR To: " + emailAddr + " Title: " + mailTitle , ex);
};
};
};
executor.execute(task);
}
public static void main(String[] args) throws Exception {
MailUtil.sendMailByAsync("fengym@soulgame.com", "我是标题", "我是内容");
}
}
配置文件:
mail.transport.protocol=smtp
mail.host=smtp.gmail.com
mail.smtp.auth=true
mail.smtp.port=465
mail.smtp.starttls.enable=true
mail.username=xxx@soulgame.com
mail.password=xxxxxxxx
mail.from=xxx@soulgame.com
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false
mail.smtp.socketFactory.port=465