定时发送邮件
发送邮件在很多场景下都可以被使用到,例如:项目报错,将异常信息及时发送给开发人员;将服务器运行状态及时发送给运维人员;注册成功发送邮件给用户等等。这些都是为了及时将信息反馈给相关人员,以便知道详情。
在这里是结合线程发送邮件,首先先创建发送邮件工具类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
import MailConfig;
/**
*
* <b>Description:</b>发送邮件工具类<br>
*/
public class MailUtil {
private static Logger log = LoggerFactory.getLogger(MailUtil.class);
private static String userName = MailConfig.getUserName();
private static String passWord = MailConfig.getPassWord();
private static String smtpHost = MailConfig.getSmtpHost();
private static String fromEmail = MailConfig.getFromEmail();
private static String charset = MailConfig.getCharset();
private static String senderName = MailConfig.getSenderName();
private static String encryptionType = MailConfig.getEncryptionType();
private static int mailPort = Integer.valueOf(MailConfig.getMailPort());
/**
* <b>Description:</b>发送Html邮件<br>
*
* @param to 收件人
* @param cc 抄送
* @param list
* @param subject 主题
* @param htmlContent 内容
*/
public static void sendHtmlMailWithoutSSL(Map<String, String> to, Map<String, String> cc, String subject, String htmlContent) {
HtmlEmail email = new HtmlEmail();
email.setCharset(MailUtil.charset);
email.setHostName(smtpHost);
email.setAuthentication(userName, passWord);
email.setSubject(subject);
email.setSSL(true);
email.setSmtpPort(mailPort);
try {
email.setFrom(fromEmail);
if (to != null) {
for (Map.Entry<String, String> map : to.entrySet()) {
email.addTo(map.getValue(), map.getKey());
}
}
if (cc != null) {
for (Map.Entry<String, String> map : cc.entrySet()) {
email.addCc(map.getValue(), map.getKey());
}
}
if (list != null) {
for (EmailAttachment attachment : list) {
email.attach(attachment);
}
}
email.setMsg(htmlContent);
email.send();
} catch (EmailException e) {
log.error("$$$ Error sending mail, catch a EmailException !userName:" + userName);
e.printStackTrace();
}
log.debug("$$$ Send email successful!");
}
}
工具类中到的一些配置是放在xml中,一下邮件配置类:
/**
*
* <b>Description:</b>邮箱配置类<br>
*/
public class MailConfig {
/**
* 邮箱登录名
*/
private static String userName;
/**
* 邮箱登录密码
*/
private static String passWord;
/**
* smtp
*/
private static String smtpHost;
/**
* 发送邮箱
*/
private static String fromEmail;
/**
* 字符设置
*/
private static String charset;
/**
* 发送者名称
*/
private static String senderName;
/**
* 加密类型
*/
private static String encryptionType;
/**
* 邮箱服务器端口
*/
private static String mailPort;
public static String getUserName() {
return userName;
}
public static void setUserName(String userName) {
MailConfig.userName = userName;
}
public static String getPassWord() {
return passWord;
}
public static void setPassWord(String passWord) {
MailConfig.passWord = passWord;
}
public static String getSmtpHost() {
return smtpHost;
}
public static void setSmtpHost(String smtpHost) {
MailConfig.smtpHost = smtpHost;
}
public static String getFromEmail() {
return fromEmail;
}
public static void setFromEmail(String fromEmail) {
MailConfig.fromEmail = fromEmail;
}
public static String getCharset() {
return charset;
}
public static void setCharset(String charset) {
MailConfig.charset = charset;
}
public static String getSenderName() {
return senderName;
}
public static void setSenderName(String senderName) {
MailConfig.senderName = senderName;
}
public static String getEncryptionType() {
return encryptionType;
}
public static void setEncryptionType(String encryptionType) {
MailConfig.encryptionType = encryptionType;
}
public static String getMailPort() {
return mailPort;
}
public static void setMailPort(String mailPort) {
MailConfig.mailPort = mailPort;
}
}
applicationContext.xml配置:
<!-- Mail模块配置 -->
<bean class="MailConfig类">
<property name="userName" value="${USER_NAME}" />
<property name="passWord" value="${PASSWORD}" />
<property name="smtpHost" value="${SMTP_HOST}" />
<property name="fromEmail" value="${FROM_EMAIL}" />
<property name="charset" value="${CHARSET}" />
<property name="senderName" value="${SENDER_NAME}" />
<property name="encryptionType" value="${ENCRYPTIONT_YPE}" />
<property name="mailPort" value="${MAIL_PORT}" />
</bean>
现在邮件发送已经可以,如何定时发送呢?可以加个发送邮件线程,每隔一段时间检查是否有邮件需要发送,有的话,调用发送邮件工具类,没有就sleep。
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.web.context.ContextLoader;
/**
*
* <b>Description:</b>邮件发送线程<br>
*/
public class MailSenderThead extends Thread {
/**
* 待发送邮件列表
*/
private static List<Mail> mailList = new LinkedList<Mail>();
/**
*
* <b>Description:</b>添加需要发送的邮件<br>
*
* @param mail void
*/
public static void addMail(Mail mail) {
mailList.add(mail);
}
@Override
public void run() {
while (true) {
if (mailList.size() == 0) {
try {
Thread.sleep(1000L); //待发送邮件列表为空,sleep1秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
Mail mail = mailList.get(0);
try {
mailList.remove(0);
// 这里可以保存email日志
//发送邮件
MailUtil.sendHtmlMailWithoutSSL(mail.getTo(), null, null, mail.getSubject(), mail.getContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
现在定时发邮件功能已能实现,当然在此基础上还要写业务层什么,这里就不累赘了。这只是定时发送邮件的一种实现,还可以结合定时器实现。