JavaMailとりあえず送るだけ

やるたびに忘れるのでメモ。

送信部

public void mailSend(String subjectText, String bodyText) {

    log.info("メールを送信します。");

    Session session = Session.getInstance(Common.props);

    MimeMessage mimeMessage = new MimeMessage(session);
    try {
        // 宛先の設定
        for (String mailto : Common.mailTo) {
            try {
                mimeMessage.setRecipients(MimeMessage.RecipientType.TO, mailto);
            } catch (AddressException ae) {
                log.warn("メール宛先設定に失敗しました。[{}]{}", mailto, ae.getMessage());
            }
        }
        // 送信元の設定
        //mimeMessage.setFrom(new InternetAddress("hogehoge@hoge.com"));
        // サブジェクトの設定 Base64「B」Quoted-Printable:「Q」
        //subjectText = MimeUtility.encodeText(subjectText, "iso-2022-jp", "B");
        mimeMessage.setSubject(subjectText);
        // 本文の設定
        mimeMessage.setText(bodyText);
        // 設定の保存
        mimeMessage.saveChanges();
        // メールの送信
        Transport.send(mimeMessage, Common.smtpUser, Common.smtpPass);
    } catch (MessagingException e) {
        log.error("メール送信に失敗しました。", e);
    }
}

設定読み込み

import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Common {

    /**
     * メール宛先配列
     */
    public static String[] mailTo;

    /**
     * SMTP認証ユーザー
     */
    public static String smtpUser;
    /**
     * SMTP認証パスワード
     */
    public static String smtpPass;

    /***
     * 設定ファイルプロパティ
     */
    public static   Properties props = null;

    /***
     * 設定ファイル名
     */
    public static String propFileName = "hoge.xml";

    /**
     * ロガー
     */
    static Logger log = LoggerFactory.getLogger(Common.class);

    /**
     * 設定ファイル読み込み
     * @param propFileName
     */
    public static void getProp() {

        try {
            if (!Files.exists(Paths.get(propFileName))) {
                log.warn("{}が存在しません。", propFileName);
                return;
            }

            InputStream is = new FileInputStream(propFileName);
            props = new Properties();
            props.loadFromXML(is);
            mailTo = props.get("mailTo").toString().split(",");
            smtpUser = props.get("mail.smtp.user").toString();
            smtpPass = props.get("mail.smtp.password").toString();

        } catch (Exception e) {
            log.error(String.format("{}の取得に失敗しました。", propFileName), e);
        }

    }
}

設定ファイル(hoge.xml) https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment></comment>

<entry key="mail.debug">false</entry>

<entry key="mail.smtp.host">hoge.host.com</entry>
<entry key="mail.smtp.port">587</entry>
<entry key="mail.smtp.auth">true</entry>
<entry key="mail.smtp.user">hoge.user</entry>
<entry key="mail.smtp.password">hoge.password</entry>

<entry key="mail.smtp.from">from.hogehost.com</entry>
<entry key="mailTo">to.hogehost.com</entry>

<!-- コネクション確立までのタイムアウト時間(ミリ秒) -->
<entry key="mail.smtp.connectiontimeout">10000</entry>

<!-- SMTPサーバとの通信(read)のタイムアウト時間(ミリ秒) -->
<entry key="mail.smtp.timeout">10000</entry>

<!-- ソケットの書き込みのタイムアウト時間(ミリ秒)-->
<entry key="mail.smtp.writetimeout">10000</entry>

<!-- authコマンドでのユーザー認証を行うか -->
<entry key="mail.smtp.auth">false</entry>

<entry key="mail.smtp.ssl.enable">false</entry>
<entry key="mail.smtp.starttls.enable">true</entry>
<entry key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</entry>
<entry key="mail.smtp.socketFactory.fallback">true</entry>
<entry key="mail.smtp.socketFactory.port">587</entry>
</properties>