はじめに
.NET Framework 1.0、1.1にはメールを送信するためのSystem.Web.Mail.SmtpMail
クラスが用意されています。.NET Framework 2.0にはSystem.Net.Mail.SmtpClient
クラスが用意されています(なお、2.0にもSystem.Web.Mail.SmtpMail
クラスはありますが、System.Net.Mail.SmtpClient
クラスの使用が推奨されています)。しかし、残念ながらメールを受信するクラスは用意されていません。
そこで、本稿ではTcpClient
クラスを使用して直接メールサーバからメールを受信する方法を解説します。あわせて、受信したメールのヘッダ部分からSubject、From、Toなどのヘッダ情報を取得したり、添付ファイルを取り出したりする方法を解説します。
対象読者
POPサーバからメールを受信する方法を知りたい方を対象としています。
必要な環境
サンプルはVisual Studio .NET 2003で作成され、.NET Framework 1.1で動作確認をしています。また、Visual Studio 2005、.NET Framework 2.0での動作も確認しています。
インターネットメールの仕組み
インターネットメールはSMTPと呼ばれるプロトコルを使ってインターネット内を配送されています。SMTPはSimple Mail Transfer Protocolの頭文字で、文字通り単純なメール転送プロトコルとなっています。ここではSMTPの詳細については省略します。SMTPはRFC 2821などに解説されています。
さて、このようにメールはSMTPを使って配送されるわけですが、SMTPによって配送されるのはSMTPサーバまでです。個々のユーザーまで配送する仕組みは特にありません。実世界に例えると、すべてのメールは郵便局止めになっていて、各家庭や事務所の郵便ポストまでは配達してくれません。ではどうするかと言うと、メールを受け取りたい人がそれぞれ郵便局まで取りに行くことになります。メーラー、メールユーザーエージェント(Mail User Agent: MUA)などと呼ばれる、Outlook Express、Outlook 2003、Mozilla Thunderbird、Becky!といったインターネットメール用のソフトウェアがありますが、これらはいずれも定期的に郵便局(メールサーバ)にメールが届いているかどうかを確認し、必要に応じてメールを取りに行くようになっています。このときに使われるプロトコルの代表的なものがPOPです。POPはPost Office Protocolの頭文字で、文字通り「郵便局プロトコル」です。現在一般的に使われているPOPはバージョン3となっていますので、POP3と表記されることもよくあります(以下、単にPOPと表記しますが、POP3のことと考えていただいて問題ありません)。POPはRFC 1939で解説されています。
なお、インターネットメールはSMTPとPOPを使わなくてはいけないというわけではありません。POPより高機能なIMAP(Internet Message Access Protocol)というプロトコルもあります(RFC 2060)。また、SMTPで配送されたメールをハードディスクにファイルとして保存してそれをテキストエディタで閲覧するといったことも可能です(もちろん、そのようなことができるメールサーバを用意する必要があります)。
このように、インターネットメールの配送にSMTPが使われるのはほぼ確実ですが、SMTPで配送された後のメールをどのように扱うかは非常に自由度が高い仕組みとなっていました。しかし、インターネットサービスプロバイダや企業のメールサーバのように多数の人にメールサービスを提供する場合は統一された手法がないと不便ですので、現在ではメールの送信にはSMTPを、メールの受信にはPOPを使用するのが一般的になっています(もちろん、Webメールと呼ばれるような、ブラウザ上でのみメールサービスを提供している場合は除きます)。また、メーラーもほぼ例外なくSMTPとPOPをサポートしていると言っていい状況になっています。
メール受信時に特定の処理を行うには
特定のメールアドレスにメールが届いたときに、そのメールを自動的に受信してなんらかの処理を行うようなシステムを作成するにはどうすれば良いでしょうか? おそらく次のような方法が考えられるでしょう。
- メールサーバの機能を使う。
- メーラーの機能を使う。
- POPで受信する。
メールサーバの機能を使う
メールサーバ(正確にはSMTPサーバ)には、メールが届いたときに外部プログラムを起動するといった機能を持つものがあります。この機能を使って、メール受信時に処理を行うシステムを作成することができます。メーリングリストというのものをご存知の方も多いでしょう。メーリングリストでは、あるメールアドレスにメールを送ると、あらかじめ登録された会員全員にそのメールが自動的に配送されます。このようなメーリングリスト機能は、メールサーバにメーリングリスト処理を行う外部プログラムを登録して実現されている場合が多くあります。
この外部プログラム起動方式は、メール受信時にすぐさま外部プログラムが呼び出されるのが一般的ですし、必要なときに必要な処理だけを行うようにできます。当然、レスポンスの面でも、メールサーバに与える負荷の面でも、優れたシステムにできる可能性が高いと言えます。しかし、外部プログラムの登録にはメールサーバの設定を変更する必要があり、誤った外部プログラムを登録した場合はメールサービス自体を使用不能に陥らせる危険性もあります。この設定変更を行うには、メールサーバの管理者かそれに匹敵する権限が必要ですし、既存のメールサーバに対して設定を行う場合は細心の注意をして作業する必要があります。そのため残念ながら誰にでもできる方法とは言えません。特にインターネットサービスプロバイダのメールサービスを使用している場合は、外部プログラムを登録することはできないと考えた方がいいかと思います。
この方法の場合、上記の理由により自分の管理下にあるメールサーバが必要になります。また、どのようなことができるのか、どのような外部プログラムを作ればいいのかは使用するメールサーバによって変わってきます。
メーラーの機能を使う
メーラーによってはプラグインのような形で機能を拡張・追加したり、マクロ言語が搭載されていたりします。これらの機能を使ってメール受信時の処理を作りこむことができる場合があります。うまく使えば簡単に目的を実現できる場合もあると思いますが、どのようなことができ、どのようにすればいいのかは完全にメーラーに依存しますので、ここでは解説しません。
POPで受信する
本記事で解説する方法です。メールサーバにTCPで接続し、POPを使用してメールを受信します。この方法は、上記の「メールサーバの機能を使う」のような手法と違い、インターネットを使用してメールサーバに接続できる環境であればどこでも実行することができます。メーラーのメール受信処理のみを自分で実装して実行しているのと変わりません。実際、メールサーバにとってはメーラーからのアクセスと区別がつかないでしょう。
この方法の欠点は、即時性に欠けることです。POPは、メールサーバにメールが届いているかをこちらから問い合わせるようなプロトコルとなっています。ほとんどのメーラーには「新着メールのチェック間隔」のような設定項目があって、どの程度の間隔でメールサーバに問い合わせに行くのかを設定できるようになっています。仮に5分とすると、メールが送られてきてから最大5分は遅延することになります。間隔を短くすれば即時性は高まりますが、極端に短い間隔にするとメールサーバの負荷を高めることにもなりかねないので避けた方がいいでしょう。
インターネットメールはもともと即時性が保障された仕組みではありません。メールがすぐに届くこともありますが、ちょっと時間がかかることも普通にあります。ですから、この即時性に欠けるという点はあまり問題にならないことが多いかと思います。逆に問題になるような場合は、メールを使うということ自体を見直す必要があるでしょう。