Spring Boot集成JavaMailSender发送邮件功能的实现

网友投稿 395 2022-07-31


目录前言集成步骤添加依赖邮件配置信息邮件配置类代码实现发送简单邮件邮件实体类业务实现类测试类扩展功能发送Html内容的邮件业务实现类测试类发送带附件邮件业务实现类测试类发送模板邮件添加依赖模板内容业务实现类测试示例总结

前言

项目中邮件发送为常用功能之一,例如注册成功后需要发送激活邮件,账号的会员到期提示,每日报表统计等功能都需要自动发送邮件,本文将讲解Spring Boot如何实现邮件发送功能。

集成步骤

添加依赖

org.springframework.boot

spring-boot-starter-mail

邮件配置信息

在resource目录下新增mail.properties内容如下:

#企业邮件配置

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.SSLSocketFhttp://actory

加载属性文件

@Component

@ConfigurationProperties(prefix = "mail")

@PropertySource(value = { "classpath:mail.properties" })

public class MailSenderConfig implements Serializable

{

private static final long serialVersionUID = -4558468113448742143L;

/**

* 主机

*/

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的实现。

代码实现

发送简单邮件

邮件实体类

public class Mail implements Serializable

{

private static final long serialVersionUID = -1001194001681838276L;

/**

* 发送者

*/

private String from;

/**

* 接收者

*/

private String to;

private String cc;

private String bcc;

/**

* 主题

*/

private String subject;

/**

* 内容

*/

private String body;

private String fileName;

/**

* 文件路径

*/

private String filePath;

//

}

业务实现类

public interface MailService

{

/**

* 发送简单邮件

* @param mail

*/

void sendSimpleMail(Mail mail);

}

// 实现类

@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.goCrYcLnPgetBody());

mailSender.send(message);

logger.info("发送完毕");

}

}

测试类

@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 "发送成功";

}

注意:邮件功能需要异步发送,所以采用的@Async注解来实现。

至此简单的邮件发送功能已经完成。

扩展功能

发送Html内容的邮件

发送简单的邮件,有时候无法满足业务的需求,我们需要至此发送带HTMl内容格式的邮件。

业务实现类

public void sendHtmlMail(Mail mail)

{

MimeMessage message =mailSender.createMimeMessage();

MimeMessageHelper messageHelper=null;

try

{

// 设置编码utf-8

messageHelper = new MimeMessageHelper(message, true, "UTF-8");

messageHelper.setFrom(mail.getFrom());

messageHelper.setTo(mail.getTo());

messageHelper.setSubject(mail.getSubject());

//转换html

messageHelper.setText(mail.getBody(),true);

mailSender.send(message);

}

catch (MessagingException e)

{

logger.error("发送邮件失败");

throw new RuntimeException("发送邮件失败",e);

}

logger.info("发送完毕");

}

注意事项: 1.采用html格式的邮件需要注意内容的格式,采用UTF-8格式否则中文会出现乱码。 2.设置邮件内容时,需要将设置为true,否则html内容会原本输出。

测试类

@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 = "\n" +

"

"

"\n" +

"";

mail.setBody(content);

mailService.sendHtmlMail(mail);

return "发送成功";

}

发送带附件邮件

业务实现类

public void sendAttachmentsMail(Mail mail)

{

MimeMessage message =mailSender.createMimeMessage();

MimeMessageHelper messageHelper=null;

try

{

// 设置编码utf-8

messageHelper = new MimeMessageHelper(message, true, "UTF-8");

messageHelper.setFrom(mail.getFrom());

messageHelper.setTo(mail.getTo());

messageHelper.setSubject(mail.getSubject());

//转换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("发送邮件失败");

throw new RuntimeException("发送邮件失败",e);

}

logger.info("发送完毕");

}

测试类

@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 "发送成功";

}

注意:设置附件的路径和附件的名称。

发送模板邮件

有些特殊需要,我们需要采用固定的邮件模板发送邮件。

邮件的模板可以采用thymeleaf和freemark来实现,本文将采用thymeleaf来实现邮件模板发送。

添加依赖

org.springframework.boot

spring-boot-starter-thymeleaf

ognl

ognl

3.2.14

模板内容

模板路径:src/main/resources/templates/emailTemplate.html

模板内容:

xmlns="http://w3.org/1999/xhtml"

xmlns:th="http://thymeleaf.org">

style="border-collapse: collapse;">

公司名称:

地址:

联系人:

业务实现类

public void sendTemplateMail(Mail mail)

{

Context context = new Context();

Map emailParam = new HashMap<>();

emailParam.put("companyName", "公司名称");

emailParam.put("address", "公司地址");

emailParam.put("phone", "联系电话");

context.setVariable("emailParam", emailParam);

//模板合成html内容

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 "发送成功";

}

总结

本文讲解的是Spring Boot集成JavaMailSender发送邮件,邮件内容格式有种,需要结合业务的来选择对应的实现方式。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java8如何从一个Stream中过滤null值
下一篇:Java8 Stream collect(Collectors.toMap())的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~