Smdn.Net.Imap4.WebClientsのドキュメントのアーカイブです。 Smdn.Net.Imap4.WebClientsは現在開発を停止しているので、Smdn.Net.Imap4.Clientを使用してください。 ソースコードおよびビルド済みDLLパッケージの配布はリリース一覧 §.Smdn.Net.Imap4.WebClientsにて継続しています。

概要

C#で書いた.NET Framework/Mono用IMAP4rev1クライアントライブラリです。 Smdn.Net.Imap4.ClientをラップしてSystem.Net.WebRequest/System.Net.WebResponseを使ってIMAPの操作を行えるようにしたものです。 メッセージのダウンロードにWebClientクラスのメソッドを使うこともできます。 IMAP URL(RFC 5092)を用いたリクエストに対応していて、System.Net.FtpWebRequest等と同様にWebRequest.Methodプロパティで送信するコマンドを制御できます。

導入

もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとIMAP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。

using System;
using System.Net;

using Smdn.Net.Imap4.WebClients;

class GimapFetchExample {
  static void Main()
  {
    ImapWebRequestCreator.RegisterPrefix();
    ImapSessionManager.ServerCertificateValidationCallback += delegate {
      return true;
    };

    using (var client = new WebClient()) {
      client.Credentials = new NetworkCredential("username", "password");
      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml");
    }
  }
}
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Imports Smdn.Net.Imap4.WebClients

Class GimapFetchExample
  Shared Sub Main()
    ImapWebRequestCreator.RegisterPrefix()
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)

    Using client As New WebClient()
      client.Credentials = New NetworkCredential("username", "password")
      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml")
    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

ライブラリの詳細については§.ImapWebRequest/ImapWebResponseクラス、この他のサンプルコードについては§.サンプルコードを参照してください。 また、本ライブラリのデモ用アプリケーションTundereBirdもあわせてご覧ください。

サンプルコード

個々のクラス・メソッド・プロパティについての解説は後述します。 サンプルコード中では証明書の検証を省略している箇所がありますが、実際に使用するコードでは必ず適切な検証を行うように書き換えてください。

メッセージをダウンロードしてファイルに保存する

using System;
using System.Net;

using Smdn.Net.Imap4.WebClients;

class Sample {
  static void Main(string[] args)
  {
    ImapWebRequestCreator.RegisterPrefix();

    using (var client = new WebClient()) {
      client.Credentials = new NetworkCredential("user", "pass");

      // INBOXにあるUIDが1のメッセージをダウンロードしてファイルsample.emlに保存
      client.DownloadFile("imap://user;AUTH=DIGEST-MD5@localhost/INBOX/;UID=1", "sample.eml");
    }
  }
}
Imports System
Imports System.Net

Imports Smdn.Net.Imap4.WebClients

Class Sample
  Shared Sub Main(ByVal args As String())
    ImapWebRequestCreator.RegisterPrefix()

    Using client As New WebClient()
      client.Credentials = New NetworkCredential("user", "pass")

      ' INBOXにあるUIDが1のメッセージをダウンロードしてファイルsample.emlに保存
      client.DownloadFile("imap://user;AUTH=DIGEST-MD5@localhost/INBOX/;UID=1", "sample.eml")
    End Using
  End Sub
End Class

メッセージをアップロードする

using System;
using System.IO;
using System.Net;

using Smdn.Net.Imap4.WebClients;

class Sample {
  static void Main(string[] args)
  {
    ImapWebRequestCreator.RegisterPrefix();

    using (var client = new WebClient()) {
      client.Credentials = new NetworkCredential("user", "pass");

      // ファイルsample.emlの内容をINBOXにアップロード
      client.UploadData("imap://user;AUTH=DIGEST-MD5@localhost/INBOX", ImapWebRequestMethods.Append, File.ReadAllBytes("sample.eml"));
    }
  }
}
Imports System
Imports System.IO
Imports System.Net

Imports Smdn.Net.Imap4.WebClients

Class Sample
  Shared Sub Main(ByVal args As String())
    ImapWebRequestCreator.RegisterPrefix()

    Using client As New WebClient()
      client.Credentials = New NetworkCredential("user", "pass")

      ' ファイルsample.emlの内容をINBOXにアップロード
      client.UploadData("imap://user;AUTH=DIGEST-MD5@localhost/INBOX", ImapWebRequestMethods.Append, File.ReadAllBytes("sample.eml"))
    End Using
  End Sub
End Class

メッセージの検索

using System;
using System.Net;

using Smdn.Net.Imap4.WebClients;

class Sample {
  static void Main(string[] args)
  {
    ImapWebRequestCreator.RegisterPrefix();
    ImapSessionManager.ServerCertificateValidationCallback = delegate {
      // 証明書の検証は省略 (エラーを無視してすべて受け入れる)
      return true;
    };

    // GmailアカウントのINBOXから、件名に[Mono-dev]を含むメールの一覧を取得する
    var request = WebRequest.Create("imaps://user@imap.gmail.com/INBOX?SUBJECT \"[Mono-dev]\"");

    request.Credentials = new NetworkCredential("user", "pass");

    using (var response = request.GetResponse() as ImapWebResponse) {
      foreach (var message in response.MessageAttributes) {
        // 取得したメッセージのURLを表示
        Console.WriteLine(message.Url);
      }
    }
  }
}
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients

Class Sample
  Shared Sub Main(ByVal args As String())
    ImapWebRequestCreator.RegisterPrefix()
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)

    ' GmailアカウントのINBOXから、件名に[Mono-dev]を含むメールの一覧を取得する
    Dim request As WebRequest = WebRequest.Create("imaps://user@imap.gmail.com/INBOX?SUBJECT ""[Mono-dev]""")

    request.Credentials = New NetworkCredential("user", "pass")

    Using response As ImapWebResponse = DirectCast(request.GetResponse(), ImapWebResponse)
      For Each message As IImapMessageAttribute In response.MessageAttributes
        ' 取得したメッセージのURLを表示
        Console.WriteLine(message.Url)
      Next
    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

メッセージのコピー

INBOXにあるメッセージすべてをINBOX.backupにコピーする例。 AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。

using System;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;
  :

var request = WebRequest.Create("imap://user@localhost/INBOX?ALL") as ImapWebRequest;

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Copy;
request.AllowCreateMailbox = true;
request.DestinationUri = new Uri("imap://user@localhost/INBOX.backup");

using (var response = request.GetResponse()) {
  :
  :
}
Imports System
Imports System.Net
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients
  :

Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX?ALL"), ImapWebRequest)

request.Credentials = New NetworkCredential("user", "pass")
request.Method = ImapWebRequestMethods.Copy
request.AllowCreateMailbox = True
request.DestinationUri = New Uri("imap://user@localhost/INBOX.backup")

Using response As WebResponse = request.GetResponse()
  :
  :
End Using

メールボックスの削除

メールボックスINBOX.oldを削除する例。 ExpectedErrorResponseCodesプロパティにImapResponseCode.NonExistentを指定しておくことで、メールボックスが存在しない場合(サーバがレスポンスコードNONEXISTENTを返した場合)でもWebExceptionをスローしないようにします。

using System;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.Protocol;
using Smdn.Net.Imap4.WebClients;
  :

var request = WebRequest.Create("imap://user@localhost/INBOX.old") as ImapWebRequest;

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Delete;
request.ExpectedErrorResponseCodes = new[] {ImapResponseCode.NonExistent};

using (var response = request.GetResponse()) {
  :
  :
}
Imports System
Imports System.Net
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.Protocol
Imports Smdn.Net.Imap4.WebClients
  :

Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX.old"), ImapWebRequest)

request.Credentials = New NetworkCredential("user", "pass")
request.Method = ImapWebRequestMethods.Delete
request.ExpectedErrorResponseCodes = New ImapResponseCode() {ImapResponseCode.NonExistent}

Using response As WebResponse = request.GetResponse()
  :
  :
End Using

メールボックスの作成

メールボックスINBOX.newを作成する例。 先の例と同様に、メールボックスがすでに存在する場合(サーバがレスポンスコードALREADYEXISTSを返した場合)でもWebExceptionをスローしないようにします。

using System;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.Protocol;
using Smdn.Net.Imap4.WebClients;
  :

var request = WebRequest.Create("imap://user@localhost/INBOX.new") as ImapWebRequest;

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Create;
request.ExpectedErrorResponseCodes = new[] {ImapResponseCode.AlreadyExists};

using (var response = request.GetResponse()) {
  :
  :
}
Imports System
Imports System.Net
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.Protocol
Imports Smdn.Net.Imap4.WebClients
  :

Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX.new"), ImapWebRequest)

request.Credentials = New NetworkCredential("user", "pass")
request.Method = ImapWebRequestMethods.Create
request.ExpectedErrorResponseCodes = New ImapResponseCode() {ImapResponseCode.AlreadyExists}

Using response As WebResponse = request.GetResponse()
  :
  :
End Using

メッセージの検索

ImapStyleUriBuilderを使って、複雑な検索クエリを含むリクエストを送信する例。

using System;
using System.Net;
using System.Text;

using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;
  :

var builder = new ImapUriBuilder("imap://user@localhost/INBOX");

builder.SearchCriteria = (ImapSearchCriteria.From("差出人") & ImapSearchCriteria.SentBefore(new DateTime(2010, 02, 06)))
                       | (ImapSearchCriteria.Unseen & !ImapSearchCriteria.Subject("未承諾広告"));
builder.Charset = Encoding.GetEncoding(932);

var request = WebRequest.Create(builder.Uri) as ImapWebRequest;

request.Credentials = new NetworkCredential("user", "pass");

using (var response = request.GetResponse()) {
  :
  :
}
Imports System
Imports System.Net
Imports System.Text

Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients
  :

Dim builder As New ImapUriBuilder("imap://user@localhost/INBOX")

builder.SearchCriteria = (ImapSearchCriteria.From("差出人") And ImapSearchCriteria.SentBefore(New DateTime(2010, 2, 6))) _
                         Or _
                         (ImapSearchCriteria.Unseen And Not ImapSearchCriteria.Subject("未承諾広告"))
builder.Charset = Encoding.GetEncoding(932)

Dim request As ImapWebRequest = DirectCast(WebRequest.Create(builder.Uri), ImapWebRequest)

request.Credentials = New NetworkCredential("user", "pass")


Using response As WebResponse = request.GetResponse()
  :
  :
End Using

この例で指定している検索クエリは、

  1. fromが'差出人'かつ送信日が2010年2月6日以前、もしくは
  2. 未読で件名に'未承諾広告'を含まない

となる。

メッセージへのフラグの設定

fromにspammer.example.comを含むメッセージをすべて既読にし、Thunderbirdの迷惑メールのマーク(Junk)を設定する例。 ImapStoreDataItem.ReplaceFlagsメソッドを使って新しく置き換える(設定する)フラグを作成し、StoreDataItemプロパティにしています。

using System;
using System.Net;

using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;
  :

var request = WebRequest.Create("imap://user@localhost/INBOX?from spammer.example.com") as ImapWebRequest;

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Store;
request.StoreDataItem = ImapStoreDataItem.ReplaceFlags(new[] {"Junk"}, ImapMessageFlag.Seen);

using (var response = request.GetResponse()) {
  :
  :
}
Imports System
Imports System.Net

Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients
  :

Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX?from spammer.example.com"), ImapWebRequest)

request.Credentials = New NetworkCredential("user", "pass")
request.Method = ImapWebRequestMethods.Store
request.StoreDataItem = ImapStoreDataItem.ReplaceFlags(New String() {"Junk"}, ImapMessageFlag.Seen)

Using response As WebResponse = request.GetResponse()
  :
  :
End Using

ImapWebRequest/ImapWebResponseクラス

ここではImapWebRequest/ImapWebResponseクラスおよびSmdn.Net.Imap4.WebClients名前空間のクラスの詳細と使い方を紹介します。

概説

本ライブラリはSmdn.Net.Imap4.Clientのクラスをラップして実装しています。 そのため、基本的な機能と動作についてはSmdn.Net.Imap4.Clientの解説をご覧ください。 ここではSmdn.Net.Imap4.WebClientsおよびImapWebRequest/ImapWebResponseクラスに固有な部分を中心に解説します。

基本的にはHttpWebRequest/ResponseやFtpWebRequest/Responseを用いた操作と同様で、

  1. リクエストURLを指定してWebRequest.CreateメソッドでImapWebRequestのインスタンスを作成
  2. Method、Credentialsなどのプロパティを指定
  3. ImapWebRequest.GetResponseでリクエストを実行、レスポンスを取得
  4. 取得したImapWebResponseインスタンスを参照、必要に応じてImapWebResponse.GetResponseStreamメソッドを呼び出す

の順でIMAPコマンドを実行、レスポンスを取得します。

imap, imapsスキームの登録

WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるように、ImapWebRequest/ImapWebResponseクラスを使う前にImapWebRequestCreator.RegisterPrefixメソッドを呼び出しておく必要があります。

このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、imapスキームおよびimapsスキームに対してImapWebRequestCreatorを関連付けます。

記述例
using System;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;

  :
  :
// imapおよびimapsスキームの登録
ImapWebRequestCreator.RegisterPrefix();

// ImapWebRequestインスタンスの作成
var request = WebRequest.Create("imap://user@imap.example.net/");
  :
  :
記述例
Imports System
Imports System.Net
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients

  :
  :
' imapおよびimapsスキームの登録
ImapWebRequestCreator.RegisterPrefix()

' ImapWebRequestインスタンスの作成
Dim request As WebRequest = WebRequest.Create("imap://user@imap.example.net/")
  :
  :

リクエストURLと接続・認証時の動作

接続と認証

接続・認証時の動作は、リクエストURLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。

リクエストURLで記述されない接続・認証時の動作は、ImapWebRequestクラスのプロパティで指定できますImapWebRequestのプロパティも合わせて参照してください

接続・認証時の動作を指定するImapWebRequestクラスのプロパティ
プロパティ 解説
Credentials 認証時に使用する資格情報(パスワード等)を指定します (ImapWebRequest.CredentialsプロパティはWebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、設定されるインスタンスはICredentialsByHostも実装している必要があります)
UseTlsIfAvailable 認証を開始する前に、可能ならSSL/TLSへアップグレードするかどうかを指定します
UsingSaslMechanisms 認証時に試行する認証メカニズムを指定します
AllowInsecureLogin 接続がSSL/TLSで保護されていない場合でも、平文による認証を許可するかどうか指定します

以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は証明書の検証等が必要になります。

記述例
// imapおよびimapsスキームの登録
ImapWebRequestCreator.RegisterPrefix();

/*
 * ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
 * ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
 */
var request1 = WebRequest.Create(new Uri("imaps://user@imap.example.net/"));

request1.Credentials = new NetworkCredential("user", "pass");

/*
 * ホスト"imap.example.net"のポート10143に接続、可能ならSSL/TLSにアップグレード。
 * ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はCRAM-MD5を試行。
 */
var request2 = WebRequest.Create(new Uri("imap://user;AUTH=CRAM-MD5@imap.example.net:10143/")) as ImapWebRequest;

request2.UseTlsIfAvailable = true;
request2.Credentials = new NetworkCredential("user", "pass");

/*
 * ホスト"imap.example.net"のポート10143にSSL/TLSを用いて接続。
 * ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
 */
var request3 = WebRequest.Create(new Uri("imaps://user;AUTH=DIGEST-MD5@imap.example.net:10143/")) as ImapWebRequest;

request3.Credentials = new NetworkCredential("user", "pass");

/*
 * ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、SSL/TLSは使用しない。
 * ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5, CRAM-MD5, PLAINの順に試行。
 */
var request4 = WebRequest.Create(new Uri("imap://;AUTH=*@imap.example.net/")) as ImapWebRequest;

request4.UseTlsIfAvailable = false;
request4.UsingSaslMechanisms = new[] {"DIGEST-MD5", "CRAM-MD5", "PLAIN"};
request4.Credentials = new NetworkCredential("user", "pass");

/*
 * ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、可能ならSSL/TLSを使用する。
 * ユーザ名に"user"、パスワードに"pass"を使用。
 * 認証方式はCRAM-MD5, PLAIN, IMAP LOGINの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
 */
var request5 = WebRequest.Create(new Uri("imap://user@imap.example.net/")) as ImapWebRequest;

request5.UseTlsIfAvailable = true;
request5.UsingSaslMechanisms = new[] {"CRAM-MD5", "PLAIN"};
request5.AllowInsecureLogin = false;
request5.Credentials = new NetworkCredential("user", "pass");

/*
 * GMailのアカウント"user"にIMAPで接続。 パスワードは"pass"を使用。
 */
var request6 = WebRequest.Create(new Uri("imaps://user@imap.gmail.com/"));

request6.Credentials = new NetworkCredential("user", "pass");
記述例
' imapおよびimapsスキームの登録
ImapWebRequestCreator.RegisterPrefix()

'
' ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
'
Dim request1 As WebRequest = WebRequest.Create(New Uri("imaps://user@imap.example.net/"))

request1.Credentials = New NetworkCredential("user", "pass")

'
' ホスト"imap.example.net"のポート10143に接続、可能ならSSL/TLSにアップグレード。
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はCRAM-MD5を試行。
'
Dim request2 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://user;AUTH=CRAM-MD5@imap.example.net:10143/")), ImapWebRequest)

request2.UseTlsIfAvailable = True
request2.Credentials = New NetworkCredential("user", "pass")

'
' ホスト"imap.example.net"のポート10143にSSL/TLSを用いて接続。
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
'
Dim request3 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imaps://user;AUTH=DIGEST-MD5@imap.example.net:10143/")), ImapWebRequest)

request3.Credentials = New NetworkCredential("user", "pass")

'
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、SSL/TLSは使用しない。
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5, CRAM-MD5, PLAINの順に試行。
'
Dim request4 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://;AUTH=*@imap.example.net/")), ImapWebRequest)

request4.UseTlsIfAvailable = False
request4.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5", "PLAIN"}
request4.Credentials = New NetworkCredential("user", "pass")

'
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、可能ならSSL/TLSを使用する。
' ユーザ名に"user"、パスワードに"pass"を使用。
' 認証方式はCRAM-MD5, PLAIN, IMAP LOGINの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
'
Dim request5 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://user@imap.example.net/")), ImapWebRequest)

request5.UseTlsIfAvailable = True
request5.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
request5.AllowInsecureLogin = False
request5.Credentials = New NetworkCredential("user", "pass")

'
' GMailのアカウント"user"にIMAPで接続。 パスワードは"pass"を使用。
'
Dim request6 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imaps://user@imap.gmail.com/")), ImapWebRequest)

request6.Credentials = New NetworkCredential("user", "pass")

証明書の選択と検証

デフォルトでは、接続・認証時にImapSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。

SSL/TLS接続時に参照するメンバ(いずれもクラスプロパティ)
ImapWebRequestクラスが参照するメンバ
X509Certificate2Collection ImapSessionManager.ClientCertificates
RemoteCertificateValidationCallback ImapSessionManager.ServerCertificateValidationCallback
RemoteCertificateValidationCallback ImapSessionManager.ClientCertificateSelectionCallback

以下は証明書の検証を行う簡単な例です。

証明書の検証を行う例
using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;

public class ValidateServerCerts {
  static void Main(string[] args)
  {
    ImapWebRequestCreator.RegisterPrefix();

    // 証明書の検証を行うコールバックメソッドを指定
    ImapSessionManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;

    using (var client = new WebClient()) {
      client.Credentials = new NetworkCredential("user", "pass");
      client.DownloadFile("imaps://user@localhost/INBOX/;UID=1", "sample.eml");
    }
  }

  private static bool ValidateRemoteCertificate(object sender,
                                                X509Certificate certificate,
                                                X509Chain chain,
                                                SslPolicyErrors sslPolicyErrors)
  {
#if DEBUG
    // デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
    if ((int)(sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0)
      sslPolicyErrors &= ~SslPolicyErrors.RemoteCertificateNameMismatch;
#endif

    if (sslPolicyErrors == SslPolicyErrors.None) {
      return true;
    }
    else {
      // エラーがあれば標準エラーに表示
      Console.Error.WriteLine(sslPolicyErrors);
      return false;
    }
  }
}
証明書の検証を行う例
Imports System
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4.WebClients

Public Class ValidateServerCerts
  Public Shared Sub main(ByVal args As String())
    ImapWebRequestCreator.RegisterPrefix()

    ' 証明書の検証を行うコールバックメソッドを指定
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)

    Using client As New WebClient()
      client.Credentials = New NetworkCredential("user", "pass")
      client.DownloadFile("imaps://user@localhost/INBOX/;UID=1", "sample.eml")
    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
#If DEBUG Then
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
    If CInt(sslPolicyErrors & sslPolicyErrors.RemoteCertificateNameMismatch) <> 0 Then
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
    End If
#End If

    If sslPolicyErrors = sslPolicyErrors.None Then
      Return True
    Else
      ' エラーがあれば標準エラーに表示
      Console.Error.WriteLine(sslPolicyErrors)
      Return False
    End If
  End Function
End Class

SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapSessionManager.CreateSslStreamCallbackに適切なコールバックメソッドを指定してください。

リクエストURLとリクエスト・レスポンスの動作

HTTPと異なり、IMAP URLではリクエストURLの形式によりリクエストの対象が変わります。

リクエストURLの形式とリクエストの対象
リクエストURLの形式 リクエストの対象
imap://imap.example.net/ URLで指定されたサーバ・アカウント
imap://imap.example.net/mailbox URLで指定されたメールボックス
imap://imap.example.net/mailbox?... URLで指定されたメールボックスにあるメッセージのうち、検索クエリに該当する全てのメッセージ
imap://imap.example.net/mailbox/;UID=1 URLで指定されたメールボックスにあるメッセージのうち、UIDに該当する特定のメッセージ

WebRequest.Createメソッドが返すWebRequestインスタンスのMethodプロパティにデフォルトで設定される値は、リクエストURLの形式によって決まります。

ImapWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。 基本的な動作はRFC 5092 - IMAP URL Schemeに記述されている内容に準じたものになっていますが、ImapWebRequestは本ライブラリ固有の拡張を含んでいます。

以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。 ImapWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては別項で説明します。

サーバ・アカウントに対するリクエスト

リクエストURLがサーバ・アカウントを表す場合(imap://imap.example.net/の形式)のリクエストとレスポンスの動作は次のとおりです。

Methodプロパティ リクエスト 解説 レスポンス
ImapWebRequestMethods.Lsub, "LSUB"
(デフォルト)
LSUBコマンドを送信して購読中のメールボックスの一覧を取得します。 - 取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。
ImapWebRequestMethods.List, "LIST" LISTコマンドを送信して全てのメールボックスの一覧を取得します。 - 取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。
Methodプロパティ リクエスト 解説 レスポンス

ImapWebResponse.Mailboxesプロパティに設定されるImapMailboxインスタンスは、ログアウトするまでの間ライブラリ側で管理されます。 同じメールボックスに対して操作を行った場合は、インスタンスの値のみが更新され、常に同じインスタンスが返されます。

メールボックスに対するリクエスト

リクエストURLがメールボックスを表す場合(imap://imap.example.net/mailboxの形式)のリクエストとレスポンスの動作は次のとおりです。

Methodプロパティ リクエスト 解説 レスポンス
ImapWebRequestMethods.Fetch, "FETCH"
(デフォルト)
FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。 取得するのはメッセージの属性のみです。 メッセージ本文は取得しません。 取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。 取得したメッセージの一覧は、ImapWebResponse.MessageAttributesプロパティに設定されます。
ImapWebRequestMethods.Append, "APPEND" APPENDコマンドを送信してメールボックスにメッセージをアップロードします。 アップロードするメッセージはWebRequest.GetRequestStreamメソッドが返すStreamに書き込みます。 現在の実装では、リクエスト開始時にContentLengthの値が指定されているか、GetRequestStreamメソッドが返すStreamを閉じるまでアップロードは保留されます。 メッセージはMIME形式であるべきですが、ライブラリ側ではアップロードする内容をチェックしません。 サーバがアップロードしたメッセージのUIDを返す場合は、アップロードしたメッセージのURLがWebResponse.ResponseUriに設定されます。
ImapWebRequestMethods.Expunge, "EXPUNGE" EXPUNGEコマンドを送信してメールボックスから\Deletedフラグの付いたメッセージを削除します。 - -
ImapWebRequestMethods.Create, "CREATE" CREATEコマンドを送信してURLで指定された名前でメールボックスを作成します。 ImapWebRequest.Subscriptionプロパティがtrueの場合、作成したメールボックスに対して自動的にSUBSCRIBEコマンドを送信します。 作成したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。 また、作成したメールボックスのURLがWebResponse.ResponseUriに設定されます。
ImapWebRequestMethods.Delete, "DELETE" DELETEコマンドを送信してメールボックスを削除します。 ImapWebRequest.Subscriptionプロパティがtrueの場合、削除したメールボックスに対してUNSUBSCRIBEコマンドを送信します。
削除しようとするメールボックスにメッセージがある場合は削除に失敗するので、STOREやEXPUNGEでメッセージを削除してからメールボックスを削除する必要があります。
-
ImapWebRequestMethods.Rename, "RENAME" RENAMEコマンドを送信してメールボックスの名前を変更します。 ImapWebRequest.Subscriptionプロパティがtrueの場合、変更前後のメールボックスに対して自動的にUNSUBSCRIBE/SUBSCRIBEコマンドを送信します。
変更後のメールボックス名はImapWebRequest.DestinationUriプロパティで指定します。
名前を変更した後のメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。 また、名前を変更した後のメールボックスのURLがWebResponse.ResponseUriに設定されます。
ImapWebRequestMethods.Check, "CHECK" CHECKコマンドを送信します。 このコマンドは何もしません。 CHECKコマンドの動作、レスポンスの内容はサーバの実装によります。 -
ImapWebRequestMethods.Select, "SELECT" SELECTコマンドを送信してメールボックスを選択します。 このコマンドは選択するだけで何もしません。 メールボックスの状態を取得する場合などに使います。 選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。 また、選択したメールボックスのURLがWebResponse.ResponseUriに設定されます。
ImapWebRequestMethods.Examine, "EXAMINE" EXAMINEコマンドを送信して読み取り専用でメールボックスを選択します。 このコマンドは選択するだけで何もしません。 メールボックスの状態を取得する場合などに使います。 選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。 また、選択したメールボックスのURLがWebResponse.ResponseUriに設定されます。
ImapWebRequestMethods.Status, "STATUS" STATUSコマンドを送信してメールボックスの状態を取得します。 取得する情報は、ImapWebRequest.StatusDataItemプロパティで指定します。
既にメールボックスを選択している状態で、他のメールボックスの状態を取得する場合に使います。
状態を取得したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。
ImapWebRequestMethods.Subscribe, "SUBSCRIBE" SUBSCRIBEコマンドを送信してメールボックスの購読を開始します。 - -
ImapWebRequestMethods.Unsubscribe, "UNSUBSCRIBE" UNSUBSCRIBEコマンドを送信してメールボックスの購読を解除します。 - -
Methodプロパティ リクエスト 解説 レスポンス

ImapWebResponse.Mailboxesプロパティに設定されるImapMailboxインスタンスは、ログアウトするまでの間ライブラリ側で管理されます。 同じメールボックスに対して操作を行った場合は、インスタンスの値のみが更新され、常に同じインスタンスが返されます。

メールボックスに対する検索クエリを含むリクエスト

リクエストURLがメールボックスに対する検索クエリを表す場合(imap://imap.example.net/mailbox?...の形式)のリクエストとレスポンスの動作は次のとおりです。

Methodプロパティ リクエスト 解説 レスポンス
ImapWebRequestMethods.Search, "SEARCH"
(デフォルト)
SEARCHコマンドを送信して検索クエリに該当するメッセージの一覧を取得します。 取得するのはメッセージの属性のみです。 メッセージ本文は取得しません。 取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。 取得したメッセージの一覧は、ImapWebResponse.MessageAttributesプロパティに設定されます。
ImapWebRequestMethods.Copy, "COPY" COPYコマンドを送信して検索クエリに該当するメッセージを別のメールボックスにコピーします。 コピー先のメールボックスはImapWebRequest.DestinationUriプロパティで指定します。 サーバがCOPYUIDレスポンスコードを返した場合は、コピーしたメッセージのURLがWebResponse.ResponseUriに設定されます。 また、コピー先のメールボックスを自動的に作成した場合、作成したメールボックスはImapWebResponse.Mailboxesプロパティに設定されます。
ImapWebRequestMethods.Expunge, "EXPUNGE" STOREコマンドを送信して検索クエリに該当するメッセージに\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。 サーバがUID EXPUNGEに対応していない場合、検索クエリに該当したメッセージだけでなく既に\Deletedフラグが設定されている他のメッセージも同時に削除されます -
ImapWebRequestMethods.Store, "STORE" STOREコマンドを送信して検索クエリに該当するメッセージにフラグを追加・削除・設定します。 追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。 -
ImapWebRequestMethods.Sort, "SORT" SORTコマンドを送信して検索クエリに該当するメッセージの一覧をソート済みの形式で取得します。 ソート方法はImapWebRequest.SortCriteriaプロパティで指定します。
サーバがSORTコマンドをサポートするかどうかはチェックせずにリクエストを実行します。
SEARCH同様、取得するのはメッセージの属性のみです。 取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。
取得したソート済みメッセージの一覧は、ImapWebResponse.MessageAttributesプロパティに設定されます。
ImapWebRequestMethods.Thread, "THREAD" THREADコマンドを送信して検索クエリに該当するメッセージの一覧をスレッド形式で取得します。 スレッド形式のアルゴリズムはImapWebRequest.ThreadingAlgorithmプロパティで指定します。
サーバがTHREADコマンドをサポートするかどうかはチェックせずにリクエストを実行します。
SEARCH同様、取得するのはメッセージの属性のみです。 取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。
取得したスレッド形式の一覧は、ImapWebResponse.ThreadTreeプロパティに設定されます。 また、個々のメッセージの一覧は、ImapWebResponse.MessageAttributesプロパティに設定されます。
Methodプロパティ リクエスト 解説 レスポンス

メールボックス内の特定のメッセージに対するリクエスト

リクエストURLが特定のメッセージを表す場合(imap://imap.example.net/mailbox/;UID=1の形式)のリクエストとレスポンスの動作は次のとおりです。

Methodプロパティ リクエスト 解説 レスポンス
ImapWebRequestMethods.Fetch, "FETCH"
(デフォルト)
FETCHコマンドを送信してメッセージの本文を取得します。 取得の際にBODY[]とBODY.PEEK[]のどちらを使用するかはImapWebRequest.FetchPeekプロパティで指定します。
URLにSECTION/PARTIALのいずれも指定していない場合は、メッセージの本文だけでなく属性も取得します。 取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。
メッセージ本文はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。 URLでSECTION/PARTIALを指定している場合は、メッセージ本文のうち、該当する部分のみ取得されます。
URLにSECTION/PARTIALのいずれも指定していない場合のみ、取得するメッセージのサイズがWebResponse.ContentLength、Content-TypeがWebResponse.ContentTypeプロパティに設定されます。
UID/SECTION/PARTIALに該当するメッセージがない場合、WebExceptionStatus.SuccessのWebExceptionをスローします。
ImapWebRequestMethods.Copy, "COPY" COPYコマンドを送信してメッセージを別のメールボックスにコピーします。 コピー先のメールボックスはImapWebRequest.DestinationUriプロパティで指定します。 サーバがCOPYUIDレスポンスコードを返した場合は、コピーしたメッセージのURLがWebResponse.ResponseUriに設定されます。 また、コピー先のメールボックスを自動的に作成した場合、作成したメールボックスはImapWebResponse.Mailboxesプロパティに設定されます。
ImapWebRequestMethods.Expunge, "EXPUNGE" STOREコマンドを送信して\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。 サーバがUID EXPUNGEに対応していない場合、URLで指定されたメッセージだけでなく既に\Deletedフラグが設定されている他のメッセージも同時に削除されます -
ImapWebRequestMethods.Store, "STORE" STOREコマンドを送信してメッセージにフラグを追加・削除・設定します。 追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。 -
Methodプロパティ リクエスト 解説 レスポンス

リクエスト対象に制限されないリクエスト

リクエストURLの形式によらず使用可能なコマンドのリクエストとレスポンスの動作は次のとおりです。

Methodプロパティ リクエスト 解説 レスポンス
ImapWebRequestMethods.NoOp, "NOOP" NOOPコマンドを送信します。 このコマンドは何もしません。 自動ログアウトタイマの更新、セッションの接続性確認、新着メッセージの確認などに使います。 -
Methodプロパティ リクエスト 解説 レスポンス

ImapWebRequestクラスのプロパティ

ImapWebRequestクラスにはMethodプロパティ以外にもコマンド送信時の動作を制御するためのプロパティを用意してあります。 プロパティの値によってリクエスト内容と動作が変わります。

ImapWebRequestクラスのプロパティ
プロパティ デフォルト 対象となるコマンド 解説
KeepAlive true 全て リクエストが終了した後もセッションを維持するかどうかを指定します。 trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます。
ExpectedErrorResponseCodes null 全て サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。 サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。
UseTlsIfAvailable true 全て(認証時) サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。
UsingSaslMechanisms {"DIGEST-MD5", "CRAM-MD5", "NTLM"} 全て(認証時) 認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。 サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。
AllowInsecureLogin false 全て(認証時) 接続がSSL/TLSで保護されていない場合でも、平文による認証を許可するかどうか指定します。
ReadOnly false FETCH, SEARCH等 メールボックスを選択する際に、SELECTコマンドの代わりにEXAMINEコマンドを送信するかどうかを指定します。 メッセージに対する操作を行うコマンドを送信する場合に有効になります。 EXAMINEコマンドで選択したメールボックスのメッセージに対する操作の結果はサーバの実装によります。 ReadOnlyがtrueでもDELETEなどのコマンドには影響しません。
AllowCreateMailbox true COPY COPYコマンドを送信した際にサーバがレスポンスコードTRYCREATEを返した場合、自動的にメールボックスを作成するかどうかを指定します。 現在の実装では、APPENDコマンドでTRYCREATEが返された場合でもメールボックスは作成せず、常にエラーとなります。
DestinationUri null COPY, RENAME COPYの場合はメッセージのコピー先メールボックス名、RENAMEの場合は変更後のメールボックス名を含むURLを指定します。 URLはコピー元・変更前(WebRequest.RequestUri)と同一サーバ、同一ユーザである必要があります。 それ以外の場合、ArgumentExceptionをスローします。
Subscription true CREATE, DELETE, RENAME, COPY メールボックスを作成・削除する際に、対象のメールボックスに対して自動的にSUBSCRIBE/UNSUBSCRIBEコマンドを送信し、購読・購読解除するかどうかを指定します。
FetchDataItem ImapFetchDataItemMacro.All SEARCH, SORT, THREAD, FETCH メッセージの属性を取得する際に、取得する属性を表すマクロを指定します。 マクロと取得する属性の対応は後述の対応表を参照してください。
StoreDataItem null STORE STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。
StatusDataItem null STATUS STATUSコマンドで取得するメールボックスの情報を指定します。
SortCriteria null SORT SORTコマンドで使用するソート方法を指定します。
ThreadingAlgorithm null THREAD THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。
FetchBlockSize 10240 FETCH FETCHコマンドでメッセージ本文を取得する際に、1回のFETCHコマンドで取得するブロックのサイズをバイト単位で指定します。
FetchPeek true FETCH FETCHコマンドでメッセージ本文を取得する際に、BODY.PEEK[]とBODY[]のどちらを使用するかを指定します。 trueの場合はBODY.PEEK[]が使用され、取得したメッセージは未読のままになります。
プロパティ デフォルト 対象となるコマンド 解説

ImapWebRequest.FetchDataItemプロパティに指定できるマクロの値と、取得する属性の種類は次のとおりです。

ImapWebRequest.FetchDataItemプロパティに指定できる値
取得される属性
ImapFetchDataItemMacro.All ALLマクロで表される属性を取得します。 取得するのはFLAGS、INTERNALDATE、RFC822.SIZE、ENVELOPEです。
ImapFetchDataItemMacro.Fast FASTマクロで表される属性を取得します。 取得するのはFLAGS、INTERNALDATE、RFC822.SIZEです。
ImapFetchDataItemMacro.Full FULLマクロで表される属性を取得します。 取得するのはFLAGS、INTERNALDATE、RFC822.SIZE、ENVELOPE、BODYです。
ImapFetchDataItemMacro.Extensible Fullと同じですが、BODYのかわりに拡張されたデータを含むBODYSTRUCTUREを取得します。

WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。

WebRequestクラスから継承されるプロパティ
プロパティ デフォルト 対象となるコマンド 解説
Timeout -1 全て リクエストを開始してからレスポンスを取得するまでのタイムアウト時間を指定します。
ReadWriteTimeout 300000 全て ソケット送受信のタイムアウト時間を指定します。
ContentLength 0 APPEND メールボックスにアップロードするメッセージのサイズを指定します。

以下のプロパティは、未テスト・不完全な実装に関連するプロパティです。 使用はできますが、今後廃止する可能性もあるので、現時点では使用を推奨できません。

ImapWebRequestクラスのプロパティ
プロパティ デフォルト 対象となるコマンド 解説
UseDeflateIfAvailable false 全て サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。 (この機能は現在動作しません。 trueにした場合、NotImplementedExceptionがスローされます)

ImapWebRequestクラスのデフォルト値の変更

ImapWebRequestDefaultsクラスのプロパティの値を変更することにより、ImapWebRequestクラスのプロパティに設定されるデフォルト値を一括して指定することができます。 全てのリクエストでデフォルトの値を変更したい場合は、ImapWebRequestDefaultsクラスのプロパティの値を変更してください。

ImapWebRequestDefaultsクラスにはImapWebRequestプロパティと同名のプロパティを用意してありますが、以下の一覧にあるプロパティはImapWebRequestでは設定できないプロパティです。

ImapWebRequestDefaultsクラスのプロパティ
プロパティ デフォルト 解説
Subscription true ImapWebRequest.Subscriptionプロパティと同様ですが、falseにした場合WebRequest.Methodのデフォルト値が"LSUB"から"LIST"に変わります。
ClientID name=(現在実行中のアセンブリの名前)
version=(現在実行中のアセンブリのバージョン)
environment=(ランタイムの名前とバージョン)
サーバがID extensionをサポートしている場合に送信されるIDを指定します。

リクエストとIMAP URLに関するその他の留意事項

  • UIDVALIDITYを含むIMAP URLも扱えますが、無視します。 現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。

アプリケーション構成ファイルでの設定

アプリケーション構成ファイルを記述することにより、imap, imapsスキームの登録と、ImapWebRequestDefaultsクラスの値を変更することができます。 コード上での変更をしたくない場合、する必要がない場合などは、アプリケーション構成ファイルに設定を記述することができます。 以下はアプリケーション構成ファイルの記述例です。

アプリケーション構成ファイルの記述例
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- smdn.net.imap4.client要素を処理するためのセクションハンドラクラスの設定 -->
    <sectionGroup name="smdn.net.imap4.client">
      <section name="webRequestDefaults" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
  </configSections>
  <system.net>
    <!-- imap, imapsスキームの登録 -->
    <webRequestModules>
      <add prefix="imap"  type="Smdn.Net.Imap4.WebClients.ImapWebRequestCreator, Smdn.Net.Imap4.WebClients" />
      <add prefix="imaps" type="Smdn.Net.Imap4.WebClients.ImapWebRequestCreator, Smdn.Net.Imap4.WebClients" />
    </webRequestModules>
  </system.net>
  <smdn.net.imap4.client>
    <!-- ImapWebRequestDefaultsクラスのデフォルト値の変更 -->
    <webRequestDefaults>
      <add key="timeout" value="-1"/>
      <add key="readWriteTimeout" value="-1"/>
      <add key="fetchBlockSize" value="102400"/>
      <add key="fetchPeek" value="true"/>
      <add key="fetchDataItem" value="all"/>
      <add key="subscription" value="true"/>
      <add key="allowCreateMailbox" value="true"/>
      <add key="useTlsIfAvailable" value="true"/>
      <add key="keepAlive" value="true"/>
      <add key="readOnly" value="false"/>
      <add key="usingSaslMechanisms" value="DIGEST-MD5, CRAM-MD5, NTLM"/>
      <add key="allowInsecureLogin" value="false"/>
      <add key="expectedErrorResponseCodes" value="ALREADYEXISTS, NONEXISTENT"/>
      <add key="clientID" value="name=MyImapClient, support-url=http://imap.example.net/support/"/>
    </webRequestDefaults>
  </smdn.net.imap4.client>
</configuration>

記述内容についてはネットワーク設定スキーマおよび構成セクション スキーマも合わせて参照してください。

例外

ImapWebRequestからはSystem.Net.WebExceptionまたはSystem.Net.ProtocolViolationExceptionをスローします。 WebExceptionをスローする場合は、エラーの状況によりWebException.StatusプロパティとInnerExceptionプロパティに値が設定されます。 また、サーバがエラー応答を返した場合は、Responseプロパティも設定されます。

非同期操作・スレッドセーフティ

WebRequestから継承されるBeginGetResponse()/EndGetResponse()メソッドは実装済みのため、これらのメソッドを使って非同期操作を行えます。 ただし、.NET Framework上では、WebClient.OpenReadAsync()、WebClient.Download*Async()などのメソッドを使用した非同期操作は正しく動作しないようなので、現時点では使用できません。