# 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)、简单邮件 ![simpleMail](https://s21.ax1x.com/2025/03/21/pEwzzS1.jpg) (2)、html邮件 ![htmlMail](https://s21.ax1x.com/2025/03/21/pE0SSQx.jpg) (3)、带附件的邮件 ![附件邮件](https://s21.ax1x.com/2025/03/21/pE0Spy6.jpg) (4)、模版的方式发送邮件 ![templateMail](https://s21.ax1x.com/2025/03/21/pE0S9OK.jpg)