在现有项目中有使用到邮件服务,所有在空闲之余,将邮件模块独立出来。
需要pom对邮件的jar依赖。
<!-- 邮件发送 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
邮件的发送发配置,这一块的配置根据实际情况可独立写到一个单独的配置文件上mail.yml,后期方便维护配置
spring:
mail:
host: 你的邮件服务
username: 发送方的邮箱
password: 邮箱的授权密码
port: 465 # 这个端口根据实际情况配置,一般都是465
protocol: smtp # 这里应该是不用改的,我没试过其他的配置
test-connection: false
default-encoding: UTF-8
properties:
mail:
debug: true
smtp:
auth: true
connectiontimeout: 10000
timeout: 10000
writetimeout: 10000
socketFactory:
class: javax.net.ssl.SSLSocketFactory
port: 465
starttls:
enable: true
required: true
邮件发送的逻辑代码
/**
* 邮件发送
* @author tanzhiming
* @version
*/
@Slf4j
@Service("sendMailService")
public class SendMailServiceImpl implements SendMailService {
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@Async
@Override
public void sendMail(Send2EmailDTO send2EmailDTO) {
log.info("开始向邮箱【{}】发送邮件", send2EmailDTO.getTo());
Date date = new Date();
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = null;
List<String> delPaths = new ArrayList<>();
try {
mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
String nick = "";
try {
// 使用邮箱别名
nick = javax.mail.internet.MimeUtility.encodeText(MailsmsBusiApiConstant.EMAIL_NICK_NAME);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
mimeMessageHelper.setFrom(new InternetAddress(nick + "<" + from + ">"));
mimeMessageHelper.setTo(send2EmailDTO.getTo());
mimeMessageHelper.setSubject(send2EmailDTO.getSubject());
mimeMessageHelper.setText(send2EmailDTO.getText(), true);
List<EmailAnnex> emailAnnexList = new ArrayList<>();
for (String filePath : send2EmailDTO.getOssFilePath()) {
String fileName = UUID.randomUUID().toString().replace("-", "");
String pathname = tempFilePath + fileName;
// 下载文件至本都服务路径
FileUtils.downloadFromUrl(filePath, pathname); // 请参考 (https://blog.csdn.net/tanzhming/article/details/103803952)
// 邮件附件
File file = new File(pathname);
FileSystemResource fileSystemResource = new FileSystemResource(file);
mimeMessageHelper.addAttachment(file.getName(), fileSystemResource);
delPaths.add(pathname);
}
// 发送邮件
mailSender.send(mimeMessage);
delPaths.forEach(s -> {
// 删除文件
FileUtils.del(s);
});
} catch (SMTPAddressFailedException e) {
log.error("邮件发送失败,邮箱地址错误,检查邮箱输入是否有误 ex={}", e.getMessage(), e);
} catch (MessagingException e) {
log.error("邮件发送失败 ex={}", e.getMessage(), e);
}
log.info("邮件发送成功");
}
}
Send2EmailDTO .java
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.Map;
/**
* @desc 发送邮件
* @com
* @Author tanzhiming(Jruoning) 2019/11/12 15:29
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Send2EmailDTO {
/** 邮件主题 */
@NotNull(message = "邮件主题不能为空")
private String subject;
/** 接收邮箱 */
@NotNull(message = "收件邮箱不能为空")
private String to;
/** 收件人名称 */
private String toName;
/** oss的文件访问路径(邮件附件) */
private String[] ossFilePath;
/** 邮件正文 */
private String text;
/** 操作用户id */
@NotNull(message = "操作用户id不能为空")
private String currentUserId;
/** 操作用户名称 */
@NotNull(message = "操作用户名称不能为空")
private String currentUserName;
}
实际项目中,在发送邮件的过程中会记录邮件发送记录及邮件附件等信息,这里呢我就没有把代码贴出来了,根据需要,自行添加。
来源:CSDN
作者:简若宁
链接:https://blog.csdn.net/tanzhming/article/details/103804201