【Java】 Java で、 Email を送るには... [1] ~ JavaMail / テキストメール編 ~

Java で、 Email を送るには...

 * (色々あるらしいが)JavaMail を利用する

JavaMailの公式サイト

http://www.oracle.com/technetwork/java/javamail/index.html
https://javaee.github.io/javamail/

■ 準備 / JavaMailの設定

色々、方法はあるが、ここでは、以下を紹介。
【1】 JavaMailを直接ダウンロード
【2】 Gradle を使う << ★2018/03/20追記★

【1】 JavaMailを直接ダウンロード

 * 以下のサイトから「javax.mail.jar」(今回は「JavaMail v1.5.5」)を
   ダウンロードしインポートしておく
https://javaee.github.io/javamail/

【2】 Gradle を使う

 * 以下の関連記事の「準備 : Buildship: Eclipse Plug-ins for Gradle のインストール」を行い
   Gradle プロジェクトを作成し、Eclipseの対象プロジェクトを右クリックし、
   [Gradle]-[Refresh Gradle Project]を選択しモジュールをダウンロード
https://blogs.yahoo.co.jp/dk521123/37204914.html
build.gradle
dependencies {
    // ★JavaMail★
    compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.1'
}

■ 任意準備 / 開発用SMTPサーバーの設定

Windowsローカル上でテストする

(これまた色々あるらしいが)smtp4dev を利用する
 * 以下のサイトから「smtp4dev-X.X.X-binaries.zip」(今回は「smtp4dev-2.0.9-binaries.zip」)
  をダウンロードし、解凍し、smtp4dev.exeを起動するだけ(簡単)
http://smtp4dev.codeplex.com/
 * その他のツールやLinux環境下での構築については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37222874.html
https://blogs.yahoo.co.jp/dk521123/36252946.html
https://blogs.yahoo.co.jp/dk521123/37440819.html
https://blogs.yahoo.co.jp/dk521123/36257589.html

■ サンプル

EmailHandler.java

import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

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

public class EmailHandler {
  private final static String DEFAULT_TIMEOUT = "10000";
  private final static String DEFAULT_HOST = "localhost";
  private final static String DEFAULT_POST = "25";
  private String fromAddress;
  private List<String> toAddresses;
  private String mailSubject;
  private String mailBody;
  private String host;
  private String port;
  private String timeout;
  private boolean isOnDebugMode;

  /**
   * Default Contractor.
   */
  public EmailHandler() {
    this.fromAddress = null;
    this.toAddresses = new ArrayList<>();
    this.mailSubject = null;
    this.mailBody = null;
    this.host = DEFAULT_HOST;
    this.port = DEFAULT_POST;
    this.timeout = DEFAULT_TIMEOUT;
    this.isOnDebugMode = false;
  }

  public void setFromAddress(String fromAddress) {
    this.fromAddress = fromAddress;
  }

  public void setToAddresses(List<String> toAddresses) {
    this.toAddresses = toAddresses;
  }

  public void addToAddress(String toAddress) {
    this.toAddresses.add(toAddress);
  }

  public void setMailSubject(String mailSubject) {
    this.mailSubject = mailSubject;
  }

  public void setMailBody(String mailBody) {
    this.mailBody = mailBody;
  }

  public void setHost(String host) {
    this.host = host;
  }

  public void setPort(String port) {
    this.port = port;
  }

  public void setOnDebugMode(boolean isOnDebugMode) {
    this.isOnDebugMode = isOnDebugMode;
  }

  public void send() throws MessagingException {
    if (this.toAddresses == null || this.host == null) {
      throw new InvalidParameterException();
    }

    Properties props = new Properties();
    props.put("mail.smtp.host", this.host);
    props.put("mail.smtp.port", this.port);
    props.put("mail.debug", this.isOnDebugMode);
    props.put("mail.smtp.connectiontimeout", this.timeout);
    props.put("mail.smtp.timeout", this.timeout);

    Session session = Session.getInstance(props, null);

    Message mimeMessage = new MimeMessage(session);
    mimeMessage.setFrom(this.toInternetAddress(this.fromAddress));
    InternetAddress[] addresses = this.toInternetAddresses(this.toAddresses);
    mimeMessage.setRecipients(Message.RecipientType.TO, addresses);
    mimeMessage.setSubject(this.mailSubject);
    mimeMessage.setSentDate(new Date());
    mimeMessage.setText(this.mailBody);

    Transport.send(mimeMessage);
  }

  private InternetAddress[] toInternetAddresses(List<String> addresses) throws AddressException {
    InternetAddress[] returnValues = new InternetAddress[addresses.size()];

    int index = 0;
    for (String address : addresses) {
      returnValues[index] = this.toInternetAddress(address);
      index++;
    }

    return returnValues;
  }

  private InternetAddress toInternetAddress(String address) throws AddressException {
    return new InternetAddress(address);
  }

  /**
   * 【使用例】
   * 
   * @param args
   */
  public static void main(String[] args) {
    try {
      EmailHandler email = new EmailHandler();
      email.setFromAddress("sample@yahoo.com");
      email.addToAddress("sample@gmail.com");
      email.setMailSubject("タイトルです。");
      email.setMailBody("メール本文です。\r\n以上です。");
      email.setOnDebugMode(true);
      email.send();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

■ 補足

上記のサンプルは、Listを使っているが、以下のようにもできる。

InternetAddress[] myToList = InternetAddress.parse("abc.001@gmail.com,def.002@yahoo.com");


関連記事

Java で、 Email を送るには... [2] ~ JavaMail / 添付ファイル付きメール編 ~

https://blogs.yahoo.co.jp/dk521123/36230816.html

Java で、 Email を送るには... [3] ~ SMTP認証編 ~

https://blogs.yahoo.co.jp/dk521123/36491701.html

Java で、 Email を送るには... [4] ~ SMTP認証 / DIGEST-MD5 編 ~

https://blogs.yahoo.co.jp/dk521123/36557395.html

Java で、 Email を送るには... [5] ~ JavaMail / TLS 編 ~

https://blogs.yahoo.co.jp/dk521123/36860639.html

Java で、 Email を送るには... [6] ~ JavaMail / Return-Path・Errors-To 編 ~

https://blogs.yahoo.co.jp/dk521123/36867883.html

Velocityを利用してメールテンプレート機能の実装を考える [1]

http://blogs.yahoo.co.jp/dk521123/36245554.html

Windowsでの開発用SMTPサーバー ~ ダミーSMTPサーバ構築 ~

https://blogs.yahoo.co.jp/dk521123/37222874.html

Linuxでの開発用SMTPサーバー [1] ~ FakeSMTP編 ~

https://blogs.yahoo.co.jp/dk521123/36252946.html

Linuxでの開発用SMTPサーバー [2] ~ MailCatcher編 ~

https://blogs.yahoo.co.jp/dk521123/37440819.html

Email送信に関する単体試験について ~ Dumbster編 ~

https://blogs.yahoo.co.jp/dk521123/36257589.html

Email送信に関する単体試験について ~ SubEthaMail編 ~

https://blogs.yahoo.co.jp/dk521123/37475028.html