SpringBoot 邮件工具包

工作上突然来了个需求,需要用到邮箱的相关操作,就自己写了个邮箱的工具包,防止以后要用到,就记录下来。

具体的需求是:如果风险分析出出现风险,然后分析系统通知相关人员,执行相关措施,杜绝风险。

我想了两种方式:一种是通过短信提醒,另一种是通过邮件提醒。

这个随笔就记录一下邮件方式提醒的过程。

一开始,要配置一个发邮件的账号。先登录你要用来发邮件的账号(这里就用qq邮箱,其实其他邮箱也是一样的),打开设置--账户--POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。然后进行下图操作:

获取到这个授权码。然后在项目里写入邮件的相关配置(springboot 可以写在application.yml文件中,或者其他的配置文件里)

# 邮件模块
mail:
# 发件人邮箱
from: xxxxxxxx@xx.com
# 发件人用户名 你的邮箱号 和上面一样
username: xxxxxxxx@xx.com
# 发件人密码
password: 授权码
# 邮箱服务器
host: smtp.qq.com
# 发件人昵称
nickName: 梁三
#邮件主题
mailSubject: 聚会邀请

写入这些配置后就可以进行邮箱工具的编码了

import com.sun.mail.util.MailSSLSocketFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.Properties;

/**
 *  @author liangsan
 */
@Component
public class MailUtil{
  // 获取配置值
    @Value("${mail.from}")
    private String from;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.password}")
    private String password;
    @Value("${mail.host}")
    private String host;
    @Value("${mail.nickName}")
    private String nickName;
    @Value("${mail.mailSubject}")
    private String mailSubject;

    /**
     *  获取邮件配置Properties
     *  @return 邮件配置
     */
    private Session getMailConfig() throws GeneralSecurityException {
        Properties prop = new Properties();
        prop.setProperty("mail.host", host);
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        // 1、创建定义整个应用程序所需的环境信息的 Session 对象
        return Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                // 发件人邮件用户名、授权码
                return new PasswordAuthentication(username, password);
            }
        });
    }

    private MimeMessage getMailObject(Session session) throws MessagingException, UnsupportedEncodingException {
        MimeMessage message = new MimeMessage(session);
        // 防止成为垃圾邮件
        message.addHeader("X-Mailer","Microsoft Outlook Express 6.00.2900.2869");
        // 发件人
        message.setFrom(new InternetAddress(from,nickName, "UTF-8"));
        // 邮件的标题
        message.setSubject(mailSubject);
        return message;
    }

    /**
     *  发送邮件
     *  @param toEmail 收件人邮箱
     *  @param content 内容
     */
    public void sendMail(String toEmail, String content) {
        try{

            Session session = getMailConfig();
            // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            //session.setDebug(true);

            // 2、通过session得到transport对象
            Transport ts = session.getTransport();

            // 3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host, username, password);

            // 4、创建邮件
            MimeMessage message = getMailObject(session);
            // 收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
            // 邮件设置内容
            message.setContent("<h2>" + content + "</h2>", "text/html;charset=UTF-8");
            // 邮件保存改变格式
            message.saveChanges();

            // 发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     *  群发邮件
     *  @param toEmails 收件人邮箱
     *  @param content 内容
     */
    public void sendMailByGroup(List<String> toEmails, String content) {
        try{

            Session session = getMailConfig();
            // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            //session.setDebug(true);

            // 2、通过session得到transport对象
            Transport ts = session.getTransport();

            // 3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host, username, password);

            // 4、创建邮件
            MimeMessage message = getMailObject(session);
            InternetAddress[] address =new InternetAddress[toEmails.size()];
            for (int i = 0; i < toEmails.size(); i++) {
                address[i]=new InternetAddress(toEmails.get(i));
            }
            message.addRecipients(Message.RecipientType.TO, address);
            // 邮件设置内容
            message.setContent("<h2>" + content + "</h2>", "text/html;charset=UTF-8");
            // 邮件保存改变格式
            message.saveChanges();

            // 发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();

        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

上述工具包括单发和群发两种方式。具体代码我就不说了,注释说的很清楚。

我们写个controller测试一下,看是否能发送邮件

@Controller
@RequestMapping("/common")
public class ShhCommonController extends PageBaseController {
    private MailUtil mailUtil;
    
    @Autowired
    public void setMailUtil(MailUtil mailUtil) {
        this.mailUtil = mailUtil;
    }

    @GetMapping("/sendMail")
    @ResponseBody
    public AjaxResult sendMail(@RequestParam(value = "content") String content,@RequestParam(value = "toEmail") String toEmail){
        mailUtil.sendMail(toEmail,content);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("result","发送成功");
        return ajax;
    }

    @GetMapping("/sendMailByGroup")
    @ResponseBody
    public AjaxResult sendMailByGroup(@RequestParam(value = "content") String content){
        List<String> toEmails = new ArrayList<>();
        toEmails.add("测试邮箱");
        toEmails.add("测试邮箱");
        toEmails.add("测试邮箱");
        toEmails.add("测试邮箱");
        toEmails.add("测试邮箱");
        mailUtil.sendMailByGroup(toEmails,content);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("result","发送成功");
        return ajax;
    }

 

posted @ 2020-04-03 13:55  梁三  阅读(409)  评论(0)    收藏  举报