増井ラボノート コロンブス日和

第3回Gyamm

URLで紐付けられた世界で

前回の記事でも書いたように、製品にも日記にもレシピにも場所にもURLがついており、あらゆる情報がURLで表現できる時代になってきたと言えるでしょう。

ところが、なぜかメールメッセージにアクセスするのにURLを使うのは一般的ではなく、メール専用のアプリケーションやサービスを利用するのが普通で、何かと不便が多い状況になっています。たとえば、会議やイベントの連絡をメールで受け取ったとき、その内容を表現するURLは存在しませんから、ブックマークできませんし、SNSなどにURLを貼ることができませんし、別のページやWikiなどからリンクを張ることもできません。

メールで個人的に受け取った情報を他人に伝えようとすると、メールを転送したり、SNSにコピー&ペーストしたりしなければなりません。あらゆる情報がWeb上で表現されている現在、情報に直接ブラウザからアクセスできないのはたいへん不便であり、メールで受け取った情報だけが別の世界に存在するように感じられてしまいます

なぜメールが使いにくいのか?

メールとWebの相性が悪い原因は次のようなものだと思われます。

  • メールはWebより前から存在しており、独自の環境で扱われていた
  • メールは個人的な情報のやりとりに使わることが多かったため公開が前提のWebの世界とは別物と考えられていた

このような事情のため、Webと融合する方法があまり工夫されていなかったのでしょう。

メールの普及はWebの普及よりもずっと前のことですので、しかたがなかったかもしれませんが、Webが発明されてから20年以上経過している現在、いつまでもメールを別世界のまま放置しておくわけにはいかないでしょう。何らかの方法での融合が必要だと思われます。

Gyamm――メールメッセージをWebページ化する

メールメッセージを普通のWebページと同じように扱うことができれば、メールの扱いはずっと便利になるはずです。私はメールを簡単にWebページに変換できるGyamm(ギャム)というシステムを作って運用しています図1⁠。

図1 SoftwareDesign@Gyamm.comに送られたメールのリスト
図1 SoftwareDesign@Gyamm.comに送られたメールのリスト

Gyammを使うと、メールメッセージをどこからでもアクセスできるHTMLページに変換することができます。

Gyammの使い方

Gyammの使い方はとても簡単です。メールメッセージを[example@gyamm.com]のようなメールアドレスに送ると、送られたメッセージは[http://gyamm.com/example/]から閲覧できるWebページに変換されます。メールが添付ファイルを含んでいたり、HTMLメールだったりした場合でも、普通にWebページとして閲覧できます。

たとえば、受け取ったHTMLメールを[example@gyamm.com]に送ると、図2のようなWebページが生成されて[http://gyamm.com/example/20151119003655]のようなURLでアクセスできます。メールの情報を簡単な手間でWebで公開できたことになります。

図2 書店からの案内メール
図2 書店からの案内メール

添付ファイルがある場合は「▶」の右にファイル名が表示されます図3⁠。

図3 添付ファイルつきのHTMLメール
図3 添付ファイルつきのHTMLメール

Gyammの利用例

Gyammは、次のようなさまざまな用途に利用できます。

情報の公開/共有

受け取ったメールをそのままの形式で、Webページで公開するのは普通は簡単ではありませんが、Gyammを利用すれば、HTMLメールも添付ファイルつきメールもWebページに変換して、ブックマークしたり他人と共有したりできます。

メーリングリストのアーカイブ

xxxxという名前のメーリングリストのメンバとして[xxxx-archive@gyamm.com]のようなアドレスを登録しておくと、メーリングリストのあらゆるメッセージが[xxxx-archive@gyamm.com]に送られ、その結果全メッセージが[http://gyamm.com/xxx-archive/]に蓄積されるので、メッセージのアーカイブとして利用できます。

フロー情報のストック化

宴会などの案内がメールで送られてくることはよくありますが図4⁠、こういうフロー情報をWebページのようなストック情報に変換しておくと、後でアクセスしやすくなって便利です。

図4 宴会案内メールをWebページに変換したもの
図4 宴会案内メールをWebページに変換したもの

情報の集約

何かのトピックに関して、いろいろな人からメールを受け取ったとき、それを全部[specialtopic@gyamm.com]のようなアドレスに転送するようにしておけば、関連するあらゆるメールを[http://gyamm.com/special-topic/]からアクセスできるようになります。アンケートやレポートをメールで集計するような場合に便利です。

情報の分類管理

仕事に関するメールなど、やらなければならない仕事は全部[masui-todo@gyamm.com]に転送することにしておけば、やらなければならない仕事をすべてGyamm上にリストできます。Gyammではメールが表示されないように指定できるので、終わった仕事に関するメールは非表示にしておけば良いでしょう。同様に、トピックごとに別のGyammアドレスに送るようにすれば、フォルダのように管理できます。

Gyammの実装

Gyammは次のように実装されています。

  • ① SMTPを解釈するGyammサーバをgyamm.comで動かし、⁠???@gyamm.com]宛のメールをすべて受け取る
  • ②届いたメッセージを解析してHTMLに変換する

SMTP(Simple Mail Transfer Protocol)はインターネットのメール転送で標準的に利用されているプロトコルで、各種のメール送信アプリケーションやPostfixのようなメール転送エージェント(MTA)で広く利用されています。Gyammはメールサーバではありませんが、SMTPを解釈してメールサーバのふりをすることによって、Gyamm.comへのメールを受け取って処理しています。

SMTPサーバの実装

SMTPの仕様はRFC821で定義されています。SMTPサーバには25番ポートを利用して図5のように対話的にアクセスできます(太字がユーザ入力です⁠⁠。

図5 telnetでメールサーバにアクセスしてみる
% telnet gyamm.com 25
Trying 133.242.135.184...
Connected to gyamm.com.
Escape character is '^]'.
220 gyamm.com ESMTP GYAMM
HELO example.com
250 gyamm.com
MAIL FROM: masui@pitecan.com
250 ok
RCPT TO: masui@example.com
250 ok

DATA
354 send the mail data, end with .
From: masui@pitecan.com
To: masui@example.com

Hello
.
250 ok
QUIT
221 Bye
Connection closed by foreign host.
%

正式なSMTPサーバはメール転送などの処理をする必要がありますが、Gyammサーバはメールを受け取ってデータを処理するだけですので、実装はそれほど複雑ではありません。図5のようなやりとりができるようにするために、表1のような一部のSMTPコマンドを解釈するコードを実装しておけば大丈夫です。

表1 SMTPの仕様の一部
HELO通信開始
MAIL送信アドレスを指定
RCPT受信アドレスを指定
DATAメッセージ本文を指定
QUIT通信切断

メールをHTMLに変換

DATAコマンドによってメールのメッセージの本体が送られます。Subject:From:のようなメールヘッダもこの中に含まれます。メールのヘッダと中身を適切にデコードして解析してHTMLに変換することによって、Webブラウザから読めるようになります。

MIME

日本語を含むタイトルや添付ファイルを利用するときMIME形式へのエンコーディングが用いられています。

メールのSubject(タイトル)に日本語を利用したり、画像や文書などをメールに添付するのは現在あたりまえになっていますが、もともとのメールの仕様ではタイトルも本文もASCII文字しか利用できませんでした。インターネットのメールが世の中に普及しはじめた1980年代は、メールの本文にJISコードを利用することにより、なんとか日本語のメッセージを送ることはできましたが、正式な仕様ではないので微妙なところがありました。また、パソコン通信などの非インターネットの世界では、タイトルや本文にShiftJISの日本語テキストが利用されていることが多く、メールの世界はかなり混沌とした状態になっていました。

1990年代のはじめまではそういう状況が続いていたのですが、1996年にMIME規格がRFC2045として制定されたおかげで、既存のメール配信システムを変更することなく、以下のような手法でさまざまなマルチメディアデータをエンコードしてメールメッセージとして送れるようになっています。

データ型の指定

Content-Type:フィールドでデータ型や文字コードを指定する

データのエンコード

画像や文書など任意のデータをテキスト形式に変換する方法を定義

データの階層的な構造化

マルチパートというデータ型で複数のデータをまとめて扱う。複数のパートをまとめたデータを上位データのパートとすることもできるので階層的なデータ構造を表現できる

ヘッダの国際化

任意の文字コードをヘッダで利用できるエンコード方式を定義

MIMEのデコード

Gyammでは、MIME形式で送られてきたメールをデコードして、人間が読める形に変換しています。テキストは普通のHTMLテキストに変換し、それ以外のものは添付ファイルとしてリストするようにしています。

MIME形式で送られてきたメールメッセージをHTMLファイルに変換するには次の処理が必要です。

ヘッダ文字列のデコード

日本語タイトルなどをデコードする

MIMEパートの分離/デコード

階層的にパートを分離しつつ、データをデコードして添付ファイルなどを取り出す

埋め込み画像の変換

1つのパートに含まれるHTMLファイルから、別のパートに含まれる画像を参照する場合はContent-IDを利用した特殊なimgタグが利用されるので、これを通常のimgタグに変換する

Gyammの将来

Gyammを使うのは簡単なのですが、SMTPやMIMEの扱いのため実装は若干複雑になってしまい、コロンブス指数が低いものになってしまったのは残念なところです。そもそもMIMEフォーマットはマルチメディアデータを無理矢理テキストに埋め込むための苦肉の策であり、最善のものではありませんし、将来のコミュニケーションはすべてWebベースになるでしょうから、メールは次第に廃れていくと考えられ、Gyammのようなシステムも不要になると思われます。しかしメールが完全になくなるにはまだ10年はかかるでしょうから、それまでは十分利用価値があると思います。

Software Design

本誌最新号をチェック!
Software Design 2022年9月号

2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    MySQL アプリ開発者の必修5科目
    不意なトラブルに困らないためのRDB基礎知識
  • 第2特集
    「知りたい」⁠使いたい」⁠発信したい」をかなえる
    OSSソースコードリーディングのススメ
  • 特別企画
    企業のシステムを支えるOSとエコシステムの全貌
    [特別企画]Red Hat Enterprise Linux 9最新ガイド
  • 短期連載
    今さら聞けないSSH
    [前編]リモートログインとコマンドの実行
  • 短期連載
    MySQLで学ぶ文字コード
    [最終回]文字コードのハマりどころTips集
  • 短期連載
    新生「Ansible」徹底解説
    [4]Playbookの実行環境(基礎編)

おすすめ記事

記事・ニュース一覧