SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

.NETでPOPサーバからメールを受信する方法

POPサーバからのメールの取得と解釈


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード ソースファイル (63.4 KB)

PopClientクラスの使用例

 サンプルソースコードのPopMailMainクラスのPopTest()メソッドがPopClientクラスの使用例となっています。

PopClientの使用例(C#)
// 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();
PopClientの使用例(VB.NET)
' 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」)はサンプルソースコードと共に含めてあります。

メールの実例(sample1.txt)
メールの実例(sample1.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画像が添付されているメールの例です。

メールの実例(sample2.txt)
メールの実例(sample2.txt)

 この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クラスはそのすべてに対応しているわけではないため、一部解釈できないメールもあるかもしれません。しかし、メールの構造を理解する第一歩にはなるかと思います。

次のページ
Mailクラスの使用例

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

青柳 臣一(アオヤギ シンイチ)

Twiter: https://twitter.com/ShinichiAoyagi中学生のころにプログラミングの楽しさを知り、それ以来趣味として仕事としてプログラミングに関わるようになる。23才のときに株式会社ディーバを設立。CADソフトウエア、給水設備監視システムなどのオリジナルソフトの開発、また、さま...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/477 2006/10/03 10:18

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング