注意:
服务器需要打开994的端口。不然会超时。
第一步
引入依赖。
<!-- SpringBoot——邮件服务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
第二步
配置application.yml文件
spring:
##邮件服务
mail:
host: smtphz.qiye.163.com
username: 你的邮箱
password: 你的授权码
senderName: 你的邮箱
default-encoding: utf-8
properties:
mail:
smtp:
ssl:
enable: true
auth: true
port: 994
第三步
增加配置类。
package com.penghu.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author :Mall
*/
@Configuration
@Data
public class EmailConfig {
@Value("${spring.mail.senderName}")
private String senderName;
}
第四步
实现类。
package com.penghu.service.email;
import com.penghu.config.EmailConfig;
import com.penghu.dao.email.EmailSendlogMapper;
import com.penghu.entity.email.EmailSendlog;
import com.penghu.utils.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.time.Duration;
/**
* @author :Mall
* @description : 邮件发送服务层实现
*/
@Service
public class EmailService {
// 日志
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// Redis对象,主要用于保证幂等性
@Autowired
private StringRedisTemplate stringRedisTemplate;
// Email发送对象
@Resource
private JavaMailSender javaMailSender;
// template模板
@Autowired
private SpringTemplateEngine templateEngine;
// Email邮件配置
@Autowired
private EmailConfig emailConfig;
/**
* 发送普通文本内容
*
* @param to 发送给谁
* @param title 标题
* @param content 内容
* @param identity 唯一标识
* @return
*/
public Result<Object> sendText(String to, String title, String content, MultipartFile file, String identity) {
// 用redis的setNx操作,保证幂等性
Result<Object> result = new Result<Object>();
if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Text", to, Duration.ofMinutes(5))) {
EmailSendlog emailSendlog = new EmailSendlog();
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);
//邮件的标题
messageHelper.setSubject(title);
messageHelper.setFrom(emailConfig.getSenderName());
//邮件接收者(可发送多个)
String[] toArray = to.split("[,]");
messageHelper.setTo(toArray);
//邮件的内容,不是Html
messageHelper.setText(content, false);
//添加附件
if (file != null)
messageHelper.addAttachment(file.getOriginalFilename(), file);
javaMailSender.send(messageHelper.getMimeMessage());
logger.info(identity + ":" + to + "发送成功");
return result;
} catch (Exception e) {
logger.info(e.getMessage());
result.success("发送失败");
return result;
} finally {
// 发送成功后,删除key
stringRedisTemplate.delete(identity + "Text");
}
} else {
result.error("发送中,请稍后");
return result;
}
}
/**
* 发送Html内容
*
* @param to 发送给谁
* @param title 标题
* @param content 内容
* @param identity 唯一标识
* @return
*/
public Result<Object> sendHtml(String to, String title, String content, MultipartFile file, String identity) {
Result<Object> result = new Result<>();
// 用redis的setNx操作,保证幂等性
if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Html", to, Duration.ofMinutes(5))) {
EmailSendlog emailSendlog = new EmailSendlog();
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);
//邮件的标题
messageHelper.setSubject(title);
messageHelper.setFrom(emailConfig.getSenderName());
//邮件接收者(可发送多个)
String[] toArray = to.split("[,]");
messageHelper.setTo(toArray);
//邮件的内容
messageHelper.setText(content, true);
//添加附件
if (file != null) {
messageHelper.addAttachment(file.getOriginalFilename(), file);
}
javaMailSender.send(messageHelper.getMimeMessage());
logger.info(identity + ":" + to + "发送成功");
result.success("发送成功");
return result;
} catch (Exception e) {
e.printStackTrace();
logger.info(e.getMessage());
result.success("发送失败");
return result;
} finally {
// 发送成功后,删除key
stringRedisTemplate.delete(identity + "Html");
}
} else {
result.success("发送中,请稍后");
return result;
}
}
/**
* 发送模板1内容
*
* @param to 发送给谁
* @param title 标题
* @param content 内容
* @param identity 唯一标识
* @return
*/
public Result<Object> sendTemplate1(String to, String title, String content, MultipartFile file, String identity) {
Result<Object> result = new Result<>();
// 用redis的setNx操作,保证幂等性
if (stringRedisTemplate.opsForValue().setIfAbsent(identity + "Html", to, Duration.ofMinutes(5))) {
EmailSendlog emailSendlog = new EmailSendlog();
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, file != null);
//邮件的标题
messageHelper.setSubject(title);
messageHelper.setFrom(emailConfig.getSenderName());
//邮件接收者(可发送多个)
String[] toArray = to.split("[,]");
messageHelper.setTo(toArray);
//邮件的内容,利用 Thymeleaf 模板构建 html 文本
Context ctx = new Context();
ctx.setVariable("title", title);
ctx.setVariable("content", content);
String emailText = templateEngine.process("template1", ctx);
//发送内容
messageHelper.setText(emailText, true);
//添加附件
if (file != null) {
messageHelper.addAttachment(file.getOriginalFilename(), file);
}
javaMailSender.send(messageHelper.getMimeMessage());
logger.info(identity + ":" + to + "发送成功");
result.success("发送成功");
return result;
} catch (Exception e) {
logger.info(e.getMessage());
result.success("发送失败");
return result;
} finally {
// 发送成功后,删除key
stringRedisTemplate.delete(identity + "Html");
}
} else {
result.success("发送中,请稍后");
return result;
}
}
}