邮件发送

邮箱需要开启POP3/SMTP服务

发送

1. 搭建环境

使用SpringBoot发送邮件,搭建环境非常容易,首先在创建项目时添加邮件依赖,代码如下:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

项目创建成功后,在application.yml中完成邮件基本消息配置,代码如下:

spring:mail:host: smtp.qq.comport: 465username: ***@qq.compassword: *****default-encoding: UTF-8properties: mail: smtp: socketFactory: class: javax.net.ssl.SSLSocketFactorydebug: true

这里配置了邮件服务器的地址、端口(可以是465或者587)、用户的账号和密码以及默认编码、SSL连接配置等,
最后开启debug,这样方便开发者查看邮件发送日志。注意,SSL的配置可以在QQ邮箱帮助中心看到相关文档。

完成这些配置后,基本的邮件发送环境就搭建成功了,接下来就可以发送邮件了。邮件从简单到复杂有多种类型,下面分别给予介绍。

2. 发送简单邮件

创建一个MailService用来封装邮件的发送,代码如下:

@Component
public class MailService {@AutowiredJavaMailSender javaMailSender;public void sendSimpleMail(String from,String to,String cc, String subject,String content) {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom(from);simpleMailMessage.setTo(to);simpleMailMessage.setCc(cc);simpleMailMessage.setSubject(subject);simpleMailMessage.setText(content);javaMailSender.send(simpleMailMessage);}
}

代码解释:

  • JavaMailSender是SpringBoot在MailSenderPropertiesConfiguration类中配置好的,该类在Mail自动配置类MailSenderAutoConfiguration中导入,
    因此这里注入JavaMailSender就可以使用了。

  • sendSimpleMail方法的5个参数分别表示发送者、收件人、抄送人、邮件主题以及邮件内容。

  • 简单邮件可以直接构建一个SimpleMailMessage对象进行配置,配置完成以后,通过javaMailSender将邮件发送出去。

配置完成后,在单元测试中写一个测试方法,代码如下:

@SpringBootTest
class Chapter131ApplicationTests {@AutowiredMailService mailService;@Testvoid contextLoads() {}@Testpublic void sendSimpleMail(){mailService.sendSimpleMail("**@qq.com","**@163.com","**@outlook.com","测试邮件主题","测试邮件内容");}}

执行该方法,即可看到邮件发送成功。

3. 发送带附件的邮件

要发送一个带附件的邮件也非常容易,通过调用Attachment方法即可添加附件,该方法调用多次即可添加多个附件。
在MailService中添加如下方法:

   /*** 发送带附件的邮件* @param from* @param to* @param subject* @param content* @param file*/public void SendAttachFileMail(String from, String to, String subject, String content, File file){try {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content);helper.addAttachment(file.getName(),file);javaMailSender.send(message);} catch (MessagingException e) {e.printStackTrace();}}
}

这里使用MimeMessageHelper简化了邮件的配置,它的构造方法的第二个参数true表示构造一个multipart message类型的邮件,
multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。最后通过addAttachment方法添加附件。

在单元测试中添加如下方法进行测试:

    @Testpublic void sendAttachFileMail(){mailService.sendAttachFileMail("**@qq.com","**@163.com","测试邮件主题","测试邮件内容",new File("C:\\Users\\yulu\\Desktop\\images\\app\\uploads\\2020052109530CE775EF-A42A-4F6F-8C86-86E8DB7A80FA.jpeg"));}

4. 发送带图片资源的邮件

有的邮件正文中可能要插入图片,使用FileSystemResource可以实现这一功能,代码如下:

    /*** 发送带图片资源的邮件** @param from* @param to* @param subject* @param content* @param srcPath* @param resIds*/public void sendMailWithImg(String from, String to, String subject, String content, String[] srcPath, String[] resIds) {if (srcPath.length != resIds.length) {System.out.println("资源不匹配,发送失败!!!");return;}try {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);for (int i = 0; i < srcPath.length; i++) {FileSystemResource resource = new FileSystemResource(new File(srcPath[i]));helper.addInline(resIds[i], resource);}javaMailSender.send(message);} catch (MessagingException e) {e.printStackTrace();}}
}

在发送有件事分别传入图片资源路径和资源id,通过FileSystemResource构造静态资源,然后调用addInline方法将资源加入到邮件对象中,
在调用MimeMessageHelper中的setText方法时,第二个参数表示邮件正文是html格式的,该参数不传默认为false。

接下来在测试类中添加如下方法进行测试:

    @Testpublic void sendMailWithImg(){mailService.sendMailWithImg("**@qq.com","**@163.com","测试邮件主题(图片)","    <div>hello,这是一封带图片资源的邮件<br>\n" +"        这是图片1:<div><img src='cid:p01'></div>\n" +"        这是图片2:<div><img src='cid:p02'></div>\n" +"    </div>",new String[]{"C:\\Users\\yulu\\Desktop\\temporary\\images\\index.jpg","C:\\Users\\yulu\\Desktop\\temporary\\images\\tx.jpg"},new String[]{"p01","p02"});}

5. 使用FreeMarker构建邮件模板

对于各式复杂的邮件,如果采用字符串进行HTML拼接,不但容易出错,而且不易于维护,使用HTML模板可以很好地解决这一问题。
使用FreeMarker构建邮件模板,首先加入FreeMarker依赖,代码如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

然后在MailService中添加如下方法:

    /*** 使用FreeMarker构建邮件模板* @param from* @param to* @param subject* @param content*/public void sendHtmlMail(String from, String to, String subject, String content){try {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);javaMailSender.send(message);} catch (MessagingException e) {System.out.println("发送失败!!!");}}

接下来在resources目录下创建ftl目录作为模板存放位置,在该目录下创建mailtemplate.ftl作为邮件模板,内容如下:

<div>邮箱激活</div>
<div>您的注册信息是:<table border="1"><tr><td>用户名</td><td>${username}</td></tr><tr><td>用户性别</td><td>${gender}</td></tr></table>
</div>
<div><a href="http://wwww.baidu.com">核对无误请点击本链接激活邮箱</a>
</div>

当然在创建一个User实体类,代码如下:

@Data
public class User {private String username;private String gender;}

最后在单元测试类中添加如下方法进行测试:

    @Testpublic void sendHtmlMail(){try {Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);ClassLoader loader = Chapter131Application.class.getClassLoader();configuration.setClassLoaderForTemplateLoading(loader,"ftl");Template template = configuration.getTemplate("mailtemplate.ftl");StringWriter mail = new StringWriter();User user = new User();user.setUsername("yulu");user.setGender("男");template.process(user,mail);mailService.sendHtmlMail("**@qq.com","**@163.com","测试邮件主题",mail.toString());} catch (IOException | TemplateException e) {e.printStackTrace();}}

首先,配置FreeMarker模板位置,配置模板文件,然后结合user对象渲染模板,将渲染结果发送出去,执行该方法,邮件发送结果如下:

6. 使用Thymeleaf构建邮件模板

既然可以使用FreeMarker构建邮件模板,当然也可以用Thymeleaf构建邮件模板,使用Thymeleaf构建邮件模板相对来说更加方便。
使用Thymeleaf构建邮件模板,首先添加Thymeleaf依赖,代码如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Thymeleaf邮件模板默认的位置在resources/templates目录下,创建相应的目录,然后创建邮件模板mailtemplate.html,代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>邮件</title>
</head>
<body>
<div>邮箱激活</div>
<div>您的注册信息是:<table border="1"><tr><td>用户名</td><td th:text="">${username}</td></tr><tr><td>用户性别</td><td th:text="">${gender}</td></tr></table>
</div>
<div><a href="http://wwww.baidu.com">核对无误请点击本链接激活邮箱</a>
</div>
</body>
</html>

然后在单元测试类中添加如下代码进行测试:

    @AutowiredISpringTemplateEngine templateEngine;@Testpublic void sendHtmlMailThymeleaf(){Context context = new Context();context.setVariable("username","yulu");context.setVariable("gender","男");String mail = templateEngine.process("mailtemplate.html", context);mailService.sendHtmlMail("**@qq.com", "**@163.com", "测试邮件主题", mail.toString());}

不同于FreeMarker,Thymeleaf提供了ISpringTemplateEngine,来对模板进行渲染,通过Context构造模板中变量所需要的值,这种方式比FreeMarker构建邮件模板更加方便。

Java后端邮件发送相关推荐

  1. Java Mail 邮件发送(一):入门Demo

    本文首发于简书,Java Mail 邮件发送(一):Demo 上周公司的项目要求开发邮件发送功能.自己在网上跟着教程边学边做了一下午,现在基本开发完成了.由于一个同事也想看下该怎么写,顺便学习下.所以 ...

  2. 用java实现邮件发送验证码

    java实现邮件发送验证码 网易邮箱开通POP3SMTP服务的步骤 java实现邮件发送验证码 建议不要用qq邮箱,我使用qq邮箱直接一直给我报530错误,我一直认为我代码写的有错误或者POP3/SM ...

  3. java实现邮件发送, 抄送及多附件发送

    java实现邮件发送, 抄送及多附件发送 所需的jar包  mailapi.jar和smtp.jar  或  javax-mail-xxx.jar(如javax.mail-1.5.6.jar)  ht ...

  4. 用java实现邮件发送

    电子邮件 1.基础知识铺垫 要在网络上实现邮件功能,必须要有专门的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服 ...

  5. [Java工具] 邮件发送工具

    注册邮箱 去163邮箱(或其他邮箱)注册一个邮箱,并开启SMTP授权码. 程序 需要注意的是,由于阿里云服务器不让使用默认的25端口,所以会出现Windows下测试发送邮件成功,Linux服务器下发送 ...

  6. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  7. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  8. Java实现邮件发送 超详细!!!(以QQ邮箱个人版和企业版为例)

    Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 文章目录 Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 个人邮箱示例 配置依赖 简单了解涉及的两个传输协议 Q ...

  9. java实现邮件发送共鞥_Java实现复杂邮件发送功能(基于JavaMail)的实例

    这篇文章主要为大家详细介绍了基于JavaMail的Java实现复杂邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发 ...

最新文章

  1. C#制作自定义安装程序
  2. android authtype=1,【报Bug】plus.screen.lockOrientation在android里引起闪退
  3. 设计模式系列1:单例模式(Singleton Pattern)
  4. Kaggle入门五大步,跟着做就对了
  5. vue一级分类和耳机分类_?1K411023 岩土分类与不良土质处理方法·2020年一级市政建造师...
  6. Web三个域对象的区别
  7. 【BZOJ3218】a+b problem (最小割 + 主席树)
  8. GitHub 疑遭中间人攻击,最大暗网托管商再被黑!
  9. Bootloader之BareBox 之路(1)--安装
  10. Java将excel文件转成json文件(有错误)
  11. 长沙理工考研2021计算机软件科目,2021考研进行时:速览最新招生信息
  12. 文件夹复制删除 C#
  13. 鸡肋的 Nero BurnLite 10
  14. 计数器代码php,php 的计数器程序代码示例
  15. ACS高级计算机科学,2018-2019澳洲八大ACS认证学位全盘点!③
  16. 块引用—Markdown极简入门教程(6)
  17. 让C程序跳转到绝对地址0x100000处执行
  18. web前端 第一次作业
  19. Idear集成maven环境
  20. Searching for MobileNetV3翻译

热门文章

  1. 2010最拉风的话语
  2. 【Redis最佳实践】使用DCS Redis实现排行榜功能
  3. java time sleep_Java TimeUnit sleep()用法及代码示例
  4. Mac如何完全卸载avast?提示avast already installed 无法安装怎么办?
  5. SQL查询知识点总结
  6. 【参赛作品16】openGauss SQL解析源码分析
  7. [Emoji cheat sheet]写博客时会使用的Emoji可爱表情符号
  8. mtk驱动camera的调试总结1--原理
  9. ECharts之水球图
  10. oracle grid需要安装,Oracle GridControl 安装教程