Spring BootでHTMLメールを送信する方法

先日Spring Mail(MailSenderクラス)を使用してメール送信する記事を書きましたが、Spring MailではHTMLメールを送信することが出来ません。

Spring Boot で簡単に Gmail からメールを送る方法
Spring Boot のライブラリ Spring Mail を使って Gmailからメールが送付できました。Spring Mailの扱い方...

ですので、HTMLメールを送信したいときにはJavaメール(JavaMailSenderクラス)を使用します。HTMLメールであれば本文に画像を張り付けることや、リンク付きのボタンを載せることが出来ます。

今回はSpring BootでJavaメールを使用して、画像とリンクを含むHTMLメールを送信する方法をご紹介します。

pom.xml

まずはライブラリをダウンロードして使用する設定です。Spring Mail を使用したときにpom.xmlに記載した内容と同様です。

pom.xml – 抜粋
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

メール情報設定

コントローラーのソースコードです。今回はコントローラーに、送信するメールの情報を設定する処理を記載します。下記のサンプルでは宛先1つで設定していますが、複数の宛先にメール送信したい場合には String[] で宛先を設定します。

このようにして設定した情報をメール送信処理に渡します。

コントローラーのソースコード – 抜粋
@PostMapping(value = "/sendTestMail")
@ResponseBody
public boolean sendTestMail() {

  Map<String, String> sendMailInfo = new HashMap<String, String>();
  sendMailInfo.put("toName", "宛先の名前");
  sendMailInfo.put("toAddress","宛先のメールアドレス");
  sendMailInfo.put("subject", "メールのタイトル");
  sendMailInfo.put("link", "メール本文のリンク先アドレス");

  return mailService.sendTestMail(sendMailInfo);
}

メール送信処理

設定した情報をもとにメール処理を組みます。

MailService.java
package com.example.app.service;

import java.io.IOException;
import java.util.Map;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

@Service
public class MailService {

  @Autowired
  private JavaMailSender javaMailSender;

  @Autowired
  ResourceLoader resourceLoader;

  public boolean sendTestMail(Map<String, String> sendMailInfo) {

    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = null;

    try {
      helper = new MimeMessageHelper(message, true);
      helper.setFrom(sendMailInfo.get("fromAddress"));
      helper.setTo(sendMailInfo.get("toAddress"));
      helper.setSubject("[" + sendMailInfo.get("action") + "] " + sendMailInfo.get("subject"));

      String insertMessage = "<html>"
          + "<head></head>"
          + "<body>"
          + "<h3>Hello " + sendMailInfo.get("toName") + "</h3>"
          + "<p><a href='" + sendMailInfo.get("link") + "'><img src='cid:logo'></a></p>"
          + "</body>"
          + "</html>";

      helper.setText(insertMessage, true);

      Resource resourceLogo = resourceLoader.getResource("classpath:static/images/logo.png");
      helper.addInline("logo", new FileSystemResource(resourceLogo.getFile()));

      javaMailSender.send(message);

    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }

    return true;
  }

}

application.properties

最低限の設定は次のとおりです。localhostの部分はメールサーバーのアドレスにします。

application.properties – 抜粋
spring.mail.host=localhost
spring.mail.port=25

これで画像とリンクを含むHTMLメールを送信することが出来ます。

参考

org.springframework.mail.javamail JavaMailSender – spring.pleiades.io