この記事は「Java EE Advent Calendar 2016」の24日目です。
昨日は@gishi_yamaさんの「折角なので Apache Wicket 8 についてまとめておきたい」でした。
明日の最終日は@kokuzawaさんです。
JavaMail
自分は長らく開発系部門にいて、ここ数年はずっとJava EEを仕事で利用してきました1。そして今年の10月、クラウド型メール配信サービスであるSendGridチームへ異動しまして、今はメールの世界の奥深さを学ぶ日々となっています。
Javaの世界でメール、といえば、JavaMailが浮かぶと思います。このJavaMail、今更ながらに調べてみると色々面白くて、今日はJavaMailについて書きたいと思います。
Java EEとJavaMail
「ちょっと待って、Java EEアドベントなのに、なんでJavaMail?」という声もあるかと思いますが、実はJavaMailはJava EEの仕様に含まれます2。以下はOracleのJava EEページですが、JSR 919のJavaMailが入っています。
参照実装であるGlassFishにもバンドルされていて、管理コンソールにも「JavaMail Sessions」という設定があります。
この辺りの使い方については、以下記事が詳しいです。
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 Shannon4さんという方です(JSR上はそう記載されているのですが、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つでした。
後者はRFC2046,RFC2047も触れられています。JavaMailでは抽象クラスで定義されているMessage、それを継承したMimeMessageクラスを利用するので、この辺りと関連しているのかなと。
ソースをみていると他にも
- RFC6749 The OAuth 2.0 Authorization Framework
- RFC6750 The OAuth 2.0 Authorization Framework: Bearer Token Usage
などがOAuth2SaslClientクラスで出てきます。GmailのドキュメントとかにあるThe SASL XOAUTH2 Mechanismなどで使うのか…この辺は勉強しないと全然わからない感じ。
ソースではその他にも多くのRFCと関連5した記述があり、様々なプロトコルやメッセージ形式に対応してるようです。
もちろんIMAP、POP3、SMTP辺りはソースのパッケージ名にもなっているくらいコアな部分です。
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」に色々と情報がまとまっています。Android用のJavaMail for Androidなどもあるんですね。
ソースコードは以下から取得できます。
https://java.net/projects/javamail/downloads
日本語情報だと少し古いものが多く、1.5の情報では「JavaMail 1.5を使ってみる」がありました。
JSR919にはライブラリのアーキテクチャとかデザインについて色々書いてありそうなので、本当はもう少しJavaMailのコードを読みつつ色々書きたかったのですが、ちゃんとまとめようとするとヘビーそうだったのでこのぐらいに…。
-
開発を通じて学んだことはブログにまとめています「Challenge Java EE !」。 ↩
-
知ってる方からすれば「常識でしょ」って感じかもですが、私は最近まで知らなかったです… 。 ↩
-
そんなことってあるのか… ↩
-
ググってもBill Shannonさんばかりがでて、調べてたら「William が Bill になる不思議」というページをみたりしたので ↩
-
ざっと調べただけでもRFC1320、RFC1730、RFC2060、RFC2086、RFC2087、RFC2177、RFC2359、RFC2060、RFC2595、RFC2971、RFC3501、RFC3691、RFC4422、RFC4551、RFC4959、RFC5032、RFC5162、RFC5256など ↩