1.这个是Email类
import java.util.ArrayList;
import java.util.List;
public class Email {
public enum KIND {
HTML, TEXT
}
private String host;
private List<String> to;
private String from;
private String subject;
private String htmlContent;
private String textContent;
private KIND type;
public Email() {
to = new ArrayList<String>();
}
public void setKind(KIND kind) {
this.type = kind;
}
public KIND getKind() {
return type;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String[] getTo() {
return to.toArray(new String[to.size()]);
}
public void addTo(String receiver) {
to.add(receiver);
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getHtmlContent() {
return htmlContent;
}
public void setHtmlContent(String htmlContent) {
this.htmlContent = htmlContent;
}
public String getTextContent() {
return textContent;
}
public void setTextContent(String textContent) {
this.textContent = textContent;
}
}
2.以下是发送类
客户调用sendEmail方法向Email队列中添加邮件,而发送类有一个线程负责每2秒中检查邮件队列,如果不为空,取出邮件并发送
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MailSender {
private final static Log logger = LogFactory.getLog(MailSender.class);
private final static MailSender unique = new MailSender();
public static MailSender getInstance() {
return unique;
}
private int totalSent = 0;
private int succSent = 0;
private int failSent = 0;
private Queue<Email> queue;
private MailSender() {
queue = new LinkedList<Email>();
realSend();
}
public int getTotalSent() {
return totalSent;
}
public int getSuccSent() {
return succSent;
}
public int getFailSent() {
return failSent;
}
public void sendEmail(Email email) {
synchronized(queue) {
queue.add(email);
}
if (logger.isDebugEnabled()) {
logger.debug("Enqueue one email succ");
}
}
public void sendEmail(Email[] emails) {
synchronized (queue) {
for (int i = 0; i < emails.length; i++) {
queue.add(emails[i]);
}
}
if (logger.isDebugEnabled()) {
logger.debug("Enqueue emails[" + emails.length + "] succ");
}
}
private void realSend() {
Runnable run = new Runnable() {
public void run() {
while (true) {
List<Email> emails = new ArrayList<Email>();
synchronized (queue) {
while (queue.peek() != null) {
emails.add(queue.poll());
}
}
if (logger.isDebugEnabled()) {
logger.debug("Get Email Count=" + emails.size());
}
for (Email email : emails) {
try {
if (email.getKind() == Email.KIND.HTML) {
sendHtmlEmail(email);
}
else {
sendTextEmail(email);
}
if (logger.isDebugEnabled()) {
logger.debug("Send Email Succ");
}
succSent++;
}
catch (EmailException e) {
logger.error("Send Email Error", e);
failSent++;
}
totalSent++;
}
try {
Thread.sleep(2 * 1000);
}
catch (InterruptedException e) {
logger.error("Sleep Error", e);
}
if (logger.isDebugEnabled()) {
logger.debug("TotalSent=" + totalSent + ";SuccSent=" + succSent + ";FailSent=" + failSent);
}
}
}
};
Thread thread = new Thread(run);
thread.setDaemon(true);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
private void sendHtmlEmail(Email email) throws EmailException {
HtmlEmail sender = new HtmlEmail();
sender.setHostName(email.getHost());
String[] to = email.getTo();
for (int i = 0; i < to.length; i++) {
sender.addTo(to[i]);
}
sender.setFrom(email.getFrom());
sender.setSubject(email.getSubject());
sender.setHtmlMsg(email.getHtmlContent());
sender.setTextMsg(email.getTextContent());
sender.send();
}
private void sendTextEmail(Email email) throws EmailException {
HtmlEmail sender = new HtmlEmail();
sender.setHostName(email.getHost());
String[] to = email.getTo();
for (int i = 0; i < to.length; i++) {
sender.addTo(to[i]);
}
sender.setFrom(email.getFrom());
sender.setSubject(email.getSubject());
sender.setTextMsg(email.getTextContent());
sender.send();
}
}
3.测试类
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class TestMailSender {
private static final int SEND_COUNT = 10;
@Test
public void testEmailSender() {
String html = "<html><body><p><font color='blue'>This is a test email.</font></p></body></html>";
String msg = "This is a test email.";
String subject = "Test Email";
String host = "yoursmtphost";
String from = "senderaddress@yourdomain";
String to = "toaddress@todomain";
final List<Email> emails = new ArrayList<Email>();
for (int i = 0; i < SEND_COUNT; i++) {
Email email = new Email();
email.setHost(host);
email.setFrom(from);
email.addTo(to);
email.setSubject(subject);
if (i % 2 == 0) {
email.setKind(Email.KIND.HTML);
email.setHtmlContent(html);
email.setTextContent(msg);
} else {
email.setKind(Email.KIND.TEXT);
email.setTextContent(msg);
}
emails.add(email);
}
final MailSender sender = MailSender.getInstance();
Thread thread1 = new Thread() {
public void run() {
for (int i = 0; i < SEND_COUNT / 2; i++) {
sender.sendEmail(emails.get(i));
}
}
};
Thread thread2 = new Thread() {
public void run() {
for (int i = SEND_COUNT / 2; i < SEND_COUNT; i++) {
sender.sendEmail(emails.get(i));
}
}
};
thread1.start();
thread2.start();
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int totalSent = sender.getTotalSent();
int succSent = sender.getSuccSent();
int failSent = sender.getFailSent();
assertEquals("TotalSent should be " + SEND_COUNT, SEND_COUNT, totalSent);
assertEquals("SuccSent should be 0", 0, succSent);
assertEquals("FailSent should be " + SEND_COUNT, SEND_COUNT, failSent);
}
}