Java实现定时发送邮件功能

定时发送邮件

发送邮件在很多场景下都可以被使用到,例如:项目报错,将异常信息及时发送给开发人员;将服务器运行状态及时发送给运维人员;注册成功发送邮件给用户等等。这些都是为了及时将信息反馈给相关人员,以便知道详情。
在这里是结合线程发送邮件,首先先创建发送邮件工具类:

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

现在定时发邮件功能已能实现,当然在此基础上还要写业务层什么,这里就不累赘了。这只是定时发送邮件的一种实现,还可以结合定时器实现。

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值