最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
最近实现了邮件发送的业务,这是我的记录。

分析

javamail是用来发送邮件的。我们在代码里操作他来实现邮件发送。
我们使用qq邮箱作为案例

设置

首先,我们需要去qq邮箱里面开smtp服务,具体的操作看这里qq邮箱smtp服务开通
然后,我们需要先在pom中添加依赖

<!--        java-mail依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>

然后,我们需要在application.yml中配置smtp(这里由于想好要部署到服务器上所以预先设置好了smtps,本地照样可用)

# java mailmail:host: smtp.qq.comprotocol: smtpsusername: 你的/你公司的邮箱地址@qq.compassword: 去邮箱获取port: 465properties:mail:smtp:socketFactort:port: 465class: javax.net.ssl.SSLSocketFactoryfallback: false

我们将使用R作为结果集响应,并使用MailFileDTO作为data传回的数据的javabean:

R

package cn.calendo.common;import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** 前后端协议联调 结果集R*/
@Data
public class R<T> implements Serializable {/*** 状态码* 200: 成功* 400: 请求语法错误* 403: 服务器拒绝请求* 404: 服务器未响应* 500: 服务器内部错误*/private Integer code;/*** 返回信息*/private String msg;/*** 返回时间戳*/private Date timestamp;/*** 返回的数据*/private T data;/*** 响应成功** @param code      状态码 200: 成功* @param object    任意对象* @param timestamp 时间戳* @param <T>       返回类型任意* @return R结果集*/public static <T> R<T> success(Integer code, Date timestamp, T object) {R<T> r = new R<T>();r.code = code;r.timestamp = timestamp;r.data = object;return r;}/*** 响应成功** @param code      状态码 200: 成功* @param msg       返回的消息* @param timestamp 时间戳* @param <T>       返回类型任意* @return R结果集*/public static <T> R<T> success(Integer code, String msg, Date timestamp) {R<T> r = new R<T>();r.code = code;r.msg = msg;r.timestamp = timestamp;return r;}/*** 响应成功** @param code      状态码 200: 成功* @param msg       返回的消息* @param timestamp 时间戳* @param object    返回的数据* @param <T>       返回类型任意* @return R结果集*/public static <T> R<T> success(Integer code, String msg, Date timestamp, T object) {R<T> r = new R<T>();r.code = code;r.msg = msg;r.timestamp = timestamp;r.data = object;return r;}/*** 响应失败** @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误* @param msg       返回给前端的错误信息* @param timestamp 时间戳* @param <T>       返回类型任意返回类型任意* @return R结果集*/public static <T> R<T> error(Integer code, String msg, Date timestamp) {R<T> r = new R<>();r.code = code;r.msg = msg;r.timestamp = timestamp;return r;}/*** 响应失败** @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误* @param msg       返回给前端的错误信息* @param timestamp 时间戳* @param object    任意对象* @param <T>       返回类型任意返回类型任意* @return R结果集*/public static <T> R<T> error(Integer code, String msg, Date timestamp, T object) {R<T> r = new R<>();r.code = code;r.msg = msg;r.timestamp = timestamp;r.data = object;return r;}}

MailFileDTO

package cn.calendo.dto.fileDTO;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 邮件文件dto*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailFileDTO {/*** 文件名(业务层设为原始文件名)*/private String fileName;/*** 是否为空(true:空;false:非空)*/private boolean isEmpty;/*** 文件大小(B)*/private long fileSize;
}

使用

首先我们需要知道,一个邮件由发送者from,接收者to,抄送cc,密送bcc,主题subject,正文text组成,更多的例如上传的文件file,而在javamail中,需要我们传入的参数也是这些。
而发送不同格式的邮件是有不同的操作的,但是被操作对象只有一个:javaMailSender,因此,我们首先去建一个业务类,将其自动装配进来

@Autowired
private JavaMailSender javaMailSender;

然后,我们先实现一个简单类型的邮件发送功能。

public R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {return R.success(200, "发送成功", new Date());
}

我们需要知道,当JavaMailSender 注入后,我们可以new一个SimpleMailMessage

SimpleMailMessage message = new SimpleMailMessage();

接下来再设置传进来的请求参数

message.setFrom(from);message.setTo(to);//抄送可以不填if (cc != null) {message.setCc(cc);}//密送可以不填if (bcc != null) {message.setBcc(bcc);}message.setSubject(subject);message.setText(text);

最后,sender来发送即可

javaMailSender.send(message);

简单邮件代码

@Autowiredprivate JavaMailSender javaMailSender;/*** 简单邮件发送** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容* @return R对象*/@Overridepublic R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);if (cc != null) {message.setCc(cc);}if (bcc != null) {message.setBcc(bcc);}message.setSubject(subject);message.setText(text);javaMailSender.send(message);return R.success(200, "发送成功", new Date());}

由于我们是前端设置了请求,所以我们需要编写控制层


/*** 邮件发送测试控制层,以test开头*/
@RestController
@RequestMapping("/test/mail")
public class Mail {@Autowiredprivate IMailService mailService;/*** 简单邮件发送** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容* @return R对象*/@PostMapping("/send_simple_mail")public R sendSimpleMail(@RequestParam(value = "from") String from,@RequestParam(value = "to") String to,@RequestParam(value = "cc", required = false) String cc,@RequestParam(value = "bcc", required = false) String bcc,@RequestParam(value = "subject") String subject,@RequestParam(value = "text") String text) {return mailService.sendSimpleMail(from, to, cc, bcc, subject, text);}
}

接下来,我们去postman里面测试一波

也确实收到了

至此,简单邮件传输完成。

链接邮件

链接邮件是可以在正文里面写html代码的,也就是说,可以生成链接,图片等
与上面一样,需要编写控制层与业务层

控制层

/*** 链接邮件发送(支持多人接收)** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容(动态链接在内)* @return R对象*/@PostMapping("/send_link_mail")public R sendLinkMail(@RequestParam(value = "from") String from,@RequestParam(value = "to") String to,@RequestParam(value = "cc", required = false) String cc,@RequestParam(value = "bcc", required = false) String bcc,@RequestParam(value = "subject") String subject,@RequestParam(value = "text") String text) {return mailService.sendLinkMail(from, to, cc, bcc, subject, text);}

然后我们需要注意的是我们要通过注入的sender来生成一个mimeMessage进行助理发送

/*** 链接邮件发送(支持多人接收)** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容(动态链接在内)* @return R对象*/@Overridepublic R sendLinkMail(String from, String to, String cc, String bcc, String subject, String text) {try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);message.setFrom(from);message.setTo(to);if (cc != null) {message.setCc(cc);}if (bcc != null) {message.setBcc(bcc);}message.setSubject(subject);message.setText(text);javaMailSender.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();return R.error(500, "发送失败", new Date());}return R.success(200, "发送成功", new Date());}

文件邮件

首先,我们都知道,上传与下载文件,都是通过MultipartFile格式进行的,这里也不例外

控制层

/*** 单文件邮件发送** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容* @param file    单文件* @return R对象*/@PostMapping("/send_file_mail")public R sendFileMail(@RequestParam(value = "from") String from,@RequestParam(value = "to") String to,@RequestParam(value = "cc", required = false) String cc,@RequestParam(value = "bcc", required = false) String bcc,@RequestParam(value = "subject") String subject,@RequestParam(value = "text", required = false) String text,@RequestParam(value = "file") MultipartFile file) {return mailService.sendFileMail(from, to, cc, bcc, subject, text, file);}

业务层

与链接邮件一样,需要使用助理去发送邮件
在业务层内我们使用先前写好的dto进行装载返回对象

/*** 单文件邮件发送** @param from    发送者* @param to      接收者(多人用,隔开)* @param cc      抄送* @param bcc     密送* @param subject 邮件主题* @param text    邮件内容* @param file    单文件* @return R对象*/@Overridepublic R sendFileMail(String from, String to, String cc, String bcc, String subject, String text, MultipartFile file) {MailFileDTO mailFileDTO = new MailFileDTO();try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);message.setFrom(from);message.setTo(to);if (cc != null) {message.setCc(cc);}if (bcc != null) {message.setBcc(bcc);}message.setSubject(subject);message.setText(text);message.addAttachment(file.getName(), file);//装载dtomailFileDTO.setFileName(file.getOriginalFilename());//获取原始文件名mailFileDTO.setEmpty(file.isEmpty());//判断是否为空mailFileDTO.setFileSize(file.getSize());//获取文件大小javaMailSender.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();return R.error(500, "发送失败", new Date());}return R.success(200, "发送成功", new Date(), mailFileDTO);}

测试

我们在postman里面测试时需要添加请求头
在请求体内添加文件

返回即是json

总结

如果你想用简单的邮件发送的话,就直接这样即可

SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);message.setTo(to);message.setCc(cc);message.setBcc(bcc);message.setSubject(subject);message.setText(text);
javaMailSender.send(message);

若你想发送文件或者链接,就这样

try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(text);message.addAttachment(file.getName(), file);} catch (MessagingException e) {e.printStackTrace();return R.error(500, "发送失败", new Date());
}return R.success(200, "发送成功", new Date(), mailFileDTO);

javamail——邮件发送相关推荐

  1. JavaMail邮件发送,网页、客户端详解-JavaWeb学习6.9

    JavaMail邮件发送 JavaMail发送邮件 笔记 导入mail.jar包 eclipse编写时的目录 网页上发送邮件 采用qq邮箱和网易邮箱 代码 客户端发送邮箱 客户端采用foxmail 服 ...

  2. JavaMail邮件发送不成功的那些坑人情况及分析说明

    前言   JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文注解.但是由于JavaMail的机制设置不够完善,特别是异常出错时的参考信息太少,给初学者造成了不少麻烦,而我就是 ...

  3. Spring的javaMail邮件发送(带附件)

    项目中经常用到邮件功能,在这里简单的做一下笔记,方便日后温习. 首先需要在配置文件jdbc.properties添加: #------------ Mail ------------ mail.smt ...

  4. 带附件/密送/抄送的 javaMail 邮件发送 -- java_demo(两种实现方式)

    话不多说,上代码--第一种,自己实现的,参考资料 javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBoot 常用的邮件服务器名称.地址及SSL/非SSL协议端口号 Jav ...

  5. JavaMail邮件发送不成功的那些坑人情况及分析说明(巨坑跳出专用姿势)

    https://blog.csdn.net/xyw591238/article/details/69530950 前言   JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文 ...

  6. javaMail邮件发送

    MailAuthenticator.java package com.sunrise.jop.common.mail;import javax.mail.Authenticator; import j ...

  7. 应用层之E-mail服务及javaMail邮件发送的知识总结

    关于Email服务你需要知道的知识点: 概述: 今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发&q ...

  8. javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)

    先看源码,再来理解,可以直接使用! JavaMailWithAttachment.java: <span style="font-family: Arial, Helvetica, s ...

  9. 随笔之javamail邮件发送(阿里云企业邮箱)

    mvn依赖: <!-- Java Mail --> <dependency><groupId>javax.mail</groupId><artif ...

最新文章

  1. python生成word目录_Word&Python-创建目录
  2. linux手写数字识别opencv,opencv实现KNN手写数字的识别
  3. 一起再看执行上下文/作用域链/原型链
  4. 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术
  5. 云炬WEB开发笔记2-4 Sublime使用技巧
  6. 2434: [Noi2011]阿狸的打字机
  7. 06 - Object-C ARC机制
  8. android 自定义dialog 定时关闭,Android 快速实现自定义 Dialog
  9. 持续集成部署Jenkins工作笔记0003---Web工程部署方式说明
  10. 计算机网络帧及其封装,计算机网络程设计-帧封装.doc
  11. robocopy 备份_windows下使用RoboCopy命令进行文件夹增量备份
  12. 单片机程序编写常使用的程序架构
  13. 淘宝爬虫:看看房地产拍卖行情怎么样?附可视化分析
  14. 百问网7天物联网智能家居 学习心得 打卡第七天
  15. 液晶知识 占空比(Duty)定义 偏压比(Bias)定义 及两者之间 kinglcm88|创建时间:2016年05月19日 11:53|浏览:525|评论:0 标签:液晶 占空比 Duty 偏压
  16. a0图框标题栏尺寸_机械制图140标题栏-机械制图a0标题栏-机械制图图框标题栏标准...
  17. JMeter性能测试,入门到入土
  18. 计算机没有usb视频教程,Win7已安装但没有USB3.0驱动如何安装教程
  19. UE4使用以及打包注意事项
  20. 再读新疆系列(一)——穿越准葛尔盆地

热门文章

  1. 为什么我的网站部署了https却没有绿色的小锁标志
  2. 【综合类型第 36 篇】我的四周年创作纪念日
  3. 店铺门面转让出租小程序开发制作功能介绍
  4. node安装和配置(node-v12.20.2-x64 ) 以及node版本切换介绍
  5. ansible 特殊变量
  6. java多文件上传plupload控件实现多图片上传(二)
  7. 企鹅电竞VAP动画组件停留最后一帧画面
  8. 塑料模具设计需要注意哪些?新手必收藏!!!
  9. cons、car和cdr的实现
  10. 内网渗透-实战|手把手教你如何进行内网渗透