PopClientクラスの使用例
サンプルソースコードのPopMailMain
クラスのPopTest()
メソッドがPopClient
クラスの使用例となっています。
// POP サーバに接続します。 PopClient pop = new PopClient("POPサーバ", 110); // ログインします。 pop.Login("ユーザー名", "パスワード"); // POP サーバに溜まっているメールのリストを取得します。 ArrayList list = pop.GetList(); for (int i = 0; i < list.Count; ++i) { // メール本体を取得します。 string mail = pop.GetMail((string)list[i]); // メールを処理します。 // メールを POP サーバから取得します。 pop.DeleteMail((string)list[i]); } // 切断します。 pop.Close();
' POP サーバに接続します。 Dim pop As PopClient = New PopClient("POPサーバ", 110) ' ログインします。 pop.Login("ユーザー名", "パスワード") ' POP サーバに溜まっているメールのリストを取得します。 Dim list As ArrayList = pop.GetList() For i As Integer = 0 To list.Count - 1 ' メール本体を取得します。 Dim mail As String = pop.GetMail(CType(list(i), String)) ' メールを処理します。 ' メールを POP サーバから取得します。 pop.DeleteMail(CType(list(i), String)) Next ' 切断します。 pop.Close()
この使用例では、POPに貯まっているすべてのメールを取得して、なんらかの処理を行っています。上記の例ではコメントのみでなんの処理も行っていませんが、本来ならメールの内容を解釈し、それに応じてなんらかの処理を行うことになるでしょう。ダウンロードできるサンプルソースコードでは、処理する代わりに適当なファイル名で保存するようになっています。
それでは引き続きメールを解釈する方法について解説します。
POPから取得したメールの解釈
POPからメールを取得することができたので、続いて取得したメールを解釈します。サンプルソースコードのMail
クラスはメールの内容を解釈し、簡単に使用できるようにするクラスです。
メールの構造
まずは、POPサーバから受け取ったメール本体がどのような構造になっているか見てみましょう。なお、下記のメールの実例(「sample1.txt」と「sample2.txt」)はサンプルソースコードと共に含めてあります。
上記はかなり単純化したメール本体の例です。メールはヘッダ部とボディ部にわかれています。最初の空行までがヘッダ部でそれ以降がボディ部です。上記の例では8行目までがヘッダ部、以降がボディ部となります。
メールヘッダの各項目は「項目名:内容」という形式になっています。ヘッダ部の形式や項目の詳細についてはRFC 2822などにまとめられています。To(宛先)、From(差出人)、Subject(件名)などのように比較的分かりやすい名前が付いているので、大体の意味は分かるでしょう。通常は1つの項目が1行になるのですが、1行に収まりきらない場合(上記の例のSubject、Content-Type)、継続行の行頭が空白(タブか半角スペース)になります。
メールボディはメールの本文です。日本語のメールの場合、多くはiso-2022-jpが使われています。どのようなコードが使われているかはヘッダ部のContent-Typeのcharsetを参照することにより分かります。なお、上記の例で[ESC]と書かれている部分は実際にはエスケープコード(ASCIIコード 1B)です。また、本文2行目はピリオド2つで始まる行です。POPから取得した状態では終端と間違うのを防ぐためにピリオド2つになっています。
Content-Typeの記述方法やそれに合わせたメールボディの形式は、MIME(Multipurpose Internet Mail Extensions)と呼ばれる仕様にまとめられています。また、上記の例のFrom、To、Subjectには日本語が使われていますが、この日本語部分の記述方法もMIMEによって決められています。MIMEの仕様は多岐に渡るため、主要なものだけでも次のように複数に分かれています。また、これら以外にもMIME関連のRFCはたくさんあります。
添付ファイル
次に、メールに添付ファイルがある場合を見てみます。以下の例はGIF画像が添付されているメールの例です。
このboundaryはメールごとに変わりますし、形式もいろいろなものがあります。
boundaryで分割された部分は、それぞれヘッダ部、ボディ部で構成されています。最初のパートはContent-Typeがtext/plainとなっていますので普通のテキストであると分かります。この部分はiso-2022-jpにエンコードされたメール本文です。次のパートはimage/gifとなっていて、これが添付されたGIF画像です。GIF画像のようなバイナリファイルは、そのままメールの本文として表現することができないため、何らかのエンコードを行う必要があります。メールの場合はBASE64というエンコード方式を使うのが一般的になっています。エンコード方式はContent-Transfer-Encodingを見ると分かります。BASE64はさほど複雑なエンコード方式ではありませんが、.NET FrameworkではConvert.FromBase64String
メソッド、Convert.ToBase64String
メソッドが用意されているので簡単に変換することができます。
サンプルソースコードのMail
クラスは上記のようなメール本体を受け取って解釈します。ただし、メール本体の構造は非常に柔軟性がありますし、関連するRFCも多岐にわたります。Mail
クラスはそのすべてに対応しているわけではないため、一部解釈できないメールもあるかもしれません。しかし、メールの構造を理解する第一歩にはなるかと思います。