天天看點

利用commons-email發送郵件的簡單例子

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);

}

}