javamail——邮件发送
最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
最近实现了邮件发送的业务,这是我的记录。
分析
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——邮件发送相关推荐
- JavaMail邮件发送,网页、客户端详解-JavaWeb学习6.9
JavaMail邮件发送 JavaMail发送邮件 笔记 导入mail.jar包 eclipse编写时的目录 网页上发送邮件 采用qq邮箱和网易邮箱 代码 客户端发送邮箱 客户端采用foxmail 服 ...
- JavaMail邮件发送不成功的那些坑人情况及分析说明
前言 JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文注解.但是由于JavaMail的机制设置不够完善,特别是异常出错时的参考信息太少,给初学者造成了不少麻烦,而我就是 ...
- Spring的javaMail邮件发送(带附件)
项目中经常用到邮件功能,在这里简单的做一下笔记,方便日后温习. 首先需要在配置文件jdbc.properties添加: #------------ Mail ------------ mail.smt ...
- 带附件/密送/抄送的 javaMail 邮件发送 -- java_demo(两种实现方式)
话不多说,上代码--第一种,自己实现的,参考资料 javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBoot 常用的邮件服务器名称.地址及SSL/非SSL协议端口号 Jav ...
- JavaMail邮件发送不成功的那些坑人情况及分析说明(巨坑跳出专用姿势)
https://blog.csdn.net/xyw591238/article/details/69530950 前言 JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文 ...
- javaMail邮件发送
MailAuthenticator.java package com.sunrise.jop.common.mail;import javax.mail.Authenticator; import j ...
- 应用层之E-mail服务及javaMail邮件发送的知识总结
关于Email服务你需要知道的知识点: 概述: 今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发&q ...
- javaMail邮件发送功能(多收件人,多抄送人,多密送人,多附件)
先看源码,再来理解,可以直接使用! JavaMailWithAttachment.java: <span style="font-family: Arial, Helvetica, s ...
- 随笔之javamail邮件发送(阿里云企业邮箱)
mvn依赖: <!-- Java Mail --> <dependency><groupId>javax.mail</groupId><artif ...
最新文章
- python生成word目录_Word&Python-创建目录
- linux手写数字识别opencv,opencv实现KNN手写数字的识别
- 一起再看执行上下文/作用域链/原型链
- 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术
- 云炬WEB开发笔记2-4 Sublime使用技巧
- 2434: [Noi2011]阿狸的打字机
- 06 - Object-C ARC机制
- android 自定义dialog 定时关闭,Android 快速实现自定义 Dialog
- 持续集成部署Jenkins工作笔记0003---Web工程部署方式说明
- 计算机网络帧及其封装,计算机网络程设计-帧封装.doc
- robocopy 备份_windows下使用RoboCopy命令进行文件夹增量备份
- 单片机程序编写常使用的程序架构
- 淘宝爬虫:看看房地产拍卖行情怎么样?附可视化分析
- 百问网7天物联网智能家居 学习心得 打卡第七天
- 液晶知识 占空比(Duty)定义 偏压比(Bias)定义 及两者之间 kinglcm88|创建时间:2016年05月19日 11:53|浏览:525|评论:0 标签:液晶 占空比 Duty 偏压
- a0图框标题栏尺寸_机械制图140标题栏-机械制图a0标题栏-机械制图图框标题栏标准...
- JMeter性能测试,入门到入土
- 计算机没有usb视频教程,Win7已安装但没有USB3.0驱动如何安装教程
- UE4使用以及打包注意事项
- 再读新疆系列(一)——穿越准葛尔盆地