Smdn.Net.Pop3.Client

C#で書いた.NET Framework/Mono用POP3クライアントライブラリです。 POPサーバからのメールボックスのステータス取得、メッセージのダウンロード・削除が出来ます。

ダウンロード

本ライブラリはMIT X11ライセンスでのリリースとなります。

最新版 (ソースコード)
Smdn.Net.Pop3.Client-1.10.tar.bz2 196.4kB [MD5] ce54283521d809a5d3ef5c322106af06
開発版
http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/よりチェックアウトできます
ビルド済みパッケージ・過去のバージョン
リリース一覧をご覧ください

機能と特徴

主な機能

  1. すべての標準コマンドといくつかの拡張コマンドの送受信
  2. SSL/TLS接続(POP over SSL, STLS)
  3. APOP
  4. SASL認証メカニズム(DIGEST-MD5他)

その他、サポートしている機能の詳細は「実装済み機能一覧」の項をご覧ください。

クライアント実装

クライアント実装として以下の3つのクラスを用意しています。

PopClientクラス
メッセージをSystem.IO.FileInfoクラスに似たインターフェイスで操作できるようにPOP操作を抽象化したクライアント
PopSessionクラス
POPコマンドと1対1に対応するメソッドを持つクライアント
PopWebRequest/PopWebResponseクラス
WebRequest/WebResponseクラスから派生し、POP URL(RFC 2384)での操作に対応したクライアント (別アセンブリSmdn.Net.Pop3.WebClientsで提供)

その他の主な特徴

メッセージ本文はStreamとして取得可能
メッセージの加工・解析は任意の手段を使用できるよう、Streamとして返します。 MIMEメッセージのデコード機能は含んでいません。
StreamReader, Regexは不使用
送受信時の文字列処理はstringではなくbyte[]のまま処理しています。 byte[]⇄stringの変換に起因する不必要なメモリの消費と速度の低下はできる限り抑えてあります。 また、大きなメッセージを取得してもLarge Object Heapを消費しないよう実装しています。
ログ出力にTraceSourceを使用
送受信内容・動作状況のログをTraceListenerで取得できます。 またログ出力のレベルを設定できます。 イベントハンドラによる送受信時のフックは無駄と考え用意していません。
パース済みのレスポンスにアクセス可能
受信したレスポンスは必要な部分だけを拾い読みして結果を返すのではなく、全てパースしてから結果を返します。
フリー・オープンソース
本ライブラリはMIT X11ライセンスを採用しています。

使い方・サンプルコード

もっとも簡単なサンプルコードとして、PopClientクラスを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、最後に受信したメッセージをダウンロードしてファイルに保存したあと削除するサンプルです。

  • C#
  • VB
using System;

using Smdn.Net.Pop3.Client;
using Smdn.Net.Pop3.Protocol.Client;

class GpopRetrieveExample {
  public static void Main()
  {
    PopConnection.ServerCertificateValidationCallback += delegate {
      return true;
    };

    using (var client = new PopClient(new Uri("pops://username@pop.gmail.com/"))) {
      client.Connect("password");

      client.DeleteAfterRetrieve = true;

      client.DownloadLastMessageToFile("message.eml");

      client.Logout();
    }
  }
}
using System;

using Smdn.Net.Pop3.Client;
using Smdn.Net.Pop3.Protocol.Client;

class GpopRetrieveExample {
  public static void Main()
  {
    PopConnection.ServerCertificateValidationCallback += delegate {
      return true;
    };

    using (var client = new PopClient(new Uri("pops://username@pop.gmail.com/"))) {
      client.Connect("password");

      client.DeleteAfterRetrieve = true;

      client.DownloadLastMessageToFile("message.eml");

      client.Logout();
    }
  }
}
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Imports Smdn.Net.Pop3.Client
Imports Smdn.Net.Pop3.Protocol.Client

Class GpopRetrieveExample
  Public Shared Sub Main(ByVal args As String())
    PopConnection.ServerCertificateValidationCallback = AddressOf ValidateRemoteCertificate

    Using client As New PopClient(New Uri("pops://username@pop.gmail.com/"))
      client.Connect("password")

      client.DeleteAfterRetrieve = true

      client.DownloadLastMessageToFile("message.eml")

      client.Logout()
    End Using
  End Sub

  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
                                                    ByVal certificate As X509Certificate, _
                                                    ByVal chain As X509Chain, _
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
    Return True
  End Function
End Class
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Imports Smdn.Net.Pop3.Client
Imports Smdn.Net.Pop3.Protocol.Client

Class GpopRetrieveExample
  Public Shared Sub Main(ByVal args As String())
    PopConnection.ServerCertificateValidationCallback = AddressOf ValidateRemoteCertificate

    Using client As New PopClient(New Uri("pops://username@pop.gmail.com/"))
      client.Connect("password")

      client.DeleteAfterRetrieve = true

      client.DownloadLastMessageToFile("message.eml")

      client.Logout()
    End Using
  End Sub

  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
                                                    ByVal certificate As X509Certificate, _
                                                    ByVal chain As X509Chain, _
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
    Return True
  End Function
End Class

詳細・その他のサンプルコードはドキュメント・サンプルおよびデモ用アプリケーションMRAConnector, SimpleMailerをご覧ください。

不具合・要望・質問等

不具合の報告、ライブラリに対する要望や提案、使い方の質問などは掲示板へどうぞ。

動作状況

以下のPOPサーバに対して概ね問題なく動作することを確認済みです。

  • GMail (Gpop)
  • Dovecot (1.2.11, 2.0.8)

以下の環境で概ね問題なく動作することを確認済みです。 テストはしていますが、予期しないバグがあるかもしれません。

  • .NET Framework 4
  • .NET Framework 3.5 SP 1
  • Mono 2.8.2
  • Mono 2.6.7

制限事項・特記事項

  • MIMEメッセージのデコード機能は含んでいません。 デコード機能が必要な場合は他のライブラリか、Smdn.Formats.Mimeを使ってください。
  • SASLの実装は、本体とは別ライブラリのSmdn.Security.Authentication.Saslに含まれています。
  • 実装にあたり、セキュリティ上の考慮はしていますが、十分な検証は行っていないため保証はできません。 SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。

実装済み機能一覧

サポートするPOP標準仕様・拡張仕様の一覧です。

implemented
実装済みの機能
一部不完全な箇所があったり、仕様と異なる実装になっているかもしれません
partially implemented
部分的に実装済みの機能
コマンドの送受信のみサポートする、仕様の一部のみをサポートする、などの状態です
not tested
実装済みだが動作確認できていない機能
not implemented
実装されていない機能
RFC status note
RFC status note
[RFC 1939] Post Office Protocol - Version 3 implemented
[RFC 2384] POP URL Scheme implemented [独自拡張]URLのスキームがpopsの場合、デフォルトポートとして995を使用し、SSLによる接続を試みます。 また、修飾子;MSG=が含まれている場合、メールボックス内の特定のメッセージを表すURLとして解釈します。
[RFC 2449] POP3 Extension Mechanism partially implemented LOGIN-DELAY, PIPELINING, EXPIREに関連する機能は未実装です。 また、レスポンスコードが含まれていても通常のレスポンスと同様*1に扱います。
[RFC 2595] Using TLS with IMAP, POP3 and ACAP implemented
[RFC 3206] The SYS and AUTH POP Response Codes partially implemented レスポンスコードが含まれていても通常のレスポンスと同様*1に扱います。
[RFC 5034] The Post Office Protocol (POP3) Simple Authentication and Security Layer (SASL) Authentication Mechanism implemented
[RFC 5721] POP3 Support for UTF-8 not implemented
通常のレスポンスと同様*1
そのレスポンスを受信したということだけを検知します。 レスポンスに応じた処理を行うといったことはしません。

関連リンク

参考文献

asin:4873110289