java异步发送邮件(非springboot封装的包,属性配置由yml注入)

1、导包

        <!-- 邮件发送依赖包 -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

 

2、编写工具类,@EnableAsync开启异步调用;@Async标注将被异步调用的方法。(其实工具类一般都是静态的属性和方法,本人这里只是提供一个参考,实际请重新编写)

import com.sxcloud.common.exception.RRException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;


/**
 * @descride: 发送邮件工具类
 * @author: liarj
 * @date: 2020/8/20 16:52
 */
@Slf4j
@Data
@Component
@EnableAsync
public class SendEmailUtil {
    /**
     * 授权码
     */
    @Value("${myemail.authz-code}")
    private String authzCode;
    /**
     * 发件人电子邮箱
     */
    @Value("${myemail.from}")
    private String from;
    /**
     * 指定发送邮件的主机为 smtp.qq.com (QQ 邮件服务器)
     */
    @Value("${myemail.host}")
    private String host;
    /**
     * 是否验证
     */
    @Value("${myemail.smtp.auth}")
    private boolean auth;
    /**
     * 通信加密
     */
    @Value("${myemail.smtp.starttls-enable}")
    private boolean starttlsEnable;
    /**
     * 是否必须通信加密
     */
    @Value("${myemail.smtp.starttls-required}")
    private boolean starttlsRequired;
    /**
     * 指定SSL类
     */
    @Value("${myemail.smtp.scoketFactoty}")
    private String scoketFactoty;

    /**
     * 异步-发送邮件
     * @param to 收件人邮箱
     * @param subject 头部字段
     * @param text 消息体
     */
    @Async
    public void send(String to, String subject, String text){
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);
        // 是否验证
        properties.put("mail.smtp.auth", auth);
        // 加密通讯
        properties.put("mail.smtp.starttls.enable", starttlsEnable);
        // 是否必须使用加密通讯
        properties.put("mail.smtp.starttls.required", starttlsRequired);
        // 指定ssl类
        properties.put("mail.smtp.scoketFactoty", scoketFactoty);
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties,new Authenticator(){
            @Override
            public PasswordAuthentication getPasswordAuthentication()
            {
                // 发件人邮件用户名、授权码
                return new PasswordAuthentication(from, authzCode);
            }
        });

        try{
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);
            message.setText(text);

            Transport.send(message);

        }catch (MessagingException mex) {
            log.info("邮件发送失败:" + mex.getMessage());
            throw new RRException("邮件发送失败");
        }
    }

}

3、yml配置文件值注入属性。(这边用的是qq邮箱的服务器,授权码、发件人需要自己再配置,其他保持一样即可)

#邮件发送自定义配置
myemail:
  #授权码
  authz-code: qweqweqwe
  #发件人
  from: xxx@qq.com
  #发送邮件的服务器
  host: smtp.qq.com
  smtp:
    #是否验证
    auth: true
    #加密通讯
    starttls-enable: true
    #是否必须加密通讯
    starttls-required: true
    #指定SSL类
    scoketFactoty: javax.net.ssl.SSLSocketFactory

实测5秒左右。 

注:当然也可以使用springboot已经封装好的starter包 实现邮件发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值