ZetCode

Spring Boot 发送电子邮件

最后修改于 2023 年 7 月 28 日

在本文中,我们将展示如何在 Spring Boot 应用程序中发送电子邮件。 我们使用 Mailtrap 服务。

Spring 是一个流行的 Java 应用程序框架,而 Spring Boot 是 Spring 的一个演进,它有助于轻松创建独立的、生产级别的基于 Spring 的应用程序。

Spring Boot 电子邮件示例

在下面的示例中,我们创建一个将电子邮件发送到 Mailtrap 帐户的应用程序。 如果我们没有帐户,我们需要注册一个帐户。 注册过程非常简单快捷。 免费套餐每月可以发送 500 封电子邮件。

注意: Gmail 不适合测试应用程序。我们应该使用 Mailtrap 或 Mailgun 等在线服务,或者使用网络托管公司提供的 SMTP 服务器。

该应用程序具有一个发送电子邮件的 Web 界面。 此外,可以从测试中发送电子邮件。

build.gradle
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           ├───controller
│   │           │       MyController.java
│   │           └───service
│   │                   EmailService.java
│   └───resources
│       │   application.properties
│       ├───static
│       │       index.html
│       └───templates
│               emailsent.ftlh
└───test
    └───java
        └───com
            └───zetcode
                    SendEmailApplicationTest.java

这是 Spring Boot 应用程序的项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-freemarker'
    implementation 'org.springframework.boot:spring-boot-starter-mail'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

我们在 build.gradle 中有项目依赖项。 对于电子邮件,我们需要声明 spring-boot-starter-mail

resources/application.properties
spring.main.banner-mode=off

spring.mail.protocol=smtp
spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525
spring.mail.username=-mailtrapusername-
spring.mail.password=-mailtrappasswd-
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.starttls.enable = true

我们为 Mailtrap 配置电子邮件设置。 这些详细信息在我们的 Mailtrap 帐户中提供。

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import com.zetcode.service.EmailService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    private final EmailService emailService;

    public MyController(EmailService emailService) {
        this.emailService = emailService;
    }

    @GetMapping(value = "/sendmail")
    public String sendmail() {

        emailService.sendMail("kate@example.com", "Test Subject", "Test mail");

        return "emailsent";
    }
}

控制器包含一个发送电子邮件的映射。

com/zetcode/service/EmailService.java
package com.zetcode.service;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class EmailService {

    private JavaMailSender javaMailSender;

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

    public void sendMail(String toEmail, String subject, String message) {

        var mailMessage = new SimpleMailMessage();

        mailMessage.setTo(toEmail);
        mailMessage.setSubject(subject);
        mailMessage.setText(message);

        mailMessage.setFrom("johndoe@example.com");

        javaMailSender.send(mailMessage);
    }
}

电子邮件服务使用 JavaMailSenderSimpleMailMessage 发送简单的电子邮件。

resources/static/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<a href="sendmail">Send mail</a>

</body>
</html>

index.html 文件是主页。 它包含一个发送电子邮件的锚点。

resources/templates/emailsent.ftlh
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Email sent</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<p>
Email was sent
</p>

</body>
</html>

该模板包含一条简单的消息,该消息在成功发送电子邮件后显示。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application  {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Application 是设置 Spring Boot 应用程序的入口点。

com/zetcode/SendEmailApplicationTest.java
package com.zetcode;

import com.zetcode.service.EmailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SendEmailApplicationTest {

    @Autowired
    private EmailService emailService;

    @Test
    public void testEmail() {
        emailService.sendMail("frank23@example.com", "Test subject", "Test mail");
    }
}

这是发送电子邮件的测试。

$ ./gradlew bootRun

运行应用程序后,我们可以导航到 localhost:8080

在本文中,我们展示了如何在 Spring Boot 中发送电子邮件。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程