実はJava EEに含まれるJavaMailについて

この記事は「[Java EE Advent Calendar 2016](http://qiita.com/advent-calendar/2016/javaee)」の24日目です。

昨日は@gishi_yamaさんの「[折角なので Apache Wicket 8 についてまとめておきたい](http://qiita.com/gishi_yama/items/59fae7f2a56df31c5749)」でした。
明日の最終日は@kokuzawaさんです。
# JavaMail
自分は長らく開発系部門にいて、ここ数年はずっとJava EEを仕事で利用してきました[^1]。そして今年の10月、クラウド型メール配信サービスである[SendGrid](https://sendgrid.kke.co.jp/)チームへ異動しまして、今はメールの世界の奥深さを学ぶ日々となっています。

Javaの世界でメール、といえば、**JavaMail**が浮かぶと思います。このJavaMail、今更ながらに調べてみると色々面白くて、今日はJavaMailについて書きたいと思います。

# Java EEとJavaMail
「ちょっと待って、Java EEアドベントなのに、なんでJavaMail？」という声もあるかと思いますが、実はJavaMailはJava EEの仕様に含まれます[^2]。以下はOracleのJava EEページですが、JSR 919のJavaMailが入っています。

![JavaEEAdvent1.png](https://qiita-image-store.s3.amazonaws.com/0/47737/5d9d89dd-c5ed-935a-8cb9-b17bfdfe9988.png)

参照実装であるGlassFishにもバンドルされていて、管理コンソールにも「JavaMail Sessions」という設定があります。
![JavaEEAdvent2.png](https://qiita-image-store.s3.amazonaws.com/0/47737/7d594c0a-ce2c-0922-f3b1-48d86d761ee6.png)

この辺りの使い方については、以下記事が詳しいです。

- [GlassFishのJavaMailセッションを使う](http://www.coppermine.jp/docs/programming/2011/12/glassfish-javamail.html)
- [【Glassfish4】JavaMail Sessions設定（TLS認証）](http://tigertaizo.hatenablog.com/entry/2015/05/19/210415)

# JSR 919

JSRの一覧をみると、メールに関連しそうなものとしては3つぐらいでした。JavaMailは現在JSR 919で仕様が公開されています。

| JSR | 名称 | 説明 | 状態 |
|:--|:--|:--|:--|
| JSR 332  | Email Client API for Java ME | Java MEアプリからメールを利用するためのAPI| Dormant|
| JSR 904  | JavaMail Specification | JavaMail APIのMaintenance revision 1.2 | Maintenance|
| JSR 919  | JavaMail  |  JavaMail API| Maintenance|

JSRの900番台って少し特殊な感じなのですかね。JSR 904のDownload Pageはリンク切れしてて中身が確認できなかったのですが[^3]…JSR 919で包含している感じなのかな。

なお、JavaMailのスペックリードはOracleのWilliam Shannon[^4]さんという方です(JSR上はそう記載されているのですが、[Bill Shannonさん](https://java.net/people/626-Bill-Shannon)のことじゃないのかなと)。

JSR 919のドキュメント内にある謝辞では、Sun Microsystems、Novell, Inc、Lotus Development Corporation、IBM Corporation、Netscape Communications Corporationに所属された方々の名前が入っていて歴史を感じます。

JSR 919は156ページあって、それなりにボリュームがあります。

個人的には、なんでJava EEの仕様に含まれたんだろう、と気になったのですが、JSRの冒頭では「Javaプラットフォームでは、RMIやCORBAなどの分散コンピューティング、JavaBeansのようなコンポーネントアーキテクチャなどを機能的に追加しており、Javaアプリも成熟して、メールやメッセージングのような枠組みも必要となった。」という一文があって、なるほどという感じでした。

JSR 919の中で「RFC」で検索したら、出てきたのは主に2つでした。

- **[RFC822 Standard for the Format of Internet Text Messages](https://www.ietf.org/rfc/rfc0822.txt)**

- **[RFC2045 MIME(Multipurpose Internet Mail Extensions)](https://www.ietf.org/rfc/rfc2045.txt)**

後者は[RFC2046](https://www.ietf.org/rfc/rfc2046.txt),[RFC2047](https://www.ietf.org/rfc/rfc2047.txt)も触れられています。JavaMailでは抽象クラスで定義されているMessage、それを継承したMimeMessageクラスを利用するので、この辺りと関連しているのかなと。

ソースをみていると他にも

- **[RFC6749 The OAuth 2.0 Authorization Framework](https://tools.ietf.org/html/rfc6749)**
- **[RFC6750 The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750)**

などがOAuth2SaslClientクラスで出てきます。Gmailのドキュメントとかにある[The SASL XOAUTH2 Mechanism](https://developers.google.com/gmail/xoauth2_protocol)などで使うのか…この辺は勉強しないと全然わからない感じ。

ソースではその他にも多くのRFCと関連[^5]した記述があり、様々なプロトコルやメッセージ形式に対応してるようです。

もちろん[IMAP](https://ja.wikipedia.org/wiki/Internet_Message_Access_Protocol)、[POP3](https://ja.wikipedia.org/wiki/Post_Office_Protocol)、[SMTP](https://ja.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol)辺りはソースのパッケージ名にもなっているくらいコアな部分です。

# JavaMail 1.5

JavaMailの最新は、これを書いている2016/12/24時点で1.5.6です。ライセンスはCommon Development and Distribution License (CDDL) v1.1 ＆ GNU General Public License (GPL) v2。

「[JavaMail API Reference Implementation: Wiki: Home](https://java.net/projects/javamail/pages/Home)」に色々と情報がまとまっています。[Android用のJavaMail for Android](https://java.net/projects/javamail/pages/Android)などもあるんですね。

ソースコードは以下から取得できます。
https://java.net/projects/javamail/downloads

日本語情報だと少し古いものが多く、1.5の情報では「[JavaMail 1.5を使ってみる](http://d.hatena.ne.jp/Kazuhira/20140201/1391262614)」がありました。

JSR919にはライブラリのアーキテクチャとかデザインについて色々書いてありそうなので、本当はもう少しJavaMailのコードを読みつつ色々書きたかったのですが、ちゃんとまとめようとするとヘビーそうだったのでこのぐらいに…。

--------

[^1]: 開発を通じて学んだことはブログにまとめています:point_right_tone2:「[Challenge Java EE !](http://kikutaro777.hatenablog.com/)」。
[^2]: 知ってる方からすれば「常識でしょ」って感じかもですが、私は最近まで知らなかったです… 。
[^3]: そんなことってあるのか…
[^4]: ググってもBill Shannonさんばかりがでて、調べてたら「[William が Bill になる不思議](http://eitangotsukaiwake.suntomi.com/index.php?William%20%E3%81%8C%20Bill%20%E3%81%AB%E3%81%AA%E3%82%8B%E4%B8%8D%E6%80%9D%E8%AD%B0)」というページをみたりしたので
[^5]: ざっと調べただけでもRFC1320、RFC1730、RFC2060、RFC2086、RFC2087、RFC2177、RFC2359、RFC2060、RFC2595、RFC2971、RFC3501、RFC3691、RFC4422、RFC4551、RFC4959、RFC5032、RFC5162、RFC5256など