最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
最近实现了邮件发送的业务,这是我的记录。
javamail是用来发送邮件的。我们在代码里操作他来实现邮件发送。
我们使用qq邮箱作为案例
首先,我们需要去qq邮箱里面开smtp服务,具体的操作看这里qq邮箱smtp服务开通
然后,我们需要先在pom中添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>
然后,我们需要在application.yml中配置smtp(这里由于想好要部署到服务器上所以预先设置好了smtps,本地照样可用)
# java mail
mail:
host: smtp.qq.com
protocol: smtps
username: 你的/你公司的邮箱地址@qq.com
password: 去邮箱获取
port: 465
properties:
mail:
smtp:
socketFactort:
port: 465
class: javax.net.ssl.SSLSocketFactory
fallback: 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 返回类型任意
* @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 返回类型任意
* @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 返回类型任意
* @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 返回类型任意返回类型任意
* @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 返回类型任意返回类型任意
* @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);
@Autowired
private JavaMailSender javaMailSender;
/**
* 简单邮件发送
*
* @param from 发送者
* @param to 接收者(多人用,隔开)
* @param cc 抄送
* @param bcc 密送
* @param subject 邮件主题
* @param text 邮件内容
* @return R对象
*/
@Override
public 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 {
@Autowired
private 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对象
*/
@Override
public 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对象
*/
@Override
public 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);
//装载dto
mailFileDTO.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);