今回はFreeMarkerを用いて、メール用の本文テキストを作成する手順を公開したいと思います。
メール自体の送信は「spring boot メール 送信」などで検索すればすぐに解決するため省略します。spring-boot-starter-mailを依存関係に追加すればすぐ出来ます。
Spring Bootで使われるテンプレートエンジンといえばThymeleafですが、現状ではHTMLに特化しており、メール用には向いていなかったため諦めました。(プレーンテキストを出力するためには、Thymeleafバージョン3.0以上が必須です。spring-boot-starter-thymeleafを使用している場合はデフォルトで2系が使用されるため、3系を使うためには明示的なバージョン指定が必要になります。既存のHTMLにも影響があるため今回は見送りました)
あと、HTMLでth:removeとか使って頑張ってごにょごにょしたら文字化けしたりして大変でした。
環境
・Spring Boot / 1.5.8.RELEASE
・Java / 1.8.0_151
・STS / 3.9.0.RELEASE
・Maven / 3.3.9
手順
Mavenに依存関係を追加
pom.xmlのdependenciesに、以下を追加します。
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> |
メールテンプレートの作成
src/main/resources直下に、test.ftlという名前で作成します。
${}で囲った変数の中身がそのまま表示されます。
リストをループする場合は<#list リスト名 as 変数>とします。タグ内の変数のみ${}で囲います。
1 2 3 4 5 | ${testTitle} <#list testMemberList as member> ${member} </#list> |
サービスクラスの作成
MailTemplateServiceという名前でサービスクラスを作成します。
ハッシュマップを作成して、指定したテンプレートに詰めてるだけなので直感的に理解できると思います。
model.putのところは、Thymeleafでいうmodel.addAttributeと同じだと考えればokです。
実際に使う際は、テンプレートに埋め込むものを引数に取って外から渡すようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | @Service public class MailTemplateService { @Autowired private Configuration freemarkerConfig; private String mergeTemplate() throws IOException, TemplateException { List<String> memberList = new ArrayList<String>(); memberList.add("高海 千歌"); memberList.add("渡辺 曜"); memberList.add("桜内 梨子"); Map<String, Object> model = new HashMap(); model.put("testTitle", "浦の星女学院スクールアイドルAqours 2年生一覧"); model.put("testMemberList", memberList); freemarkerConfig.setClassForTemplateLoading(this.getClass(), "/"); Template t = freemarkerConfig.getTemplate("test.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(t, model); return text; } } |
実行結果
MailTemplateServiceをコントローラでAutowiredしてmergeTemplate()すると以下の文字列が返ってきます。あとはこれをJavaMailSenderとかでセットしてあげればokです。
1 2 3 4 5 | 浦の星女学院スクールアイドルAqours 2年生一覧 高海 千歌 渡辺 曜 桜内 梨子 |
最後に
Velocityとかいうのも試してみたんですが、なんかBeanをconfigurationしてねとか言われてだるかったのでやめました。
FreeMarkerは依存関係を追加するだけでサクッと使えるのでとても重宝しています。
Thymeleafの方が日本語の情報は多いため、3系が使える方はそっちを使ってもいいと思います。ただ、プレーンテキストの出力方法については現時点で英語しか情報源はなさそうです。