メール送信

メール送信機能

Webアプリケーションで会員登録完了時やパスワードリセット時などの際にメールを送信するといった機能がよく利用されています。
Springでも、メールを作成~送信するまでの機能が備わっているので、簡単に実装することができます。

フォームに入力した内容がメール送信されるように実装していきます。

<入力画面>

<送信されたメール>

メール送信機能の実装準備

Gmailの設定

まずGoogleの2段階認証プロセスを有効にする必要があります。有効にする方法については下記のサイトを参考にしてください。
2 段階認証プロセスを有効にする – パソコン – Google アカウント ヘルプ

2段階認証プロセスを有効にしたら、次にアプリパスワードを発行します。
Googleアカウントを開き、セキュリティ > 2段階認証プロセス > アプリ パスワード

上記で開けない場合は、以下のURLへ直にアクセスしてください。
https://myaccount.google.com/apppasswords

アプリ名は自分で分かれば何でも良いです。
生成したパスワードは次で使用するので、コピーしておいてください。


application.propertiesを開き、下記の内容を追記してください。
ここに記載したメール送信先・SMTPサーバの情報を元に、メール送信が実行されます。
()で記載している個所は、()ごと自分のものに置き換えてください。
【/src/main/resources/application.properties】

#### Mail設定
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=(自分のGmailアドレス)
spring.mail.password=(パスワード)
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

上から順に、
host:ホストアドレス、port:ポート番号、username:ユーザーID、password:パスワード
properties.mail.smtp.auth:認証有無、properties.mail.smtp.starttls.enable:TLS保護された接続かどうか

pom.xml

Spring Bootでメール送信機能を導入するには、Maven依存関係として下記のspring-boot-starter-mailを導入します。
プロジェクト直下のpom.xml<dependencies>タグ内に記述してください。

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

入力が完了したら、プロジェクトを更新します。
(Spring Bootアプリケーションを実行中の場合は終了させてから、
プロジェクト名を右クリック>Maven>プロジェクトの更新 をクリック)

メール送信機能の実装

ここでは、HTML(thymeleaf)をテンプレートとしてメール文面を生成する方法を学習します。
HTMLを使用するので、CSSで装飾することも可能です。

メール送信画面

【src/main/resources/templates/mail/index.html】

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta content="text/html" charset="UTF-8">
	<title>メール送信</title>
	<style>
		label {
			display: block;
		}
		.formBlock {
			background-color: #FCFCEF;
			max-width: 800px;
			padding: 15px;
		}
		.formBlock_part {
			display: block;
			margin: 10px 0px;
		}
		.messageBlock_text {
			font-weight: 700;
		}
	</style>
</head>
<body>
	<h1>メール送信フォーム</h1>
	<div class="formBlock">
		<h2>アンケート</h2>
		<form method="POST" th:action="@{/mail/send}">
			<label>名前:
				<input class="formBlock_part" type="text" name="name" value="名前">
			</label>
			<label>自由入力欄:
				<textarea class="formBlock_part" name="content" cols="50" rows="4">アンケート回答内容サンプル</textarea>
			</label>
			<input class="formBlock_part" type="submit" value="メール送信">
		</form>
	</div>
	<div th:if="${successMessage}" class="messageBlock"><!-- 完了メッセージ -->
		<p th:text="${successMessage}" class="messageBlock_text"></p>
	</div>
</body>

メール送信画面として送信フォームを設置しています。
メール送信が完了したらこの画面にリダイレクトし、完了メッセージが出力されるようになっています。

メール本文用のHTMLファイル(thymeleaf)の作成

このファイルをテンプレートとしてController側で読み込み、HTMLメールを作成します。
【src/main/resources/templates/mail/send.html】

<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />
	<title>メール送信</title>
	<style>
		h1 {
			font-size: 20px;
			text-decoration: underline;
		}
		p {
			font-size: 16px;
		}
	</style>
</head>
<body>
	<div>
		<h1 th:text="${name} + ' 様'"></h1>
		<p>ご記載いただいたアンケート内容をお送りいたします。</p>
		<p>---------------<br>
			<span th:utext="${content}"></span><br><!--/* th:utextはHTMLタグをエスケープせずにHTMLタグとして認識させる */-->
			---------------
		</p>
		<p>ご回答ありがとうございました。</p>
	</div> 
</body>

通常のthymeleafの書き方と同様に、th:textで変数を組み込んでいます。
自由記入欄については、改行を活かすためにth:utextを使用しています。

Controllerでメールを送信

メール送信する方法や機能はいくつかありますが、ここではJavaMailSenderを使用します。
JavaMailSender (Spring Framework API) – Javadoc

その他、使用するクラスやインターフェースが様々にありますが、コード内に説明を記述しております。
全体の流れとしては、「入力画面から受け取ったパラメータをthymeleafファイルに埋め込み、生成したHTMLメールを送信する」といったところです。

package com.cmps.spring.controller;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import jakarta.mail.internet.MimeMessage;

@RequestMapping("/mail")
@Controller
public class MailSendController {

	@Autowired
	private JavaMailSender javaMailSender;

	/**
	 * メール送信フォーム初期表示画面
	 * @param model Model
	 * @param successMessage String 完了メッセージ
	 * @return
	 */
	@GetMapping("")
	public String index(Model model,
			@ModelAttribute("successMessage") String successMessage) {
		return "mail/index";
	}

	 /**
	 * メール送信機能
	 * @param model Model
	 * @param name String
	 * @param content String
	 * @param redirectAttributes RedirectAttributes
	 * @return
	 */
	@PostMapping("/send")
	public String send(Model model,
			@RequestParam(required = false) String name,
			@RequestParam(required = false) String content,
			RedirectAttributes redirectAttributes) {

		// テンプレートエンジンを利用するのに必要なSpringTemplateEngineとClassLoaderTemplateResolverを用意
		SpringTemplateEngine engine = new SpringTemplateEngine();
		ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
		templateResolver.setCharacterEncoding("UTF-8");//エンコーディング設定
		engine.setTemplateResolver(templateResolver);

		//Thymelaefに渡す変数はMapにして準備
		Map<String, Object> datas = new HashMap<>();//contextに渡せる型はMap<String, Object>なので合わせている
		datas.put("name", name);
		datas.put("content", content.replace("\n", "<br>"));//改行コードを改行タグに変換
		//Contextに変換
		Context context = new Context();
		context.setVariables(datas);
		
		//HTMLの生成:thymeleafテンプレートの指定、Context(≒オブジェクトのイメージ)の挿入
		String htmlBody = engine.process("/templates/mail/send.html", context);


		try {
			//メール内容の組み立て
			MimeMessage mimeMessage = this.javaMailSender.createMimeMessage();
			final MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());//第2引数:マルチパート指定、第3引数でエンコーディング指定
			helper.setTo("abc.cmps@gmail.com");			//メール宛先
			helper.setSubject("テンプレートメール送信テスト");	//メール件名
			helper.setText(htmlBody, true);// 第2引数はHTMLメールとして送信する場合にtrue
			
			//メール送信
			this.javaMailSender.send(mimeMessage);

			// フラッシュメッセージをredirectAttributesに登録
			redirectAttributes.addFlashAttribute("successMessage", "メールの送信が完了しました。");
		} catch (Exception e) {
			e.getStackTrace();
			// フラッシュメッセージをredirectAttributesに登録
			redirectAttributes.addFlashAttribute("successMessage", "メールの送信に失敗しました。");
		}
		
		return "redirect:/mail";
	}
}

☆ソースコード内ではメール送信元・宛先アドレスは適当な値にしていますので、自身のアドレスに置き替えてください。

初期表示画面の”/mail”にアクセスし、メール送信されるか確認しましょう!

参考:
SpringBoot Thymeleaf メール送信 HTML TEXT 両対応 multipart – しすろぐ
SpringBootでメール送信(添付ファイルあり/なし) – Qiita

MimeMessageHelper (Spring Framework API) – Javadoc
SpringTemplateEngine (thymeleaf-spring5 3.0.9.RELEASE API)
ClassLoaderTemplateResolver (thymeleaf 3.0.0.BETA01 API)
Context (thymeleaf 3.0.0.BETA03 API)

練習問題

問1: マニュアルのコードを下記に従って改変してください。
・フォームにメールアドレスの入力欄を追加
・送信宛先をフォームから入力されたメールアドレスにする
・送信メール本文にフォームから入力されたメールアドレスが表示されるようにする。

タイトルとURLをコピーしました