简介
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
正文
增加依赖
本文用的spring-boot-starter-mail,不用显示指定版本号
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置信息
# 邮件
spring:
mail:
host: smtp.163.com
username: ******@163.com
# 客户端授权码不是邮箱密码
password: ******
senderName: gourd
port: 25
protocol: smtp
default-encoding: UTF-8
properties:
mail.smtp.auth: true
mail.smtp.ssl.enable: true
mail.smtp.starttls.enable: true
mail.smtp.starttls.required: true
mail.smtp.socketFactory.port: 465
mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback: false
避坑:
没有加配置:spring.mail.properties.mail.smtp.ssl.enable:true 会报以下错误:
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 465, response: 554
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2197)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)
at javax.mail.Service.connect(Service.java:342)
此处password为客户端授权码不是邮箱密码。
163邮箱获取授权码:如果之前设置过忘了,可以重置下。
/**
* 邮件发送
* @author gourd
*/
@Service
@Slf4j
public class GourdMailServiceImpl implements GourdMailService {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Value("${spring.mail.senderName}")
private String fromName;
/**
* 发送包含简单文本的邮件
*
* @param toMails 接收者
* @param subject 主题
* @param text 内容
*/
@Override
public void sendTxtMail(String[] toMails, String subject, String text) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 设置收件人,寄件人
simpleMailMessage.setTo(toMails);
simpleMailMessage.setFrom(from);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(text);
// 发送邮件
javaMailSender.send(simpleMailMessage);
log.info("^o^= 邮件已发送");
}
/**
* 发送包含HTML文本的邮件
*
* @param toMails 接收者
* @param subject 主题
* @param htmlText html格式内容
*/
@Override
public void sendHtmlMail(String[] toMails, String subject, String htmlText) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
try {
setMailInfo(toMails, subject, htmlText, mimeMessageHelper);
// 发送邮件
javaMailSender.send(mimeMessage);
log.info("^o^= 邮件已发送");
} catch (Exception e) {
log.info("^o^= 邮件发送失败{}:",e);
}
}
/**
* 发送包含内嵌图片的邮件
*/
@Override
public void sendImageMail(String[] toMails, String subject, String htmlImageText) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
// multipart模式
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
setMailInfo(toMails, subject, htmlImageText, mimeMessageHelper);
// 设置imageId
FileSystemResource img = new FileSystemResource(new File("D:/MailImage/welcome.jpg"));
mimeMessageHelper.addInline("imageId", img);
// 发送邮件
javaMailSender.send(mimeMessage);
log.info("^o^= 邮件已发送");
} catch (Exception e) {
log.info("^o^= 邮件发送失败{}:",e);
}
}
/**
* 发送包含附件的邮件
*/
@Override
public void sendAttachmentMail(String[] toMails, String subject, String htmlAttachText) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
// multipart模式
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
setMailInfo(toMails, subject, htmlAttachText, mimeMessageHelper);
// 设置附件
FileSystemResource img = new FileSystemResource(new File("D:/MailImage/welcome.jpg"));
FileSystemResource xlsx = new FileSystemResource(new File("D:/MailImage/软件项目需求.xlsx"));
mimeMessageHelper.addAttachment("welcome.jpg", img);
mimeMessageHelper.addAttachment("软件项目需求.xlsx", xlsx);
// 发送邮件
javaMailSender.send(mimeMessage);
log.info("^o^= 邮件已发送");
} catch (Exception e) {
log.info("^o^= 邮件发送失败{}:",e);
}
}
/**
* 发送模板邮件
*/
@Override
public void sendTemplateMail(String[] toMails, String subject) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
// multipart模式
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
// 声明一个上下文对象,里面放入要存到模板里面的数据
Context context = new Context();
Map<String, Object> params = new HashMap(4){{
put("name","小葫芦");
put("account","gourdHu");
put("password","123456");
}};
context.setVariables(params);
// 指定相应的模板,然后给context数据传过去
String process = templateEngine.process("mail", context);
setMailInfo(toMails, subject, process, mimeMessageHelper);
} catch (Exception e) {
e.printStackTrace();
}
// 发送邮件
javaMailSender.send(mimeMessage);
log.info("^o^= 邮件已发送");
}
/**
* 设置邮件信息
* @param toMails
* @param subject
* @param text
* @param mimeMessageHelper
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
private void setMailInfo(String[] toMails, String subject, String text, MimeMessageHelper mimeMessageHelper) throws MessagingException, UnsupportedEncodingException {
mimeMessageHelper.setTo(toMails);
mimeMessageHelper.setFrom(from, fromName);
mimeMessageHelper.setSubject(subject);
if(StringUtils.isNotBlank(text)){
// 启用html
mimeMessageHelper.setText(text, true);
}
}
}
测试controller
/**
* 供前期测试使用
* @author gourd
*/
@RestController
@RequestMapping("/mail")
@Api(tags = "mail", description = "邮件控制器")
@Slf4j
public class MailController {
@Autowired
private MailService mailService;
@PostMapping("/text-send")
@ApiOperation(value = "发送文本邮件")
public void sendTextMail() {
String[] toMails = new String[]{"869570209@qq.com"} ;
String subject = "gourd邮件";
String text = "gourd你好";
mailService.sendTxtMail(toMails,subject,text);
}
@PostMapping("/html-send")
@ApiOperation(value = "发送html格式邮件")
public void sendHtmlMail() {
String[] toMails = new String[]{"869570209@qq.com"} ;
String subject = "gourd邮件";
StringBuilder sb = new StringBuilder();
sb.append("<html><head>gourd邮件</head>");
sb.append("<body><h1>gourd邮件测试</h1><p>hello!this is spring mail test。</p></body>");
sb.append("</html>");
mailService.sendHtmlMail(toMails,subject,sb.toString());
}
@PostMapping("/image-send")
@ApiOperation(value = "发送图片邮件")
public void sendImageMail() {
String[] toMails = new String[]{"869570209@qq.com"} ;
String subject = "gourd邮件";
StringBuilder sb = new StringBuilder();
sb.append("<html><head>gourd邮件</head>");
sb.append("<body><h1>gourd邮件</h1><p>hello!this is spring mail test。</p>");
// cid为固定写法,imageId指定一个标识
sb.append("<img src=\"cid:imageId\"/></body>");
sb.append("</html>");
mailService.sendImageMail(toMails,subject,sb.toString());
}
@PostMapping("/attach-send")
@ApiOperation(value = "发送附件邮件")
public void sendAttachmentMail() {
String[] toMails = new String[]{"869570209@qq.com"} ;
String subject = "gourd邮件";
StringBuilder sb = new StringBuilder();
sb.append("<html><head>gourd邮件</head>");
sb.append("<body><h1>gourd邮件测试</h1><p>hello!this is spring mail test。</p></body>");
sb.append("</html>");
mailService.sendAttachmentMail(toMails,subject,sb.toString());
}
}
===============================================
代码均已上传至本人的开源项目
spring-cloud-plus:https://blog.csdn.net/HXNLYW/article/details/104635673