今日も備忘録です。
このドキュメントについて
以前、springの機能を利用してメール送信を実装してみたのですが、今回はjavaのメール送信機能を利用して実装してみました。
前回同様、gmailのsmtpサーバーを利用して、メール送信します。
前回のspringの記事は以下。
実行環境
・Java17
実装
@Service
@RequiredArgsConstructor
@Slf4j
public class MailSenderService {
private final MailConfig mailConfig;
private final MailConfigValue mailConfigValue;
public boolean smtpMailSender() {
var properties = new Properties();
properties.put("mail.smtp.host", mailConfig.getHost());
properties.put("mail.smtp.port", mailConfig.getPort());
properties.put("mail.smtp.auth", mailConfigValue.isAuth());
properties.put("mail.smtp.starttls.enable","true");
class smtpAuth extends Authenticator {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(mailConfig.getUserName(), mailConfig.getPassword());
}
}
// メールセッションの確立
var session = Session.getInstance(properties, new smtpAuth());
// メッセージ部分の作成
var message = new MimeMessage(session);
try {
// message.setFrom("xxx@gmail.com"); メールのFROMにメールアドレスだけでなく、文字を入れたい時下のを利用
message.setFrom(new InternetAddress("xxx@gmail.com", "テスト"));
message.setText("javaのメール送信テスト");
message.setSubject("テストで送ります");
message.setRecipients(Message.RecipientType.TO, "xxx@gmail.com");
message.setRecipients(Message.RecipientType.CC, "xxx.com");
Transport.send(message);
} catch (MessagingException | UnsupportedEncodingException e) {
throw new RuntimeException("smtpメール送信エラー", e);
}
}
}
説明:
-
Propertiesクラスにキーと値をセットで設定していく。
サーバー接続に必要なホストとポート番号、ユーザー認証や通信を暗号化するためにSTARTTLSを設定します。
STARTTLSを設定しないとgmailでは、メール接続できなかったので、注意が必要。 -
Authenticatorクラスを継承したクラスを用意して、getPasswordAuthenticationメソッドをオーバーライドする。
このメソッドは、パスワード認証が必要な場合に呼び出されるメソッドです。
返却値はパスワードとユーザー名を保持するPasswordAuthenticationクラス。 -
メールセッションを確立する。
Session.getDefaultInstance()だとキャッシュが残って、前回の接続が消えないみたいな問題があるみたいなので、getInstance()を利用してます。
この時に、2.のパスワード認証が呼び出されるのかなと思ってます。 -
あとはメッセージ設定して、Transport.send()でメール送信ができます。
まとめ
実装してみて思ったことは、フレームワークなので、当然っちゃ当然だとは思いますが、
springでのメール送信の方が断然楽でした。
パスワード認証とかホストの設定とかその辺りはフレームワークの機能としてやってくれているんだろうなと。。
ただ、springを利用しないやり方も知っていて損はないと思うので、やってみてよかったです。
フレームワークのありがたさを知りました。