javaMail利用线程池发送邮件

1.引入JavaMail

<dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>${mail.version}</version>
</dependency>

 2.配置mailSender和线程池

<bean id="cusMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${mail.customer.smtp.host}"/>
        <property name="username" value="${mail.customer.senderAccount}"/>
        <property name="password" value="${mail.customer.senderPassword}"/>
        <property name="port"  value="${mail.customer.smtp.port}" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">${mail.customer.transport.protocol}</prop>
                <prop key="mail.smtp.auth">${mail.customer.mail.smtp.auth}</prop>
                <!--<prop key="mail.smtp.timeout">60000</prop>-->
                <!--<prop key="mail.smtp.connectiontimeout">120000</prop>-->
                <!--<prop key="mail.smtp.socketfactory.class">javax.net.ssl.sslsocketfactory</prop>-->
                <prop key="mail.smtp.starttls.enable">true</prop>
            </props>
        </property>
    </bean>

    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10" />
        <property name="maxPoolSize" value="100" />
        <property name="queueCapacity" value="500" />
        <property name="keepAliveSeconds" value="60" />
        <property name="waitForTasksToCompleteOnShutdown" value="true" />
        <property name="allowCoreThreadTimeOut" value="true" />
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>

3.建实体类

public class MailEntry {
    private String recipient;//可以是String[]数组,多个收件人
    private String subject;
    private String text;

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }


    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

4.发送邮件的业务层实现

public class MailSendUtil {
    public static Logger logger = LoggerFactory.getLogger(MailSendUtil.class);
    private static final String[] configLocations = {"config/applicationContext-mail.xml"};
    public static ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
    public TaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");
    public JavaMailSender javaMailSender = (JavaMailSender) ctx.getBean("cusMailSender");

    public void sendMailToCus(MailEntry mailEntry) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            //设置回执
            //message.addHeader("Disposition-Notification-To", "1");
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
            helper.setFrom(ActionMessage.getStaMessage("mail.customer.senderAddress"));
            helper.setSubject(mailEntry.getSubject());
            //设置为TRUE则可以使用Html标记
            helper.setText(mailEntry.getText(), true);
            helper.setTo(mailEntry.getRecipient());
            addSendMailTask(mailEntry.getRecipient(), message);
        } catch (MessagingException e) {
            logger.error("邮件转换异常,邮件详细信息为", e.getMessage());
        }


    }

    /**
     * @param email 邮箱地址
     * @param message MimeMessage邮件封装类
     * @desc 使用多线程发送邮件
     */
    private void addSendMailTask(final String email, final MimeMessage message) {
        try {
            taskExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    javaMailSender.send(message);
                    long threadId = Thread.currentThread().getId();
                    logger.info("线程ID:"+threadId+"发送邮件:" + email);
                }
            });
        } catch (Exception e) {
            logger.error(email + "邮件发送异常,邮件详细信息为", e.getMessage());
        }
    }
}

 线程池中线程数量达到最大允许的线程数量,然后所有线程都同时进入空闲状态且空闲时间超过keepAliveTime,停止多余的线程并保留核心数量的线程

posted @ 2020-05-11 20:51  樱花树下的蓝天  阅读(776)  评论(0)    收藏  举报