Spring Boot 中使用 SMTP 发送邮件的完整指南

在现代 Web 应用中,发送邮件是一项常见的需求,无论是用户注册确认、密码重置还是通知提醒,邮件功能都是不可或缺的。Spring Boot 提供了强大的支持,使得在应用中集成邮件发送功能变得非常简单。本文将详细介绍如何在 Spring Boot 项目中配置和使用 SMTP 发送邮件。

🌐 准备工作

1. 创建 Spring Boot 项目

你可以使用 Spring Initializr(https://start.spring.io/)快速创建一个新的 Spring Boot 项目。选择以下依赖:

  • Spring Web
  • Spring Mail

2. 添加依赖

pom.xml 文件中,确保添加了 spring-boot-starter-mail 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

🛠️ 配置 SMTP 服务器

1. application.properties 配置

application.properties 文件中添加 SMTP 服务器的相关配置。以下是一个示例配置,假设你使用的是 Gmail 的 SMTP 服务器:

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your-email@gmail.com
spring.mail.password=your-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

2. 配置类

你也可以通过创建一个配置类来管理邮件发送相关的配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@Configuration
public class MailConfig {

    @Bean
    public JavaMailSender getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);

        mailSender.setUsername("your-email@gmail.com");
        mailSender.setPassword("your-password");

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");

        return mailSender;
    }
}

📧 发送邮件

1. 创建邮件服务类

创建一个服务类来处理邮件发送逻辑:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class EmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendSimpleMessage(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        javaMailSender.send(message);
    }
}

2. 发送邮件示例

在控制器中调用 EmailService 来发送邮件:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @GetMapping("/send-email")
    public String sendEmail(@RequestParam String to, @RequestParam String subject, @RequestParam String text) {
        emailService.sendSimpleMessage(to, subject, text);
        return "Email sent successfully!";
    }
}

📚 发送带附件的邮件

1. 创建带附件的邮件服务类

修改 EmailService 类,添加发送带附件的邮件方法:

import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class EmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendSimpleMessage(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        javaMailSender.send(message);
    }

    public void sendEmailWithAttachment(String to, String subject, String text, String pathToAttachment) {
        MimeMessagePreparator preparator = mimeMessage -> {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(text);
            FileSystemResource file = new FileSystemResource(new File(pathToAttachment));
            helper.addAttachment("Invoice", file);
        };

        javaMailSender.send(preparator);
    }
}

2. 发送带附件的邮件示例

在控制器中调用 EmailService 来发送带附件的邮件:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @GetMapping("/send-email")
    public String sendEmail(@RequestParam String to, @RequestParam String subject, @RequestParam String text) {
        emailService.sendSimpleMessage(to, subject, text);
        return "Email sent successfully!";
    }

    @GetMapping("/send-email-with-attachment")
    public String sendEmailWithAttachment(@RequestParam String to, @RequestParam String subject, @RequestParam String text, @RequestParam String attachment) {
        emailService.sendEmailWithAttachment(to, subject, text, attachment);
        return "Email with attachment sent successfully!";
    }
}

🛑 常见问题及解决方案

问题1:邮件发送失败

解决方案

  • 检查配置:确保 application.properties 或配置类中的 SMTP 配置正确。
  • 检查网络:确保应用能够访问 SMTP 服务器。
  • 检查邮箱设置:对于 Gmail,确保开启了“允许不够安全的应用”访问权限。

问题2:邮件发送超时

解决方案

  • 增加超时时间:在 application.properties 中增加超时时间配置。
  spring.mail.properties.mail.smtp.timeout=30000
  spring.mail.properties.mail.smtp.connectiontimeout=30000
  spring.mail.properties.mail.smtp.writetimeout=30000

问题3:邮件内容乱码

解决方案

  • 设置字符编码:在发送邮件时设置字符编码为 UTF-8。
  message.setText(text, "UTF-8");

问题4:邮件发送成功但未收到

解决方案

  • 检查垃圾邮件箱:有时邮件会被自动归类到垃圾邮件箱。
  • 检查邮件地址:确保收件人地址正确无误。

🎓 结论

通过本文的介绍,你应该已经掌握了如何在 Spring Boot 项目中配置和使用 SMTP 发送邮件。无论是简单的文本邮件还是带附件的邮件,Spring Boot 都提供了强大的支持,帮助你轻松实现邮件发送功能。希望这些技巧能帮助你在实际开发中提升应用的用户体验!


如果你有任何疑问或需要进一步的帮助,请在评论区留言。期待与你交流!🌟

© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容