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

浙公网安备 33010602011771号