Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Java | JavaMailをラップして流れるようなIFにする

概要

JavaMailをラップして流れるようなIFにする

内容

JavaMailをラップして流れるようなIFにしてみます。
※他のライブラリにも流用可能。

サンプルコード

インターフェース

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

/**
 * JavaMailのラッパー。
 * 
 */
public interface JavaMailWrapper {
  /**
   * メール送信.
   * 
   * @throws AddressException 不正なアドレスの際に発生
   * @throws MessagingException 送信エラー時に発生
   */
  public void send() throws AddressException, MessagingException;
}

実装ソース

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * JavaMailのラッパークラス。
 * 
 */
public class JavaMailWrapperImpl implements JavaMailWrapper {
  /** Propertiesに設定するSMTPホストのキー文字列 */
  private static final String MAIL_SMTP_HOST_KEY = "mail.smtp.host";
  /** メール情報 */
  private Mail mail = null;

  /**
   * メールデータクラスを利用してラッパークラスを初期化する.
   * 
   * @param setter
   */
  public JavaMailWrapperImpl(Mail setter) {
    this.mail = setter;
  }

  /**
   * {@inheritDoc}
   * 
   * @throws MessagingException {@inheritDoc}
   */
  @Override
  public void send() throws MessagingException {
    try {
      MimeMessage mimeMessage = new MimeMessage(getSession());
      mimeMessage.setRecipients(MimeMessage.RecipientType.TO, mail.getToAddresses());
      mimeMessage.setFrom(mail.getFromAddresses());
      mimeMessage.setSubject(mail.subject);
      mimeMessage.setText(mail.text);

      Transport.send(mimeMessage);
    } catch (MessagingException e) {
      throw e;
    }
  }

  /**
   * セッション情報を取得。
   * 
   * @return セッション情報
   */
  private Session getSession() {
    Properties props = new Properties();
    props.setProperty(MAIL_SMTP_HOST_KEY, mail.getSmtpHost());
    Session session = Session.getDefaultInstance(props);
    return session;
  }

  /**
   * メールデータ設定クラス.
   * 
   */
  public static class Mail {
    /** SMTPサーバー */
    private String smtpHost = null;
    /** 宛先アドレスリスト */
    private InternetAddress[] toAddresses = null;
    /** 差出人アドレス */
    private InternetAddress fromAddresses = null;
    /** 件名 */
    private String subject = null;
    /** 本文 */
    private String text = null;

    /**
     * SMTPサーバーを設定.
     * 
     * @param smtpHost SMTPサーバー
     * @return Mailのインスタンス(FluentIF)
     */
    public Mail smtpHost(String smtpHost) {
      this.smtpHost = smtpHost;
      return this;
    }

    /**
     * 送信先アドレスを設定.
     * 
     * <pre>
     * 宛先アドレスと宛先名のリストを指定して宛先情報を設定する。
     * 宛先アドレスと宛先名のリスト数は一致している必要がある。
     * </pre>
     * 
     * @param addresses 宛先アドレスリスト
     * @param personals 宛先名リスト
     * @return Mailのインスタンス(FluentIF)
     * @throws IllegalArgumentException 不正な引数を設定した際に発生
     * @throws NullPointerException {@code addresses}か{@code personals}がnullの場合に発生
     */
    public Mail toAddresses(List<String> addresses, List<String> personals) {
      validateToAddressNull(addresses, personals);
      validateToAddressSize(addresses, personals);

      InternetAddress[] toAddresses = new InternetAddress[addresses.size()];
      for (int i = 0; i < toAddresses.length; i++) {
        InternetAddress internetAddress = getInternetAddress(addresses.get(i), personals.get(i));
        toAddresses[i] = internetAddress;
      }
      this.toAddresses = toAddresses;
      return this;
    }

    /**
     * 差出人アドレスを設定.
     * 
     * @param address 宛先アドレス
     * @param personal 宛先名
     * @return Mailのインスタンス(FluentIF)
     * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生
     */
    public Mail fromAddresses(String address, String personal) {
      validateFromAddressNull(address, personal);
      this.fromAddresses = getInternetAddress(address, personal);
      return this;
    }

    /**
     * 件名を設定.
     * 
     * @param subject 件名
     * @return Mailのインスタンス(FluentIF)
     */
    public Mail subject(String subject) {
      this.subject = subject;
      return this;
    }

    /**
     * 本文を設定.
     * 
     * @param text 本文
     * @return Mailのインスタンス(FluentIF)
     */
    public Mail text(String text) {
      this.text = text;
      return this;
    }

    /**
     * smtpHostを取得する.
     * 
     * @return the smtpHost smtpHost
     */
    public String getSmtpHost() {
      return smtpHost;
    }

    /**
     * toAddressesを取得する.
     * 
     * @return the toAddresses toAddresses
     */
    public InternetAddress[] getToAddresses() {
      return toAddresses;
    }

    /**
     * fromAddressesを取得する.
     * 
     * @return the fromAddresses fromAddresses
     */
    public InternetAddress getFromAddresses() {
      return fromAddresses;
    }

    /**
     * subjectを取得する.
     * 
     * @return the subject subject
     */
    public String getSubject() {
      return subject;
    }

    /**
     * textを取得する.
     * 
     * @return the text text
     */
    public String getText() {
      return text;
    }

    /**
     * 宛先情報の取得。
     * 
     * @param address 宛先アドレス
     * @param personal 宛先名
     * @return 宛先情報
     */
    private InternetAddress getInternetAddress(String address, String personal) {
      InternetAddress internetAddress = new InternetAddress();
      internetAddress.setAddress(address);
      internetAddress = setPersonal(personal, internetAddress);
      return internetAddress;
    }

    /**
     * 宛先名を設定する.
     * 
     * @param personal 宛先名
     * @param internetAddress 宛先名設定対象
     * @return 宛先名設定済みのInternetAddress
     */
    private InternetAddress setPersonal(String personal, InternetAddress internetAddress) {
      try {
        internetAddress.setPersonal(personal);
        return internetAddress;
      } catch (UnsupportedEncodingException e) {
        throw new IllegalArgumentException();
      }
    }

    /**
     * toAddressのaddress,personalのサイズ整合性チェック.
     * 
     * @param addresses 宛先アドレス
     * @param personals 宛先名
     * @throws IllegalArgumentException サイズが一致しない場合に発生。
     */
    private void validateToAddressSize(List<String> addresses, List<String> personals) {
      if (addresses.size() != personals.size()) {
        throw new IllegalArgumentException();
      }
    }

    /**
     * toAddressのnullチェック.
     * 
     * @param addresses 宛先アドレス
     * @param personals 宛先名
     * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生
     */
    private void validateToAddressNull(List<String> addresses, List<String> personals) {
      if (addresses == null | personals == null) {
        throw new NullPointerException();
      }
    }

    /**
     * fromAddressのnullチェック.
     * 
     * @param address 宛先アドレス
     * @param personal 宛先名
     * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生
     */
    private void validateFromAddressNull(String address, String personal) {
      if (address == null | personal == null) {
        throw new NullPointerException();
      }
    }
  }
}

呼び出しサンプル

class JavaMailSample {
  putlic static void main(String[] args) {
    JavaMailWrapper javaMail = new JavaMailWrapperImpl(
        new Mail()
            .smtpHost("smtp.co.jp")
            .toAddresses(
                Arrays.asList(new String[] { "aaaa@bbb.co.jp", "bbbb@ccc.com" }),
                Arrays.asList(new String[] { "adress to1", "address to2" }))
            .fromAddresses("dddd@eeee.co.jp", "address from")
            .subject("件名")
            .text("本文1\n本文2"));

    // InternetAddressの作成
    try {
      javaMail.send();
    } catch (MessagingException e) {
      e.printStackTrace();
      return null;
    }
  }
}