Spring Boot发送邮件

在现代的互联网应用中,发送电子邮件是一项常见的功能需求。Spring Boot提供了简单且强大的邮件发送功能,使得在应用中集成邮件发送变得非常容易。本文将介绍如何在Spring Boot中发送电子邮件,并提供一个完整的示例。

1. 准备工作

在开始之前,我们需要确保已经配置好了以下两项准备工作:

  1. 一个有效的邮件服务器及其连接信息,包括SMTP主机名、端口号、用户名和密码。你可以使用自己的邮件服务器或者使用第三方邮件服务提供商(如Gmail、SendGrid等)。
  2. 一个已经搭建好的Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来快速创建一个新的Spring Boot项目,确保项目中包含所需的基本依赖。

2. 添加依赖

首先,在你的Spring Boot项目的pom.xml文件中添加以下Maven依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

这将在你的项目中引入Spring Boot的邮件发送功能所需的所有依赖。

3. 配置邮件服务器信息

接下来,我们需要在Spring Boot的配置文件中配置邮件服务器的连接信息。在application.properties(或application.yml)文件中添加以下属性:

properties 复制代码
spring.mail.host=your_smtp_host
spring.mail.port=your_smtp_port
spring.mail.username=your_username
spring.mail.password=your_password
spring.mail.properties.mail.smtp.auth=true

确保将上述属性值替换为你实际的邮件服务器连接信息。

4. 创建邮件发送服务

现在,我们可以创建一个邮件发送服务类,该类将使用Spring Boot提供的JavaMailSender来发送邮件。在你的项目中创建一个名为EmailService的新类,并在其中添加以下代码:

java 复制代码
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 {

    private JavaMailSender javaMailSender;

    @Autowired
    public EmailService(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

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

在上述代码中,我们使用JavaMailSender来创建一个邮件消息对象SimpleMailMessage,并设置收件人、主题和内容。最后,我们通过调用javaMailSender.send(message)来发送邮件。

5. 使用邮件发送服务

现在,我们可以在需要发送邮件的地方使用EmailService。例如,在一个Spring Boot的控制器中,你可以注入EmailService并调用其sendEmail方法来发送邮件。以下是一个示例:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    private EmailService emailService;

    @Autowired
    public EmailController(EmailService emailService) {
        this.emailService = emailService;
    }

    @GetMapping("/sendEmail")
    public String sendEmail() {
        String to = "recipient@example.com";
        String subject = "Test Email";
        String text = "This is a test email.";
        emailService.sendEmail(to, subject, text);
        return "Email sent successfully.";
    }
}

在上述示例中,我们创建了一个EmailController控制器,并注入了EmailService。在sendEmail方法中,我们指定了收件人地址、邮件主题和内容,并调用emailService.sendEmail方法发送邮件。

6. 运行测试

现在,你可以启动你的Spring Boot应用程序,并向/sendEmail端点发出GET请求来测试邮件发送功能。如果一切正常,你应该会在日志输出中看到邮件发送成功的消息。

注意:在测试邮件发送功能时,请确保邮件服务器的连接信息和收件人地址是正确的,以避免错误发送邮件。

7. 常见错误

7.1 553 Mail from must equal authorized user

复制代码
553 Mail from must equal authorized user  
com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user  
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333)  
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:906)  
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:535)  
    at com.you.mail.model.SendMessage.sendMessage(SendMessage.java:71)  
    at com.you.mail.model.SendMessage.main(SendMessage.java:89)  
    
Exception in thread "main" com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user  
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333)  
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:906)  
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:535)  
    at com.you.mail.model.SendMessage.sendMessage(SendMessage.java:71)  
    at com.you.mail.model.SendMessage.main(SendMessage.java:89)  

网上看到的结果是增加属性,但我这边测试没通过

复制代码
spring:
  boot:
    admin:
      notify:
        mail:
          from: ${spring.mail.username}

后面增加了个传参解决的,要和username的值一样才行

java 复制代码
    public void sendEmail(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        message.setForm("your_username");
        javaMailSender.send(message);
    }

7.2 SmtpClientAuthentication is disabled for the Tenant.

复制代码
SmtpClientAuthentication is disabled for the Tenant. Visit https://aka.ms/smtp_auth_disabled for more information.

我这边用的是office365的邮箱,这边需要管理员开通相关的第三方客户端发送smtp的权限.

总结

本文介绍了如何在Spring Boot中发送电子邮件。我们首先准备了所需的工作,包括配置邮件服务器信息和创建Spring Boot项目。然后,我们添加了所需的Maven依赖项,并创建了一个邮件发送服务类。最后,我们在控制器中使用邮件发送服务来发送邮件,并进行了功能测试。

Spring Boot使得在应用中集成邮件发送变得非常简单,开发人员只需几行代码就能实现这一功能。希望本文对你理解和使用Spring Boot发送邮件有所帮助!

相关推荐
想躺平的咸鱼干1 分钟前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying28 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·37 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草1 小时前
关于SpringMVC的整理
spring
Bug退退退1232 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠2 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.2 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥2 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人2 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试