メールサーバーとクライアントとのやりとりに利用されるプロトコルとしてはPOPとIMAPの2種類が広く利用されています。しかし、POPは主な仕様が2000年前後に策定されたままで、同期などの現代的な需要を満たすのが難しく、またIMAPは実装が特殊で新たな開発者にとって扱いづらいという問題がありました。そうした問題を解決するために策定されたのが「JMAP(JSON Meta Application Protocol)」です。JMAPのコアとなる仕様やメール用JMAPの仕様は2019年に策定が完了しており、すでにJMAPに対応済みのクライアントも登場しています。

JSON Meta Application Protocol Specification (JMAP)

https://jmap.io/



JMAPは1999年からメールサービスを提供してきたFastmailのチーム主体で進められているプロジェクトです。名前的にはIMAPをJSON形式へと変換したプロトコルに見えますが、実際にはネットワークリソースを効率的に使用可能だったり、開発者が扱いやすかったりという長所があるまったく新しいプロトコルとのこと。Gmailなど、似たようなプロトコルをアプリ内で利用しているサービスも存在していますが、JMAPはオープンスタンダードなAPIであり、他人同士が作ったサーバーとクライアントで接続可能という点で異なっています。

メールサービスの利用者にとってうれしい点をアピールしたムービーがYouTubeで公開されています。

JMAP - a better way to email - YouTube

JMAPを使うことで、従来のIMAPよりもはるかに高速にメールを読み込むことができます。例えば下図は2台のスマートフォンでメールの読み込み速度を検証した結果。左のJMAPで接続したメールクライアントは一瞬で読み込みが完了しましたが、右のIMAPを使用しているメールクライアントはかなり時間がかかっています。



複数の端末から接続していても全て同時に新着メールが受信可能。もちろん、一つの端末でメールを削除すると即座に別の端末にも反映されます。こうした、現在では当たり前と思えるような動作がIMAPでは実現しにくくなっていました。



その他、JMAPの利点は下記の通り。

・ステートレスなプロトコル

接続が断続的でもOKで、特にモバイルの場合バッテリーの消費を抑えることが可能です。

・ファイルとフォルダにIDを付与

ユーザーに見えないIDを付与することで名前の変更を容易にできるほか、同期のコストが下がるとのこと。

・バッチ処理も可能

接続したままの状態で順番に命令を行うことも可能ですが、複数の命令を一つのバッチ処理にまとめて行うことも可能です。こうすることで、不安定な接続の中でも複数のメッセージをまとめて削除したりフラグを付けたりする操作が成功しやすくなります。

・差分更新

クライアントは、現在の状態からサーバー上の状態へと同期するのに必要なデータだけを効率的に取得できます。

・データ量を制御可能

クライアントはサーバーがどれだけデータを送ってよいのかを指示できます。

・カスタムパーサー不要

HTTPSおよびJSONというウェブ開発において広く利用されている技術を使用するため、すでに多数のライブラリが存在しています。新たな開発者にとって、はるかに容易にメールサービスを扱えるようになるはずです。

・下位互換性あり

IMAPのフォルダーと、Gmailのラベル形式の両方と下位互換性があり、従来のシステムをサポートしつつJMAPを導入することができます。

・メール送信まで担当可能

IMAPやPOPではメールを送信することができず、送信の際はSMTPという別のプロトコルを使用する必要がありました。そのため、初期設定に失敗して「メールが受信できるのに送信できない」などのトラブルが発生することも。一方JMAPは一つのプロトコルでメールの送信も担当できるため、こうした問題は発生しません。

・HTTPSおよびJSONを使用

多数のライブラリが存在しているだけでなく、ファイアウォールの問題が発生しにくかったり、端末に組み込まれているHTTP接続を効率化する機能に乗っかれたりするという利点があるとのこと。

・バイナリデータを直接送信

従来のメールでは添付ファイルをBase64形式で文字列に変換して送信しますが、変換によって容量が肥大化していました。一方JMAPではバイナリデータをそのままアップロード・ダウンロード可能で、多数の添付ファイルがある場合でも並列処理が可能とのこと。

仕様の詳細はGitHubにてホストされているほか、JMAPを使用してメールクライアントを作成したいという開発者のために、実際に送信されるJSONの例が多数掲載されている開発者ガイドが用意されています。すでにJMAPに対応済みのメールクライアントやサーバー、ライブラリなどの一覧も掲載されており、記事作成時点では下記の通りとなっていました。

◆クライアント

JMAP Demo Webmail (JavaScript, MIT)

JMAP::Tester (Perl, Perl5)

Cypht (PHP & JavaScript)

Ltt.rs (Java, Apache)

Group-Office (Javascript)

meli (Rust, GPLv3)

Mailtemi

tmail-flutter (Dart)

mujmap (Rust)

◆サーバー

JMAP Proxy (Perl, MIT)

Cyrus IMAP (C, BSD-style)

Apache James (Java, Apache)

Group-Office (PHP)

atmail (golang, proprietary)

tmail-backend (Java, Apache)

hyper-auth-proxy (Rust)

Stalwart JMAP (Rust, AGPLv3)

◆ライブラリ

JMAP-JS (JavaScript, MIT)

jmap-client-ts (TypeScript, MIT)

zend-jmap (PHP, New BSD)

Java JMAP Library (Java 7, Apache)

melib (Rust, GPLv3)

jmap-rs (Rust; in development)

jmapc (Python; partially implemented)

jmap-client (Rust, Apache/MIT)

◆プロキシ

Stalwart IMAP (Rust, AGPLv3)

なお、JMAPプロトコルではメール以外にもWebSocket向けのサブプロトコルの策定が完了しているほか、「JMAP Calendars」「JMAP Sharing」「JMAP Contacts」「JMAP Tasks」「JMAP Quotas」など別の用途向けの仕様策定が進行中とのことです。