赞
踩
要在网络上实现邮件功能,必须要有专门的邮件服务器。它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
这些邮件服务器类似于现实生活中的邮局。
1、电子邮件协议
电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,
SMTP(Simple Mail Transfer Protocol)协议
SMTP即简单邮件传输协议,发送邮件的协议,默认端口为25
通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
POP3(Post Office Protocol 3)协议
POP3即邮局协议,接收邮件的协议,默认端口为110,
通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
IMAP(Internet Mail Access Protocol)协议
IMAP即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。
参考网易邮箱:什么是POP3、SMTP和IMAP?
这里使用 网易邮箱作为发送者来给 QQ邮箱发送邮件。
发送邮件之前,我们需要先获取 网易邮箱的授权码
。
在设置中,开启开启服务,短信验证之后,就会获取到授权码(网易这边只显示一次,记得保存好)。
1、创建 SpringBoot项目引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、YML配置邮件信息
spring: mail: # 邮件服务地址 host: smtp.163.com # 默认端口25,可不写 port: 25 # 编码格式 default-encoding: utf-8 # 发送者用户名 username: xxx@163.com # 授权码,刚才获取的代码 password: xxx # 其它参数 # properties: # mail: # smtp: # # 如果是用 SSL 方式,需要配置如下属性 # ssl: # enable: true # required: true # # 邮件接收时间的限制,单位毫秒 # timeout: 10000 # # 连接时间的限制,单位毫秒 # connectiontimeout: 10000 # # 邮件发送时间的限制,单位毫秒 # writetimeout: 10000
当我们进行好 yml 配置后,SpringBoot使用MailSenderAutoConfiguration
会帮助我们自动配置 JavaMailSender。
Spring框架中用于Java邮件支持的接口和类组织如下:
MailSender interface:发送简单基础电子邮件的顶级接口;
JavaMailSender interface:是MailSender的子接口。它支持MIME消息,并且主要与MimeMessageHelper类一起用于创建MimeMessage。
JavaMailSenderImpl class:实现了JavaMailSender 的接口,它支持MimeMessage和SimpleMailMessage;
MailMessage interface:创建邮件消息的顶级接口;
SimpleMailMessage class:用于创建简单的邮件消息,包括from,to,cc,subject,text和sentDate等字段;
MimeMailMessage class:用于创建支持MIME的邮件消息,主要与MimeMessageHelper类一起用于创建MimeMessage;
MimeMessageHelper class:用于创建MIME消息的帮助类。它为HTML布局中的图像,典型邮件附件和文本内容提供支持等。
MimeMessagePreparator interface:提供一个回调接口,用于编写MIME消息;
3、创建邮件发送类
当我们进行好 yml 配置后,SpringBoot会帮助我们自动配置 JavaMailSender
,然后我们调用JavaMailSender
接口就实现操作发送邮件了。
下面写几种发送邮件的方式。
@Service public class MailService { private static final String SENDER = "xxx@163.com"; @Autowired private JavaMailSender mailSender; @Autowired private TemplateEngine templateEngine; /** * 发送普通邮件 * * @param to 收件人 * @param subject 主题(标题) * @param content 内容 */ public void sendSimpleMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(SENDER); message.setTo(to); message.setSubject(subject); message.setText(content); try { mailSender.send(message); } catch (Exception e) { System.out.println("发送普通邮件时发生异常!" + e); } } /** * 发送带附件的邮件 * * @param to 收件人 * @param subject 主题 * @param content 内容 * @param fileList 附件 */ public void sendFileMail(String to, String subject, String content, List<File> fileList) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示需要创建一个multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); if (fileList != null && fileList.size() > 0) { for (File file : fileList) { FileSystemResource fileSystemResource = new FileSystemResource(file); String fileName = fileSystemResource.getFilename(); helper.addAttachment(fileName, fileSystemResource); } } mailSender.send(message); } catch (MessagingException e) { System.out.println("发送带附件的邮件时发生异常!" + e); } } /** * 发送HTML静态文件的邮件 * * @param to 收件人 * @param subject 主题 * @param content 内容 * @param srcIdMap 需要替换的静态文件(给html中标记id不赋值的话,可以发送,但静态文件不会显示),可为null表示纯HTML文件 */ public void sendHtmlMail(String to, String subject, String content, Map<String, String> srcIdMap) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示需要创建一个multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); //true指的是html邮件 helper.setText(content, true); if (srcIdMap != null) { for (Map.Entry<String, String> entry : srcIdMap.entrySet()) { FileSystemResource file = new FileSystemResource(new File(entry.getValue())); helper.addInline(entry.getKey(), file); } } mailSender.send(message); } catch (MessagingException e) { System.out.println("发送HTML静态文件的邮件时发生异常!" + e); } } /** * 发送Html模板的邮件 * * @param to 收件人 * @param subject 主题 * @param emailInfoMap 模板的数据信息 */ public void sendHtmlTemplateMail(String to, String subject, Map<String, Object> emailInfoMap) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示需要创建一个multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); helper.setSentDate(new Date()); // 设置参数, 也可以单独设置c ontext.setVariable("userName", "赵云"); org.thymeleaf.context.Context context = new Context(); context.setVariables(emailInfoMap); //设置模板,emailTemplate为html文件的文件名,emailTemplate.html或emailTemplate都可以 helper.setText(templateEngine.process("emailTemplate", context), true); mailSender.send(message); } catch (MessagingException e) { System.out.println("发送Html模板的邮件!" + e); } } }
4、在resources/templates目录中新建一个 emailTemplate.html模板文件,由于发送模板邮件
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>邮件模板</title> </head> <body> <h1>xx公司邀请你投递简历</h1> <table border="1" cellpadding="0" cellspacing="0"> <tr> <td>姓 名</td> <td>性 别</td> <td>出生日期</td> <td>职位</td> </tr> <tr> <td><span th:text="${userName}"></span></td> <td><span th:text="${sex}"></span></td> <td><span th:text="${#dates.format(birthday,'yyyy-MM-dd')}"></span></td> <td><span th:text="${office}"></span></td> </tr> </table> <a href="#" th:href="@{http://www.baidu.com(id=${id})}">公司官网</a> <h2>期待你的加入</h2> </body> </html>
5、在测试类中测试
@SpringBootTest class Email163ApplicationTests { @Autowired private MailService mailService; private static final String TO = "110xxx@qq.com"; @Test public void testSendSimpleMail(){ String subject = "测试普通邮件"; String content = "testSendSimpleMailMessge content"; mailService.sendSimpleMail(TO, subject, content); } @Test public void testSendFileMail(){ String subject = "测试带附件的邮件"; String content = "testSendFileMailMessge content"; List<File> fileList = new ArrayList<>(); fileList.add(new File("D:\\E\\电脑壁纸\\11.jpg")); fileList.add(new File("D:\\E\\电脑壁纸\\JD导入.xlsx")); mailService.sendFileMail(TO, subject, content, fileList); } @Test public void testSendHtmlMail(){ String subject = "测试HTML静态文件的邮件"; String htmlContent = "<html><body><h2>testSendSimpleMailMessge</h2> contentn内容,图片1 <br> <img src=\'cid:pic1\'/> <br>图片2 <br> <img src=\'cid:pic2\'/></body></html>"; Map<String, String> srcIdMap = new HashMap<>(2); srcIdMap.put("pic1", "D:\\E\\电脑壁纸\\11.jpg"); srcIdMap.put("pic2", "D:\\E\\电脑壁纸\\charge.jpg"); mailService.sendHtmlMail(TO, subject, htmlContent, null); } @Test public void testSendHtmlTemplateMail(){ String subject = "发送Html模板的邮件"; Map<String, Object> map = new HashMap<>(4); map.put("userName","赵云"); map.put("sex","男"); map.put("birthday", new Date()); map.put("office","打野"); mailService.sendHtmlTemplateMail(TO, subject, map); } }
参考文章:
Spring Boot 官方文档之 Sending Email
—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。