Spring?Boot集成JavaMailSender發(fā)送郵件功能的實(shí)現(xiàn)
前言
項(xiàng)目中郵件發(fā)送為常用功能之一,例如注冊成功后需要發(fā)送激活郵件,賬號的會員到期提示,每日報(bào)表統(tǒng)計(jì)等功能都需要自動發(fā)送郵件,本文將講解Spring Boot如何實(shí)現(xiàn)郵件發(fā)送功能。
集成步驟
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>郵件配置信息
在resource目錄下新增mail.properties內(nèi)容如下:
#企業(yè)郵件配置 mail.host=smtp.exmail.qq.com #端口 mail.port=587 mail.userName=xxx.com mail.password=yyy mail.smtp.timeou=15000 mail.smtp.auth=false mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
加載屬性文件
@Component
@ConfigurationProperties(prefix = "mail")
@PropertySource(value = { "classpath:mail.properties" })
public class MailSenderConfig implements Serializable
{
private static final long serialVersionUID = -4558468113448742143L;
/**
* 主機(jī)
*/
private String host;
/**
* 端口
*/
private int port;
/**
* 用戶名
*/
private String userName;
/***
* 密碼
*/
private String password;
//省略get、set方法
}通過@PropertySource注解加載外部屬性文件,不熟悉的朋友可以查看這篇文章。
郵件配置類
@Configuration
public class MailConfig
{
@Autowired
private MailSenderConfig mailSenderConfig;
@Bean
public JavaMailSenderImpl createMailSender()
{
JavaMailSenderImpl javaMailSender =new JavaMailSenderImpl();
javaMailSender.setDefaultEncoding("UTF-8");
javaMailSender.setHost(mailSenderConfig.getHost());
javaMailSender.setPort(mailSenderConfig.getPort());
javaMailSender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL);
javaMailSender.setUsername(mailSenderConfig.getUserName());
javaMailSender.setPassword(mailSenderConfig.getPassword());
Properties p = new Properties();
p.setProperty("mail.smtp.timeout", "25000");
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailSender.setJavaMailProperties(p);
return javaMailSender;
}
}注意:JavaMailSenderImpl是JavaMailSender的實(shí)現(xiàn)。
代碼實(shí)現(xiàn)
發(fā)送簡單郵件
郵件實(shí)體類
public class Mail implements Serializable
{
private static final long serialVersionUID = -1001194001681838276L;
/**
* 發(fā)送者
*/
private String from;
/**
* 接收者
*/
private String to;
private String cc;
private String bcc;
/**
* 主題
*/
private String subject;
/**
* 內(nèi)容
*/
private String body;
private String fileName;
/**
* 文件路徑
*/
private String filePath;
//
} 業(yè)務(wù)實(shí)現(xiàn)類
public interface MailService
{
/**
* 發(fā)送簡單郵件
* @param mail
*/
void sendSimpleMail(Mail mail);
}
// 實(shí)現(xiàn)類
@Component
public class MailServiceImpl implements MailService
{
private Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
@Autowired
private JavaMailSenderImpl mailSender;
@Autowired
private SpringTemplateEngine templateEngine;
public void sendSimpleMail(Mail mail)
{
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mail.getFrom());
message.setTo(mail.getTo());
message.setSubject(mail.getSubject());
message.setText(mail.getBody());
mailSender.send(message);
logger.info("發(fā)送完畢");
}
}測試類
@RestController
@RequestMapping("mail")
public class MailController
{
@Autowired
private MailService mailService;
@Async
@GetMapping("sendSimplEmail")
public String sendSimplEmail()
{
Mail mail = new Mail();
mail.setFrom("xx@qq.com);
mail.setTo("yyy@qq.com");
mail.setSubject("測試郵件");
mail.setBody("這是一封測試郵件");
mailService.sendSimpleMail(mail);
return "發(fā)送成功";
}注意:郵件功能需要異步發(fā)送,所以采用的@Async注解來實(shí)現(xiàn)。
至此簡單的郵件發(fā)送功能已經(jīng)完成。
擴(kuò)展功能
發(fā)送Html內(nèi)容的郵件
發(fā)送簡單的郵件,有時(shí)候無法滿足業(yè)務(wù)的需求,我們需要至此發(fā)送帶HTMl內(nèi)容格式的郵件。
業(yè)務(wù)實(shí)現(xiàn)類
public void sendHtmlMail(Mail mail)
{
MimeMessage message =mailSender.createMimeMessage();
MimeMessageHelper messageHelper=null;
try
{
// 設(shè)置編碼utf-8
messageHelper = new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setFrom(mail.getFrom());
messageHelper.setTo(mail.getTo());
messageHelper.setSubject(mail.getSubject());
//轉(zhuǎn)換html
messageHelper.setText(mail.getBody(),true);
mailSender.send(message);
}
catch (MessagingException e)
{
logger.error("發(fā)送郵件失敗");
throw new RuntimeException("發(fā)送郵件失敗",e);
}
logger.info("發(fā)送完畢");
}注意事項(xiàng): 1.采用html格式的郵件需要注意內(nèi)容的格式,采用UTF-8格式否則中文會出現(xiàn)亂碼。 2.設(shè)置郵件內(nèi)容時(shí),需要將設(shè)置為true,否則html內(nèi)容會原本輸出。
測試類
@Async
@GetMapping("sendHtmlEmail")
public String sendHtmlEmail()
{
Mail mail = new Mail();
mail.setFrom("xx@qq.com);
mail.setTo("yyy@qq.com");
mail.setSubject("測試html格式郵件");
String content = "<html>\n" +
"<body>\n" +
"<h3>hello! 這是測試html內(nèi)容郵件!</h3>\n" +
"</body>\n" +
"</html>";
mail.setBody(content);
mailService.sendHtmlMail(mail);
return "發(fā)送成功";
}發(fā)送帶附件郵件
業(yè)務(wù)實(shí)現(xiàn)類
public void sendAttachmentsMail(Mail mail)
{
MimeMessage message =mailSender.createMimeMessage();
MimeMessageHelper messageHelper=null;
try
{
// 設(shè)置編碼utf-8
messageHelper = new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setFrom(mail.getFrom());
messageHelper.setTo(mail.getTo());
messageHelper.setSubject(mail.getSubject());
//轉(zhuǎn)換html
messageHelper.setText(mail.getBody(),true);
// 附件
FileSystemResource resourse = new FileSystemResource(new File(mail.getFilePath()));
// 附件名稱和路徑
messageHelper.addAttachment(mail.getFileName(), resourse);
mailSender.send(message);
}
catch (MessagingException e)
{
logger.error("發(fā)送郵件失敗");
throw new RuntimeException("發(fā)送郵件失敗",e);
}
logger.info("發(fā)送完畢");
}測試類
@Async
@GetMapping("sendAttachmentsMail")
public String sendAttachmentsMail()
{
Mail mail = new Mail();
mail.setFrom("xx@qq.com);
mail.setTo("yyy@qq.com");
mail.setSubject("測試附件郵件");
mail.setBody("測試附件郵件,有附件請下載");
mail.setFilePath("E:\\cfg\\test.png");
mail.setFileName("test.png");
mailService.sendAttachmentsMail(mail);
return "發(fā)送成功";
}注意:設(shè)置附件的路徑和附件的名稱。
發(fā)送模板郵件
有些特殊需要,我們需要采用固定的郵件模板發(fā)送郵件。
郵件的模板可以采用thymeleaf和freemark來實(shí)現(xiàn),本文將采用thymeleaf來實(shí)現(xiàn)郵件模板發(fā)送。
添加依賴
<!-- thymeleaf 模板 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.2.14</version> </dependency>
模板內(nèi)容
模板路徑:src/main/resources/templates/emailTemplate.html
模板內(nèi)容:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>mail</title>
</head>
<body>
<table align="center" cellpadding="0" cellspacing="0" width="600px" style="margin-bottom:20px">
<tr>
<td>
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600"
style="border-collapse: collapse;">
<tr>
<td bgcolor="#ffffff">
<h3>郵件模板</h3>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td colspan="2" style="padding: 0 0 3px 0">
公司名稱:<span th:text="${emailParam.companyName}"></span>
</td>
</tr>
<tr>
<td style="padding: 12px 0 3px 0">
地址:<span th:text="${emailParam.address}"></span>
</td>
</tr>
<tr>
<td style="padding: 12px 0 3px">
聯(lián)系人:<span th:text="${emailParam.phone}"></span>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>業(yè)務(wù)實(shí)現(xiàn)類
public void sendTemplateMail(Mail mail)
{
Context context = new Context();
Map<String, Object> emailParam = new HashMap<>();
emailParam.put("companyName", "公司名稱");
emailParam.put("address", "公司地址");
emailParam.put("phone", "聯(lián)系電話");
context.setVariable("emailParam", emailParam);
//模板合成html內(nèi)容
String emailTemplate = templateEngine.process("emailTemplate", context);
mail.setBody(emailTemplate);
sendHtmlMail(mail);
}測試示例
@Async
@GetMapping("sendTemplateEmail")
public String sendTemplateEmail()
{
Mail mail = new Mail();
mail.setFrom("xx@qq.com);
mail.setTo("yyy@qq.com");
mail.setSubject("測試模板郵件");
mailService.sendTemplateMail(mail);
return "發(fā)送成功";
}總結(jié)
本文講解的是Spring Boot集成JavaMailSender發(fā)送郵件,郵件內(nèi)容格式有種,需要結(jié)合業(yè)務(wù)的來選擇對應(yīng)的實(shí)現(xiàn)方式。
到此這篇關(guān)于Spring Boot集成JavaMailSender發(fā)送郵件功能的文章就介紹到這了,更多相關(guān)SpringBoot JavaMailSender發(fā)郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章教你使用枚舉來實(shí)現(xiàn)java單例模式
本篇文章主要介紹了Java實(shí)現(xiàn)單例的3種普遍的模式,餓漢式、懶漢式、枚舉式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-07-07
創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過程解析
這篇文章主要介紹了創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java中字符串與日期轉(zhuǎn)換常見方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中字符串與日期轉(zhuǎn)換常見方法的相關(guān)資料,在Java編程中經(jīng)常需要將字符串表示的日期轉(zhuǎn)換為日期對象進(jìn)行處理,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類)
這篇文章主要介紹了使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot導(dǎo)出PDF的四種實(shí)現(xiàn)方法詳解
在Spring?Boot應(yīng)用程序中實(shí)現(xiàn)PDF導(dǎo)出功能,可以選擇多種庫和技術(shù)棧,本文為大家整理了四種常見的方法,感興趣的小伙伴可以參考一下2025-02-02
Java實(shí)例講解枚舉enum的實(shí)現(xiàn)
枚舉法的本質(zhì)就是從所有候選答案中去搜索正確的解,枚舉算法簡單粗暴,他暴力的枚舉所有可能,盡可能地嘗試所有的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

