引言
使用java来发送邮箱,并不是难事,但是如何优雅的封装一个组件并支持附件发送,这里还是需要一定知识和技巧的。本节主要讲解基于配置以及基于数据库的该如何进行简单封装。
邮箱api坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
基于配置
在application.yml配置相关属性即可使用,具体配置如下
spring.mail.host 设置主机
spring.mail.port 设置端口 默认是25;开启ssl,则为465
spring.mail.username 发件箱账户名
spring.mail.password 发件箱密码
spring.mail.properties.mail.smtp.auth 是否开启认证
spring.mail.properties.mail.smtp.port 同上述端口
spring.mail.properties.mail.smtp.socketFactory.port同上
spring.mail.properties.mail.smtp.socketFactory.class
指定实现类,默认为javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.starttls.enable是否开启SSL
以上配置必须正确配置,方可正常发送邮件。基于数据库的,可以从数据库相关表中读取信息进行设置即可。具体可以参考springboot的bean注入方式,如需协助,请加微信huzhenjie_888进行有偿协助。
封装实体对象
@Data
public class MailVo {
//邮件id
private String id;
//邮件发送人
private String from;
//邮件接收人
private String to;
//邮件主题
private String subject;
//邮件内容
private String text;
//发送时间
private Date sentDate;
//抄送
private String cc;
//密送
private String bcc;
//状态
private String status;
//报错信息
private String error;
//邮件附件
@JsonIgnore
private MultipartFile[] multipartFiles;
}
封装实现
/**
* @author huzhenjie
*/
@Component
public class EmailManager {
@Resource
private JavaMailSenderImpl mailSender;
@Async
public MailVo sendMail(MailVo mailVo) {
try {
checkMail(mailVo); //1.检测邮件
sendMimeMail(mailVo); //2.发送邮件
} catch (Exception e) {
mailVo.setStatus("fail");
mailVo.setError(e.getMessage());
}
return mailVo;
}
//构建复杂邮件信息类
private void sendMimeMail(MailVo mailVo) {
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);//true表示支持复杂类型
//mailVo.setFrom(getMailSendFrom());//邮件发信人从配置项读取
messageHelper.setFrom(mailVo.getFrom());//邮件发信人
messageHelper.setTo(mailVo.getTo().split(","));//邮件收信人
messageHelper.setSubject(mailVo.getSubject());//邮件主题
messageHelper.setText(mailVo.getText(),Boolean.TRUE);//邮件内容
if (!StrUtil.isBlankOrUndefined(mailVo.getCc())) {//抄送
messageHelper.setCc(mailVo.getCc().split(","));
}
if (!StrUtil.isBlankOrUndefined(mailVo.getBcc())) {//密送
messageHelper.setCc(mailVo.getBcc().split(","));
}
if (mailVo.getMultipartFiles() != null) {//添加邮件附件
for (MultipartFile multipartFile : mailVo.getMultipartFiles()) {
messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
}
}
mailVo.setSentDate(new Date());
messageHelper.setSentDate(mailVo.getSentDate());
mailSender.send(messageHelper.getMimeMessage());//正式发送邮件
mailVo.setStatus("ok");
} catch (Exception e) {
throw new RuntimeException(e);//发送失败
}
}
private void checkMail(MailVo mailVo) {
if (StrUtil.isBlankOrUndefined(mailVo.getTo())) {
throw new RuntimeException("邮件收信人不能为空");
}
if (StrUtil.isBlankOrUndefined(mailVo.getSubject())) {
throw new RuntimeException("邮件主题不能为空");
}
if (StrUtil.isBlankOrUndefined(mailVo.getText())) {
throw new RuntimeException("邮件内容不能为空");
}
}
}
总结
以上代码可以直接复制进行使用,在进行配置时,需要避坑的是必须开启ssl配置,并且端口不能设置为25,具体原因请自行百度即可。开启ssl后,三个端口配置项必须一致,否则会报端口连接错误。
其次,在封装对象的过程中,from字段的值必须和配置的发件箱的发件人邮件地址保持一致,否则同样会报错。
联系客服