【Java】JavaでEmail ~ JavaMail / Text ~

【1】Java で、 Email を送る

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

JavaMailの公式サイト
http://www.oracle.com/technetwork/java/javamail/index.html
https://javaee.github.io/javamail/

【2】準備

1)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]を選択しモジュールをダウンロード

build.gradle

dependencies {
    // ★JavaMail★
    compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.1'
}

【3】任意準備

1)開発用SMTPサーバーの設定

Windowsローカル上でテストする
(これまた色々あるらしいが)smtp4dev を利用する

 * 以下のサイトから「smtp4dev-X.X.X-binaries.zip」(今回は「smtp4dev-2.0.9-binaries.zip」)
  をダウンロードし、解凍し、smtp4dev.exeを起動するだけ(簡単)

http://smtp4dev.codeplex.com/

【4】サンプル

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();
    }
  }
}

1)補足

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

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

参考文献

* 以下のサイトは、非常に参考になった。

http://qiita.com/rubytomato@github/items/b106ff8011bcad60bce2

* smtp4dev に関する参考サイト

http://www.atmarkit.co.jp/ait/articles/1410/23/news017.html

* シンプルなサンプル

http://www.javadrive.jp/javamail/smtp/index1.html

その他のサイト

http://www.atmarkit.co.jp/ait/articles/0502/08/news103.html
http://masahnoheya.blog11.fc2.com/blog-entry-54.html

関連記事

JavaでEmail ~ JavaMail / 添付ファイル ~
https://dk521123.hatenablog.com/entry/2016/07/17/023459
JavaでEmail ~ SMTP認証 ~
https://dk521123.hatenablog.com/entry/2016/11/07/215251
JavaでEmail ~ SMTP認証 / DIGEST-MD5
https://dk521123.hatenablog.com/entry/2016/12/07/222229
JavaでEmail ~ JavaMail / TLS
https://dk521123.hatenablog.com/entry/2017/05/03/163219
JavaでEmail ~ JavaMail / Return-Path・Errors-To ~
https://dk521123.hatenablog.com/entry/2017/05/07/000344
Amazon SES ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/04/28/234103

メモ

Velocityを利用してメールテンプレート機能の実装を考える [1]
Windowsでの開発用SMTPサーバー ~ ダミーSMTPサーバ構築 ~
Linuxでの開発用SMTPサーバー [1] ~ FakeSMTP編 ~
Linuxでの開発用SMTPサーバー [2] ~ MailCatcher編 ~
Email送信に関する単体試験について ~ Dumbster編 ~
Email送信に関する単体試験について ~ SubEthaMail編 ~