【Spring Boot】Java Mail SenderとMailpitでメール送信機能を実装
今回は社内向けに作成したSpring Bootの研修内容から一部を抜粋、変更してJava Mail SenderとMailpitを利用したシンプルなメール送信機能の実装・動作確認方法を紹介します。
環境
- Java: 21.0.3- Spring Boot: 3.3.0
- Gradle: 8.8
- Docker: 24.0.6
- Docker Compose: 2.22.0
セットアップ
Spring Initializrを使用してプロジェクトを作成しました。以下の設定を行います。
- Project: Gradle - Groovy
- Language: Java
- Spring Boot: 3.3.0
- Java: 21
- Dependencies:
- Java Mail Sender
build.gradleの設定の確認
Spring Initializrを使用して生成された build.gradle には以下の依存関係が含まれていることを確認します。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
application.propertiesの設定
src/main/resources/application.properties に以下の設定を追加します。
server.port=8080
spring.mail.host=mailpit
spring.mail.port=1025
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=false
spring.mail.properties.mail.smtp.starttls.enable=false
Mialpitを使用してローカルでメールを送信するための設定を行なっています。
今回の研修環境では設定を簡略化し、迅速にメール送信機能をテストできるようにするためにSMTP認証とSTARTTLSを無効にしています。
compose.yamlの作成
プロジェクトのルートディレクトリに以下のように compose.yaml ファイルを作成します。
services:
app:
image: eclipse-temurin:21
ports:
- "8080:8080"
volumes:
- .:/app
working_dir: /app
command: sh -c './gradlew bootRun'
environment:
SPRING_MAIL_HOST: mailpit
SPRING_MAIL_PORT: 1025
mailpit:
image: axllent/mailpit
ports:
- "8025:8025"
- "1025:1025"
Spring Bootアプリケーションを実行するためのappサービスとMailpitを実行するためのmailpitサービスを定義しています。
appサービスでは gradlew bootRun コマンドを使用してSpring Bootアプリケーションを起動し、メール送信機能を利用するためにMailpitのホストとポートを環境変数で設定しています。
mailpitサービスではSMTPサーバーとしてポート1025を、Webインターフェースとしてポート8025を公開しています。
サービスの実装
EmailService を以下の内容で作成します。
package com.example.demo.service;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class EmailService {
private final JavaMailSender mailSender;
public EmailService(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void sendMail(
String subject,
String text,
String to,
String from
) {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject(subject);
message.setText(text);
message.setTo(to);
message.setFrom(from);
mailSender.send(message);
}
}
JavaMailSenderを使用してシンプルなメールを送信するメソッドを実装しています。
メールの件名、本文、送信先、送信元をパラメータとして受け取り、 SimpleMailMessage オブジェクトを作成して送信します。
コントローラーの実装
EmailController を以下の内容で作成します。
package com.example.demo.controller;
import com.example.demo.service.EmailService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EmailController {
private final EmailService emailService;
public EmailController(EmailService emailService) {
this.emailService = emailService;
}
@GetMapping("/")
public String sendEmail() {
emailService.sendMail(
"タイトル",
"本文",
"to@example.com",
"system@example.com"
);
return "Eメールを送信しました";
}
}
注意: 本番環境ではGETエンドポイントでメールを送信するのはセキュリティ上のリスクが高いため、あくまでローカルでの検証目的のコードです。
アプリケーションの起動
1. 以下のコマンドを実行して、Docker Composeを使用してサービスを起動します。
docker compose up --build
2. ブラウザで http://localhost:8080 にアクセスします。正しく動作していれば、「Eメールを送信しました」というメッセージが表示されます。
3. ブラウザで http://localhost:8025 にアクセスして、MailpitのWebインターフェースで送信されたメールが届いていることを確認します。
まとめ
以上の手順で、Spring Bootを使用してJava Mail SenderとMailpitを利用したメール送信機能を実装する方法を紹介しました。今回の設定では、開発環境で迅速かつ簡単にメール送信機能をテストできるように、シンプルな設定を使用しています。
Mailpitを使用することで、ローカルでメール送信の動作確認が簡単に行えるため、開発効率が向上します。この設定は紹介用に簡略化していますが、実際の開発では適宜環境に応じた設定を行ってください。
本記事が、Spring Bootを使ったメール送信機能の実装の参考になれば幸いです。