3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaのメール送信機能を使ってメール送信してみた

Last updated at Posted at 2023-03-14

今日も備忘録です。

このドキュメントについて

以前、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);
        }
    }
}

説明:

  1. Propertiesクラスにキーと値をセットで設定していく。
    サーバー接続に必要なホストとポート番号、ユーザー認証や通信を暗号化するためにSTARTTLSを設定します。
    STARTTLSを設定しないとgmailでは、メール接続できなかったので、注意が必要。

  2. Authenticatorクラスを継承したクラスを用意して、getPasswordAuthenticationメソッドをオーバーライドする。
    このメソッドは、パスワード認証が必要な場合に呼び出されるメソッドです。
    返却値はパスワードとユーザー名を保持するPasswordAuthenticationクラス。

  3. メールセッションを確立する。
    Session.getDefaultInstance()だとキャッシュが残って、前回の接続が消えないみたいな問題があるみたいなので、getInstance()を利用してます。
    この時に、2.のパスワード認証が呼び出されるのかなと思ってます。

  4. あとはメッセージ設定して、Transport.send()でメール送信ができます。

まとめ

実装してみて思ったことは、フレームワークなので、当然っちゃ当然だとは思いますが、
springでのメール送信の方が断然楽でした。
パスワード認証とかホストの設定とかその辺りはフレームワークの機能としてやってくれているんだろうなと。。

ただ、springを利用しないやり方も知っていて損はないと思うので、やってみてよかったです。
フレームワークのありがたさを知りました。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?