CLOVER🍀

That was when it all began.

JavaMail 1.5を使ってみる

最近、ちょっとJavaMailを使ってメール送信するプログラムを書いたのですが、JavaMail 1.5から?ライブラリの構成が変わっていたので、ちょっとご紹介。

JavaMail
http://www.oracle.com/technetwork/java/javamail/index.html

Javadoc
https://javamail.java.net/nonav/docs/api/

変わった言いましても、アーティファクトが変わったってところですね。

Download JavaMail 1.5.1 Release
https://java.net/projects/javamail/pages/Home#Download_JavaMail_1.5.1_Release

以前は

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

みたいに書いていましたが、今は同じようなことを書こうと思うと

    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.5.1</version>
    </dependency>

となるようです。com.sum.mailになってますね。

このアーティファクトは、SMTP、POP3、IMAPを含んだリファレンス実装らしいですが、各プロトコルのプロバイダや、APIのみのアーティファクトもあります。

使い方は、変わらないので簡単に。
src/main/java/org/littlewings/javamail/JavaMailExample.java

package org.littlewings.javamail;

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;

public class JavaMailExample {
    public static void main(String... args) {
        // x-windows-iso2022jpをISO-2022-JPのエイリアスに
        System.setProperty("sun.nio.cs.map", "x-windows-iso2022jp/ISO-2022-JP");

        Properties properties = new Properties();

        // SMTPサーバのホスト名 or IPアドレス
        properties.put("mail.smtp.host", "smtp.example.com");
        // SMTPサーバのポート
        properties.put("mail.smtp.port", "25");

        // デバッグ情報を出力する場合
        properties.put("mail.debug", "true");

        try {
            Session session = Session.getDefaultInstance(properties);

            // 送信メッセージ
            MimeMessage message = new MimeMessage(session);

            // From
            message.setFrom(new InternetAddress("from-address@example.com"));
            // 宛先(TO)
            message.setRecipients(MimeMessage.RecipientType.TO,
                                  new InternetAddress[] { new InternetAddress("to-address@example.com") });

            // 件名および本文
            message.setSubject("件名です", "ISO-2022-JP");
            message.setText("こんにちは、JavaMail\r\n①②③", "ISO-2022-JP");

            Transport.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

ムダに、x-windows-iso2022jpを使っています。

        // x-windows-iso2022jpをISO-2022-JPのエイリアスに
        System.setProperty("sun.nio.cs.map", "x-windows-iso2022jp/ISO-2022-JP");

今回は、全機能を持ったJARを依存関係に追加しましたが、個々に追加しようとするとこのようになります。

    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>javax.mail-api</artifactId>
      <version>1.5.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>mailapi</artifactId>
      <version>1.5.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>smtp</artifactId>
      <version>1.5.1</version>
    </dependency>

上から順に、APIのみの定義(コンパイル用)、プロトコルプロバイダなしのリファレンス実装、SMTPの実装になります。