赞
踩
最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
最近实现了邮件发送的业务,这是我的记录。
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 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 <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);
@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);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。