Smdn.Net.Imap4.Client

C#で書いた.NET Framework/Mono用IMAP4rev1クライアントライブラリです。 IMAPサーバからのメールボックスの管理(作成・削除・ステータスの取得など)、メッセージの検索・取得・アップロードなどが出来ます。

ダウンロード

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

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

機能と特徴

主な機能

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

その他、サポートしている機能の詳細は機能一覧をご覧ください。

クライアント実装

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

ImapClientクラス
メールボックス/メッセージをSystem.IO.DirectoryInfo/FileInfoクラスに似たインターフェイスで操作できるようにIMAP操作を抽象化したクライアント
ImapSessionクラス
IMAPコマンドと1対1に対応するメソッドを持つクライアント
ImapWebRequest/ImapWebResponseクラス
WebRequest/WebResponseクラスから派生し、IMAP URL(RFC 5092)での操作に対応したクライアント (別アセンブリSmdn.Net.Imap4.WebClientsで提供)

その他の主な特徴

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

使い方・サンプルコード

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

  • C#
  • VB
using System;

using Smdn.Net.Imap4.Client;
using Smdn.Net.Imap4.Protocol.Client;

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

    using (var client = new ImapClient(new Uri("imaps://username@imap.gmail.com/"))) {
      client.Connect("password");

      using (var inbox = client.OpenInbox()) {
        var message = inbox.GetMessageBySequence(inbox.ExistMessageCount);

        message.Save(message.EnvelopeSubject + ".eml");
      }
    }
  }
}
using System;

using Smdn.Net.Imap4.Client;
using Smdn.Net.Imap4.Protocol.Client;

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

    using (var client = new ImapClient(new Uri("imaps://username@imap.gmail.com/"))) {
      client.Connect("password");

      using (var inbox = client.OpenInbox()) {
        var message = inbox.GetMessageBySequence(inbox.ExistMessageCount);

        message.Save(message.EnvelopeSubject + ".eml");
      }
    }
  }
}
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Imports Smdn.Net.Imap4.Client
Imports Smdn.Net.Imap4.Protocol.Client

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

    Using client As New ImapClient(New Uri("imaps://username@imap.gmail.com/"))
      client.Connect("password")

      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
        Dim message As ImapMessageInfo = inbox.GetMessageBySequence(inbox.ExistMessageCount)

        message.Save(message.EnvelopeSubject + ".eml")
      End Using
    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.Imap4.Client
Imports Smdn.Net.Imap4.Protocol.Client

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

    Using client As New ImapClient(New Uri("imaps://username@imap.gmail.com/"))
      client.Connect("password")

      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
        Dim message As ImapMessageInfo = inbox.GetMessageBySequence(inbox.ExistMessageCount)

        message.Save(message.EnvelopeSubject + ".eml")
      End Using
    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をご覧ください。

不具合・要望・質問等

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

  • 既知の不具合
    • GMailにアップロードしたメッセージのBODYSTRUCTUREが正しくパースできない

動作状況

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

  • GMail (Gimap)
  • AIM Mail
  • 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接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。

参考文献

asin:4873110289