# mail
**Repository Path**: lovedstudy/mail
## Basic Information
- **Project Name**: mail
- **Description**: java实现邮件发送功能
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-21
- **Last Updated**: 2025-03-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 一、添加依赖
在`pom.xml`文件中添加发送邮件所需要使用的依赖
```xml
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-starter-freemarker
org.springframework.boot
spring-boot-starter-mail
```
### 二、 配置邮件相关参数(application.yml)
```yml
server:
port: 8080
spring:
mail:
host: smtp.**.com # 邮箱服务器
port: 25 # 邮箱服务器端口
username: 123456@123456.com # 发送人邮箱账号
password: 123456 # 邮箱对应的邮箱密码
default-encoding: UTF-8 # 默认编码
freemarker:
suffix: .ftl # 模板后缀
template-loader-path: classpath:/templates/ # 模板路径
```
### 三、邮件服务接口(MailService)
```java
/**
* @Author : lovedStudy
* @create 2025/3/21 11:16
*/
public interface MailService {
/**
* 发送简单邮件
* @param to 收件人地址
* @param subject 主题
* @param content 邮件内容
*/
void sendSimpleMail(String to, String subject, String content);
/**
* 发送HTML邮件
* @param to 收件人地址
* @param subject 主题
* @param htmlContent 邮件内容
*/
void sendHtmlMail(String to, String subject, String htmlContent);
/**
* 发送带附件的邮件
* @param to 收件人地址
* @param subject 主题
* @param content 邮件内容
* @param attachments 附件
*/
void sendAttachmentsMail(String to, String subject, String content, Map attachments );
/**
* 发送模板邮件
* @param to 收件人地址
* @param subject 主题
* @param templateName 模板名称
* @param model 模板参数
*/
public void sendTemplateMail(String to, String subject, String templateName, Map model) ;
}
```
### 邮件接口实现类
```java
/**
* @Author : lovedStudy
* @create 2025/3/21 11:18
*/
@Slf4j
@Service
public class MailServiceImpl implements MailService {
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender mailSender;
@Autowired
private Configuration freemarkerConfig;
@Override
public void sendSimpleMail(String to, String subject, String content) {
try {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom(from);
msg.setTo(to);
msg.setSubject(subject);
msg.setText(content);
mailSender.send(msg);
log.info("简单邮件发送成功");
} catch (MailException e) {
log.error("简单邮件发送失败",e);
throw new RuntimeException(e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String htmlContent) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(htmlContent, true);// true 表示文本以html格式显示
mailSender.send(mimeMessage);
log.info("html邮件发送成功");
} catch (Exception e) {
log.error("html邮件发送失败",e);
throw new RuntimeException(e);
}
}
@Override
public void sendAttachmentsMail(String to, String subject, String content, Map attachments) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true); // true 表示支持附件
helper.setFrom(from);// 发件人地址
helper.setTo(to);// 收件人地址
helper.setSubject(subject);// 邮件主题
helper.setText(content);// 邮件内容
for (Map.Entry entry : attachments.entrySet()) {
// 通过循环遍历Map中的键值对,将每个附件添加到邮件中
helper.addAttachment(entry.getKey(), new ByteArrayResource(entry.getValue()));
}
mailSender.send(message);
log.info("带附件的邮件发送成功");
} catch (MessagingException e) {
log.error("带附件的邮件发送失败",e);
throw new RuntimeException(e);
}
}
@Override
public void sendTemplateMail(String to, String subject, String templateName, Map model) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
// 使用Freemarker渲染模板
Template template = freemarkerConfig.getTemplate(templateName);
String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(htmlContent, true);
mailSender.send(message);
log.info("模板邮件发送成功");
} catch (Exception e) {
log.error("模板邮件发送失败", e);
throw new RuntimeException(e);
}
}
}
```
### 使用模版发送邮件时创建的模版
```html
${subject}
${subject}
亲爱的 ${name},
${content}
感谢您的支持!
```
### 四、单元测试
```java
@SpringBootTest
class DemoApplicationTests {
@Autowired
private MailService mailService;
@Test
void simpleMail() {
mailService.sendSimpleMail("12345678@qq.com","测试邮件","这是一份测试邮件!");
}
@Test
void htmlMail() {
String htmlContent = "你好,我是HTML邮件!
";
mailService.sendHtmlMail("12345678@qq.com","测试邮件",htmlContent);
}
@Test
void attachmentsMail() {
//附件
Map attachments = new HashMap<>();
attachments.put("test.txt", "这是一份测试txt文件".getBytes());
mailService.sendAttachmentsMail("12345678@qq.com","测试邮件","测试邮件",attachments);
}
@Test
void templateMail() {
Map model = new HashMap<>();
model.put("name", "张三");
model.put("subject", "入职邮件");
model.put("content", "欢迎欢迎,热烈欢迎!");
mailService.sendTemplateMail("12345678@qq.com","测试邮件", "register-template.ftl", model);
}
```
### 五、测试截图
(1)、简单邮件

(2)、html邮件

(3)、带附件的邮件

(4)、模版的方式发送邮件
