高端网站开发建设,服务商平台,方维服务公司服务范围,论坛网站推广使用SpringBoot发送邮件
邮件发送其实是一个非常常见的需求#xff0c;用户注册#xff0c;找回密码等地方#xff0c;都会用到#xff0c;Spring Boot 中对于邮件发送#xff0c;提供了相关的自动化配置类#xff0c;使得邮件发送变得非常容易。
1、前置工作
目前国内…使用SpringBoot发送邮件
邮件发送其实是一个非常常见的需求用户注册找回密码等地方都会用到Spring Boot 中对于邮件发送提供了相关的自动化配置类使得邮件发送变得非常容易。
1、前置工作
目前国内大部分的邮件服务商都不允许直接使用用户名/密码的方式来在代码中发送邮件都是要先申请授权码这里以 QQ 邮箱为例向大家演示授权码的申请流程
首先我们需要先登录 QQ 邮箱网页版点击上方的设置按钮然后点击账户选项卡在账户选项卡中找到开启POP3/SMTP选项如下 点击开启开启相关功能开启过程需要手机号码验证按照步骤操作即可不赘述。开启成功之后即可获取一个授权码将该号码保存好一会使用。
2、引入依赖、配置邮箱基本信息
!--集成发送邮件的功能--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-mail/artifactId
/dependency然后在yml配置文件中进行配置
spring:mail:host: smtp.qq.com # 设置邮箱主机port: 587 # SMTP 服务器的端口username: yydsqq.com # 设置用户名password: yyds # 设置密码该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码mail:from: ${spring.mail.username}to: yyds163.com做完这些之后Spring Boot 就会自动帮我们配置好邮件发送类相关的配置在
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration 类中部分源码如下
Configuration
ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
ConditionalOnMissingBean(MailSender.class)
Conditional(MailSenderCondition.class)
EnableConfigurationProperties(MailProperties.class)
Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {}可以看到导入了另外一个配置 MailSenderPropertiesConfiguration 类这个类中提供了邮件发送相关的工具类源码如下
Configuration
ConditionalOnProperty(prefix spring.mail, name host)
class MailSenderPropertiesConfiguration {private final MailProperties properties;MailSenderPropertiesConfiguration(MailProperties properties) {this.properties properties;}BeanConditionalOnMissingBeanpublic JavaMailSenderImpl mailSender() {JavaMailSenderImpl sender new JavaMailSenderImpl();applyProperties(sender);return sender;}
}
可以看到这里创建了一个 JavaMailSenderImpl 的实例 JavaMailSenderImpl 是 JavaMailSender 的一个实现我们将使用 JavaMailSenderImpl 来完成邮件的发送工作。
3、Service层代码
自定义的MailProperties配置类用于解析mail开头的配置属性
package com.yyds.domain;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;Data
Component
ConfigurationProperties(prefix mail)
public class MailProperties {private String from;private String to;}service层
package com.yyds.service;import freemarker.template.TemplateException;import javax.mail.MessagingException;
import java.io.IOException;
import java.util.Map;public interface MailService {void sendSimpleMail(String subject, String text) ;void sendHtmlMail(String subject, String text, MapString, String attachmentMap) throws MessagingException;void sendTemplateMail(String subject, MapString, Object params) throws MessagingException, IOException, TemplateException;
}
package com.yyds.service.impl;import com.yyds.domain.MailProperties;
import com.yyds.service.MailService;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
import java.util.Map;Service
public class MailServiceImpl implements MailService {Autowiredprivate JavaMailSender javaMailSender;Autowiredprivate MailProperties myMailProperties;/*** 发送简单文本邮件*/Overridepublic void sendSimpleMail(String subject, String text) {SimpleMailMessage mailMessage new SimpleMailMessage();mailMessage.setFrom(myMailProperties.getFrom());mailMessage.setTo(myMailProperties.getTo());mailMessage.setSubject(subject);mailMessage.setText(text);javaMailSender.send(mailMessage);}/*** 发送带有链接和附件的复杂邮件*/Overridepublic void sendHtmlMail(String subject, String text, MapString, String attachmentMap) throws MessagingException {MimeMessage mimeMessage javaMailSender.createMimeMessage();//是否发送的邮件是富文本附件图片html等MimeMessageHelper messageHelper new MimeMessageHelper(mimeMessage, true);messageHelper.setFrom(myMailProperties.getFrom());messageHelper.setTo(myMailProperties.getTo());messageHelper.setSubject(subject);messageHelper.setText(text, true);//重点默认为false显示原始html代码无效果if(attachmentMap ! null){attachmentMap.entrySet().stream().forEach(entrySet - {try {File file new File(entrySet.getValue());if(file.exists()){messageHelper.addAttachment(entrySet.getKey(), new FileSystemResource(file));}} catch (MessagingException e) {e.printStackTrace();}});}javaMailSender.send(mimeMessage);}/*** 发送模版邮件*/Overridepublic void sendTemplateMail(String subject, MapString, Object params) throws MessagingException, IOException, TemplateException {MimeMessage mimeMessage javaMailSender.createMimeMessage();MimeMessageHelper helper new MimeMessageHelper(mimeMessage, true);helper.setFrom(myMailProperties.getFrom());helper.setTo(myMailProperties.getTo());freemarker.template.Configuration configuration new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_19);TemplateLoader templateLoader new ClassTemplateLoader(this.getClass(), /templates/);configuration.setTemplateLoader(templateLoader);Template template configuration.getTemplate(mail.ftl);String html FreeMarkerTemplateUtils.processTemplateIntoString(template, params);helper.setSubject(subject);helper.setText(html, true);//重点默认为false显示原始html代码无效果javaMailSender.send(mimeMessage);}
}
4、发送邮件
4.1 测试发送简单文本邮件
SpringBootTest(classes BootStartApplication.class)
public class MimeMailTest {Autowiredprivate MailService mailService;Testpublic void sendMail() {mailService.sendSimpleMail(测试Springboot发送邮件, 发送邮件...);}
}4.2 测试发送带有链接和附件的复杂邮件
package com.yyds;import com.yyds.service.MailService;
import freemarker.template.TemplateException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.mail.MessagingException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;SpringBootTest(classes BootStartApplication.class)
public class MimeMailTest {Autowiredprivate MailService mailService;Testpublic void testMail() throws MessagingException {MapString, String attachmentMap new HashMap();attachmentMap.put(附件, D:\\D_ENL_MRO数据统计.xlsx);mailService.sendHtmlMail(测试Springboot发送带附件的邮件2, 欢迎进入a href\http://www.baidu.com\百度首页/a, attachmentMap);}}4.3 测试发送发送模版邮件
首先需要引入 Freemarker 依赖 !--整合freemarker--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-freemarker/artifactId/dependency然后在 resources/templates 目录下创建一个 mail.ftl 作为邮件发送模板 htmlbodyh3你好 span stylecolor: red;${username}/span, 这是一封模板邮件!/h3/body
/htmlpackage com.yyds;import com.yyds.service.MailService;
import freemarker.template.TemplateException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.mail.MessagingException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;SpringBootTest(classes BootStartApplication.class)
public class MimeMailTest {Autowiredprivate MailService mailService;Testpublic void testFreemarkerMail() throws MessagingException, IOException, TemplateException {MapString, Object params new HashMap();params.put(username, Tom);mailService.sendTemplateMail(测试Springboot发送模版邮件, params);}}