SpringBootでメール送信（添付ファイルあり／なし）

#環境
- java 1.8
- spring boot 2.3.0
- spring-boot-starter-mail-2.3.0

#Maven依存関係
Mavenに必要な依存関係として以下を追加します。

```pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
```
#SMTPサーバ接続情報
メール送信先となるSMTPサーバの情報をapplication.propertiesに追加します。
以下は参考ですので、ご自身の使用するサーバの情報に合わせて指定してください。
※gmailで使用する場合にはgoogleの二段階認証があるためひと癖あるようです。

```application.properties
#ホストアドレス
spring.mail.host=smtp.test.co.jp
#ポート番号
spring.mail.port=587
#ユーザID
spring.mail.username=user
#パスワード
spring.mail.password=password
#認証有無
spring.mail.properties.mail.smtp.auth=true
#TLS保護された接続
spring.mail.properties.mail.smtp.starttls.enable=true
```


#メールを送るためのクラス
メールに添付ファイルを付けるかでどちらかを選択します。

| 目的                  | メッセージクラス       | 送信クラス          |
|:---------------------|:----------------------|:-------------------|
| 単純なテキストメール   | SimpleMailMessage[^1] | MailSender[^2]     |
| 添付ファイル付きメール | MimeMessage[^3]       | JavaMailSender[^4] |

**メッセージクラス**に宛先や表題、本文、添付ファイルなどのメッセージ情報をセットし、
**送信クラス**のsendメソッドで送信をリクエストします。


##単純なテキストメール
**SimpleMailMessage**にメッセージ情報をセットし、**MailSender**で送信します。

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;


@Service
public class MailService {

	/** メール送信クラス */
	@Autowired
	MailSender mailSender;

	/**
	 * メール送信
	 * 
	 * @throws MailException
	 */
	public void sendMail() throws MailException {

		// メッセージクラス生成
		SimpleMailMessage simpleMsg = new SimpleMailMessage();

		// 送信元アドレスをセット
		simpleMsg.setFrom("from@test.co.jp");
		// 送信先アドレスをセット
		simpleMsg.setTo("to@test.co.jp");
		// 表題をセット
		simpleMsg.setSubject("メールタイトル");
		// 本文をセット
		simpleMsg.setText("メール本文");

		// メール送信
		mailSender.send(simpleMsg);
		
	}
}
```
##添付ファイル付きメール
**MimeMessage**にメッセージ情報をセットし、**JavaMailSender**で送信します。
これによりメールはテキストではなくHTMLメールとして扱われます。

```java
import javax.mail.internet.MimeMessage;

import javax.mail.MessagingException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;


@Service
public class MailService {

	/** メール送信クラス */
	@Autowired
	JavaMailSender mailSender;

	/**
	 * メール送信
	 * 
	 * @throws MessagingException
	 */
	public void sendMail() throws MessagingException {

		// メールに添付する「C:\text.txt」にあるファイルのオブジェクトを生成
		String fileName = "text.txt";
		FileSystemResource fileResource = new FileSystemResource("C:\\" + fileName);

		// メッセージクラス生成
		MimeMessage mimeMsg = mailSender.createMimeMessage();
		// メッセージ情報をセットするためのヘルパークラスを生成(添付ファイル使用時の第2引数はtrue)
		MimeMessageHelper helper = new MimeMessageHelper(mimeMsg, true);

		// 送信元アドレスをセット
		helper.setFrom("from@test.co.jp");
		// 送信先アドレスをセット
		helper.setTo("to@test.co.jp");
		// 表題をセット
		helper.setSubject("メールタイトル");
		// 本文をセット
		helper.setText("メール本文");
		// 添付ファイルをセット
		helper.addAttachment(fileName, fileResource);

		// メール送信
		mailSender.send(mimeMsg);
		
	}
}
```

#おまけ：送信失敗のハンドリング
それぞれのsendメソッドは例外を返し得る仕様ですが、宛先アドレスの間違いの場合は正常扱いで例外となりません。
送信リクエストとしては「SMTPサーバにリクエストできた！」という事なのかなぁと。

メールサーバーが送信元に送信失敗の通知メールを返すので、それで判断するしかなさそうでした。



[^1]: org.springframework.mail.SimpleMailMessage
[^2]: org.springframework.mail.MailSender
[^3]: javax.mail.internet.MimeMessage;
[^4]: org.springframework.mail.javamail.JavaMailSender