開発テスト用にダミーメールアドレスを使用して送受信の確認をする


環境

java8
Spring Boot2.4.0
Eclipse2020-12

目的

受発注システムを開発していて、発注の際に「システムメールを送信して通知する機能」を実装しようとしたけど、ユーザーのメールアドレスはどれもダミーのメールアドレス。動作確認できるように本当は有効なアドレスを使用したほうが良いのかもしれませんが、メールの送信自体はシステムからオンリーになるので、受信の確認はしなくて良い。設定諸々送信側で良いはずなので、テキトーなアドレス宛に「システムからのお知らせです!」みたいなメッセージを送りたい。さあどうする??ってなって迷走していました。

とりあえずメールサーバー付きのレンタルサーバを契約してシステムメールのアカウントは作ったけど、

「ダミーのメールアドレス宛に送ってもエラーだよなぁ・・・」

って思いながら実行すると当然エラー。

そんな折に見つけたのがFakeSMTPでした。

使用したツール

FakeSMTP
http://nilhcem.com/FakeSMTP/# からダウンロード。
ダウンロード

Cドライブ直下に展開して、java -jarで実行。
これでFakeSMTPが立ち上がる。

設定

ホスト名: localhost
ポート番号: 25

ポート番号は「リスニングポート」をいじれば変えられるとは思います(自分はやってませんけど、まあできるでしょうね。)

ロリポップのSMTPサーバの設定だと、管理画面には465と書いてあるけど、587じゃ無いとうまく送信できませんでした。どういうこと??

TLSとかSSLとかが関係してくるのかもしれませんが、そこまで私はわかりませんm(__)mが、同様のエラーがネットに落ちていてポートをいじればできるとあったので587に変更すれば送信できました。どういう・・・??

実装

application.properties
spring.mail.port=25
spring.mail.host=localhost
EmailConfig.java
package com.example.home.mail;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import lombok.Data;

@Component
@Data
public class EmailConfig {
    @Value("${spring.mail.host}")
    private String host; // ここにプロパティファイルのホストの値が格納される

    @Value("${spring.mail.port}")
    private String port; // ここにプロパティファイルのポート番号の値が格納される
}
MailUtil.java
package com.example.home.mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MailUtil {

    @Autowired
    private EmailConfig emailConfig;

    public void sendEmail(String to) {

        Properties props = new Properties();
        props.setProperty("mail.smtp.host", emailConfig.getHost());
        props.setProperty("mail.smtp.port", emailConfig.getPort());
        Session session = Session.getInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(emailConfig.getUsername(), emailConfig.getPassword());
            }
        });
        try {
            // Messageオブジェクト作成
            Message msg = new MimeMessage(session);
            // Fromヘッダーフィールドを設定
            msg.setFrom(new InternetAddress(emailConfig.getUsername()));
            msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
            // 件名を設定
            msg.setSubject("Javax.Mail test");
            // 送信された日付を取得
            msg.setSentDate(new Date());
            // text/plainのmimeタイプをコンテンツとして設定
            msg.setText("MimeMessageのテストです");

            Transport.send(msg);

        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
}

これでsendEmailメソッドをどこかで呼び出せばちゃんとFakeSMTPにログが出力されたので、ダミーアドレス宛に送信を試みているのがわかりました。