2013-07-19T23:46:19の更新内容

works/libs/Smdn.Net.Imap4.Client/docs/index.wiki.txt

current previous
4,7 4,7
 
${pragma,parser-options,non-limited-list}
${pragma,parser-options,non-limited-list}
 
[[works/libs/Smdn.Net.Imap4.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 0.90>works/libs/Smdn.Net.Imap4.Client/releases#changes_v0.90]]時点のもので、記載不備などがあるかもしれません。
[[works/libs/Smdn.Net.Imap4.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 0.90>works/libs/Smdn.Net.Imap4.Client/releases#changes_v0.90]]時点のもので、記載不備などがあるかもしれません。
 

        

        
~
認証・接続のサンプルコードは[[#connection_authentication_examples]]、IMAP操作を行う具体例は[[#operation_examples]]に記載しています。 ご質問などありましたら[[掲示板>misc/forum/libs]]へどうぞ。
サンプルコードは[[このページの最後>#samples]]にあります。 ご質問などありましたら[[掲示板>misc/forum/libs]]へどうぞ。
 

        

        
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
105,14 105,14
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
~
*接続・認証とSSL/TLS [#connection]
*接続・認証とSSL/TLS
 
ImapClientクラスは&urn2url(urn:ietf:rfc:5092){IMAP URL};を使った接続に対応しています。 接続時の動作は、基本的にIMAP URLの仕様に準じた動作となるようにしています((ただし、imapsスキームを使用した場合にSSL/TLSでの接続を試みる動作は、仕様には無い、本ライブラリ独自の拡張です))。
ImapClientクラスは&urn2url(urn:ietf:rfc:5092){IMAP URL};を使った接続に対応しています。 接続時の動作は、基本的にIMAP URLの仕様に準じた動作となるようにしています((ただし、imapsスキームを使用した場合にSSL/TLSでの接続を試みる動作は、仕様には無い、本ライブラリ独自の拡張です))。
 

        

        
~
**接続と認証 [#connection_authentication]
**接続と認証 [#login]
 
ここでは接続時と認証時の動作について解説します。
ここでは接続時と認証時の動作について解説します。
 

        

        
~
***接続・認証のコードと動作の例 [#connection_authentication_examples]
***接続・認証のコードと動作の例
~
以下は接続・認証処理の記述例です。 個々のパラメータの指定方法と動作の詳細についてはこの後順に解説していきます。 なお、実際にSSL/TLSを使用する場合は[[証明書の検証等>#connection_ssl_validation]]が必要になります。
以下は接続・認証処理の記述例です。 個々のパラメータの指定方法と動作の詳細についてはこの後順に解説していきます。 なお、実際にSSL/TLSを使用する場合は[[証明書の検証等>#ssl]]が必要になります。
 

        

        
 
#tabpage(codelang=cs,container-title=ImapClient)
#tabpage(codelang=cs,container-title=ImapClient)
 
#code{{
#code{{
232,7 232,7
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
~
***接続・切断・サーバ情報に関するメンバ [#connection_authentication_reference]
***接続・切断・サーバ情報に関するメンバ
 
以下は接続・切断・サーバ情報に関するメソッドとプロパティです。
以下は接続・切断・サーバ情報に関するメソッドとプロパティです。
 

        

        
 
|*ImapClientクラスのメソッド
|*ImapClientクラスのメソッド
248,9 248,9
 
|*ImapClientクラスのプロパティ
|*ImapClientクラスのプロパティ
 
|~プロパティ|~解説|h
|~プロパティ|~解説|h
 
|Profile|接続先のホスト・ポート・ユーザ名などを取得/設定します。 コンストラクタで指定した内容はこのプロパティに反映されます。|
|Profile|接続先のホスト・ポート・ユーザ名などを取得/設定します。 コンストラクタで指定した内容はこのプロパティに反映されます。|
~
|Timeout|接続時およびコマンド処理のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
|Timeout|コマンド処理のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
~
|SendTimeout|ソケット送信時(コマンド送信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
|SendTimeout|ソケット送信時のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
~
|ReceiveTimeout|ソケット受信時(レスポンス受信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
|ReceiveTimeout|ソケット受信時のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
 
|IsConnected|接続中かどうかを表す値を取得します。|
|IsConnected|接続中かどうかを表す値を取得します。|
 
|ServerCapabilities|サーバがサポートする機能の一覧(CAPABILITYコマンドの結果)を取得します。|
|ServerCapabilities|サーバがサポートする機能の一覧(CAPABILITYコマンドの結果)を取得します。|
 
|ServerID|サーバがサポートしている場合、サーバのID(IDコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
|ServerID|サーバがサポートしている場合、サーバのID(IDコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
261,7 261,7
 
:Timeout, SendTimeout, ReceiveTimeout|これらのプロパティはそれぞれImapClient.Profile.Timeout, ImapClient.Profile.SendTimeout, ImapClient.Profile.RecieveTimeoutを設定することと同じですが、接続後はImapClient.Profileの値を変更してもImapClientの動作には反映されません。 接続後はImapClient.Timeout, ImapClient.SendTimeout, ImapClient.ReceiveTimeoutプロパティを設定してください。
:Timeout, SendTimeout, ReceiveTimeout|これらのプロパティはそれぞれImapClient.Profile.Timeout, ImapClient.Profile.SendTimeout, ImapClient.Profile.RecieveTimeoutを設定することと同じですが、接続後はImapClient.Profileの値を変更してもImapClientの動作には反映されません。 接続後はImapClient.Timeout, ImapClient.SendTimeout, ImapClient.ReceiveTimeoutプロパティを設定してください。
 
:ServerCapabilities, ServerID, ServerNamespace|切断されている状態で取得しようとした場合(ImapClient.IsConnectedがfalseの場合)、例外をスローします。
:ServerCapabilities, ServerID, ServerNamespace|切断されている状態で取得しようとした場合(ImapClient.IsConnectedがfalseの場合)、例外をスローします。
 

        

        
~
***接続に関するパラメータと動作 [#connection_authentication_connectparams]
***接続に関するパラメータと動作 [#connect]
 
接続時の動作は、接続時のパラメータにより次のように変わります。
接続時の動作は、接続時のパラメータにより次のように変わります。
 

        

        
 
:SSL/TLSを使用する (IMAP over SSL)|常にSSL/TLSを使用して接続を試みます。 デフォルトのポート番号は993です。
:SSL/TLSを使用する (IMAP over SSL)|常にSSL/TLSを使用して接続を試みます。 デフォルトのポート番号は993です。
287,7 287,7
 
|imap://user@imap.example.net/|143|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
|imap://user@imap.example.net/|143|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 
|imap://user@imap.example.net:993/|993|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
|imap://user@imap.example.net:993/|993|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 

        

        
~
***認証に関するパラメータと動作 [#connection_authentication_authparams]
***認証に関するパラメータと動作 [#auth]
 
接続にIMAP URLを用いる場合、認証に用いるユーザ名と認証方式はURLから取得します。 パスワードはImapClient.Connect()メソッドに指定する引数credentials(ICredentialsByHostインターフェイス)を参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。 IMAP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、URLからはパスワードを取得しません(指定されていてもパスワードとしては解釈しません)。
接続にIMAP URLを用いる場合、認証に用いるユーザ名と認証方式はURLから取得します。 パスワードはImapClient.Connect()メソッドに指定する引数credentials(ICredentialsByHostインターフェイス)を参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。 IMAP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、URLからはパスワードを取得しません(指定されていてもパスワードとしては解釈しません)。
 

        

        
 
認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
318,13 318,13
 
|DIGEST-MD5&br;CRAM-MD5&br;PLAIN&br;|{"PLAIN", "DIGEST-MD5"}|1.PLAIN&br;2.DIGEST-MD5|1.DIGEST-MD5|
|DIGEST-MD5&br;CRAM-MD5&br;PLAIN&br;|{"PLAIN", "DIGEST-MD5"}|1.PLAIN&br;2.DIGEST-MD5|1.DIGEST-MD5|
 
|PLAIN&br;IMAP LOGIN|null|1.IMAP LOGIN|ImapAuthenticationExceptionをスロー&br;(試行できる認証方式なし)|
|PLAIN&br;IMAP LOGIN|null|1.IMAP LOGIN|ImapAuthenticationExceptionをスロー&br;(試行できる認証方式なし)|
 

        

        
~
***認証時に参照する資格情報 [#connection_authentication_credentials]
***認証時に参照する資格情報 [#creds]
 
認証時に必要なユーザ名・パスワードは&msdn(netfx,type,System.Net.ICredentialsByHost);インターフェイスを通して取得します。 ICredentialsインターフェイスではなく、ICredentialsByHostインターフェイスを実装していて、GetCredentialメソッドが適切な&msdn(netfx,type,System.Net.NetworkCredential);を返すクラスなら何でも設定できます。
認証時に必要なユーザ名・パスワードは&msdn(netfx,type,System.Net.ICredentialsByHost);インターフェイスを通して取得します。 ICredentialsインターフェイスではなく、ICredentialsByHostインターフェイスを実装していて、GetCredentialメソッドが適切な&msdn(netfx,type,System.Net.NetworkCredential);を返すクラスなら何でも設定できます。
 

        

        
 
//現時点ではSecureStringに格納されたパスワードには対応していません。 &msdn(netfx,member,System.Net.NetworkCredential.SecurePassword){NetworkCredential.SecurePasswordプロパティ};にパスワードが設定されていても無視します。
//現時点ではSecureStringに格納されたパスワードには対応していません。 &msdn(netfx,member,System.Net.NetworkCredential.SecurePassword){NetworkCredential.SecurePasswordプロパティ};にパスワードが設定されていても無視します。
 

        

        
~
**SSL/TLSを使用した接続 [#connection_ssl]
**SSL/TLSを使用した接続 [#ssl]
~
***証明書の選択と検証 [#connection_ssl_validation]
***証明書の選択と検証 [#certs]
 
SSL/TLS接続時に使用する証明書は&msdn(netfx,type,System.Security.Cryptography.X509Certificates.X509Certificate2Collection){X509Certificate2Collection};で設定できます。 また、証明書の選択と検証には&msdn(netfx,type,System.Net.Security.RemoteCertificateValidationCallback){RemoteCertificateValidationCallbackデリゲート};と&msdn(netfx,type,System.Net.Security.LocalCertificateSelectionCallback){LocalCertificateSelectionCallbackデリゲート};を指定できます。 デフォルトの状態では、SSL/TLS接続時にこれらのコールバックメソッドを呼び出して証明書の検証と選択を行い、&msdn(netfx,type,System.Net.Security.SslStream){SslStream};を作成します。
SSL/TLS接続時に使用する証明書は&msdn(netfx,type,System.Security.Cryptography.X509Certificates.X509Certificate2Collection){X509Certificate2Collection};で設定できます。 また、証明書の選択と検証には&msdn(netfx,type,System.Net.Security.RemoteCertificateValidationCallback){RemoteCertificateValidationCallbackデリゲート};と&msdn(netfx,type,System.Net.Security.LocalCertificateSelectionCallback){LocalCertificateSelectionCallbackデリゲート};を指定できます。 デフォルトの状態では、SSL/TLS接続時にこれらのコールバックメソッドを呼び出して証明書の検証と選択を行い、&msdn(netfx,type,System.Net.Security.SslStream){SslStream};を作成します。
 

        

        
 
デフォルトでは、接続・認証時にImapSslConnectionクラス(Smdn.Net.Imap4.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にImapSslConnectionクラス(Smdn.Net.Imap4.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
422,7 422,7
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
 

        

        
~
***SSL/TLS接続のカスタマイズ [#connection_ssl_sslcallback]
***SSL/TLS接続のカスタマイズ [#sslcallback]
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
 
SslStream以外の実装を使いたい場合や、より高度な検証が必要な場合など、SSL/TLS接続時にデフォルトの動作を変更してカスタマイズする場合は、UpgradeConnectionStreamCallbackデリゲートを使用してコールバックメソッドを指定してください。
SslStream以外の実装を使いたい場合や、より高度な検証が必要な場合など、SSL/TLS接続時にデフォルトの動作を変更してカスタマイズする場合は、UpgradeConnectionStreamCallbackデリゲートを使用してコールバックメソッドを指定してください。
 
コールバックメソッドはImapClient.Connect()メソッドの引数に指定してください。 実装例はImapSslConnection.CreateSslStreamメソッドを参照してください。
コールバックメソッドはImapClient.Connect()メソッドの引数に指定してください。 実装例はImapSslConnection.CreateSslStreamメソッドを参照してください。
511,19 511,21
 
#hr
#hr
 

        

        
 

        

        
~
*IMAPの操作 [#operation]
*IMAPの操作
-

          
-
**クラスと機能
 
Smdn.Net.Imap4.Client名前空間のクラスを使ったIMAPの操作は、それぞれ以下のクラスのインスタンスを用いて行います。
Smdn.Net.Imap4.Client名前空間のクラスを使ったIMAPの操作は、それぞれ以下のクラスのインスタンスを用いて行います。
 

        

        
 
|*クラスと機能
|*クラスと機能
 
|~クラス|~機能|h
|~クラス|~機能|h
 
|ImapClient|クライアント本体のクラス。|
|ImapClient|クライアント本体のクラス。|
~
|ImapMailboxInfo|単一のメールボックス(フォルダ)を表すクラス。|
|ImapMailboxInfo|単一のメールボックスを表すクラス。|
 
|ImapOpenedMailboxInfo|選択済みメールボックスを表すクラス。 ImapMailboxInfoから派生。|
|ImapOpenedMailboxInfo|選択済みメールボックスを表すクラス。 ImapMailboxInfoから派生。|
 
|ImapMessageInfoBase|単一もしくは複数のメッセージに対する共通の操作を定義したクラス。|
|ImapMessageInfoBase|単一もしくは複数のメッセージに対する共通の操作を定義したクラス。|
~
|ImapMessageInfo|単一のメッセージ(メール)を表すクラス。 ImapMessageInfoBaseから派生。|
|ImapMessageInfo|単一のメッセージを表すクラス。 ImapMessageInfoBaseから派生。|
 
|ImapMessageInfoList|複数のメッセージを表すクラス。 ImapMessageInfoBaseから派生。 IEnumerable<ImapMessageInfo>を実装。|
|ImapMessageInfoList|複数のメッセージを表すクラス。 ImapMessageInfoBaseから派生。 IEnumerable<ImapMessageInfo>を実装。|
 

        

        
~
ImapClient以外のクラスのインスタンスは直接作成することはできません。 ImapMailboxInfo・ImapOpenedMailboxInfoはImapClientクラスのメソッド、ImapMessageInfo・ImapMessageInfoListはImapOpenedMailboxInfoクラスのメソッドを呼び出すことで取得できます。
ImapClient以外のクラスのインスタンスは直接作成することはできません。 ImapClientクラスのメソッドを呼び出すことで取得できます。 また、IMAPではメッセージの取得・検索・削除・コピーなどの操作は、現在選択しているメールボックスに対してのみ行うことができます。 このような操作はImapOpenedMailboxInfoのメソッドとして用意しています。
 

        

        
 
次の例は上記のクラスを使ってメールボックス、メッセージの操作を行う一例です。
次の例は上記のクラスを使ってメールボックス、メッセージの操作を行う一例です。
 

        

        
598,635 600,8
 

        

        
 
以下でImapClientと関連するクラスの使い方について解説します。
以下でImapClientと関連するクラスの使い方について解説します。
 

        

        
~
**IMAP操作と各クラスの使用例 [#operation_examples]
**メールボックスに対する操作
~
ここではSmdn.Net.Imap4.Client名前空間の各クラスを使用してIMAPの操作を行う例を紹介します。 あわせてIMAPプロトコルによる操作を行う上での注意点についても解説します。
***メールボックスの取得と作成
+

          
+
以下のサンプルコードでは接続・認証処理を省略しているので[[#connection_authentication]]を参照して必要なコードを追記してください。 また、各クラスに用意されているすべてのメソッド・プロパティの詳細については[[#operation_reference]]を参照してください。
+

          
+
***メールボックスの操作 [#operation_examples_mailbox]
+
****メールボックスの取得 [#operation_examples_mailbox_inbox]
+
メールクライアント上で「受信トレイ」などで表記される既定のメールボックスは、``INBOX``という固定の名称を持っています。 これはIMAPプロトコルで定められている名称で、INBOXは全てのアカウントで常に存在するメールボックスです。 既定のメールボックスINBOXを取得するには、[[ImapClient.GetInboxメソッド>#operation_reference_mailbox_getcreate]]を使うか、GetMailboxメソッドに``"INBOX"``を指定して呼び出します。
+

          
+
#tabpage(codelang=cs,container-title=「受信トレイ」を取得する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  ImapMailboxInfo inbox = client.GetInbox();
+

          
+
  // 以下のようにしても同じ
+
  //ImapMailboxInfo inbox = client.GetMailbox("INBOX");
+
}
+
}}
+
#tabpage-end
+

          
+
これ以外にも、メールボックス(フォルダ)を取得するには[[既知のメールボックスを取得するImapClient.GetMailboxメソッド、すべてのメールボックスを取得するImapClient.GetMailboxesメソッドなど>#operation_reference_mailbox_getcreate]]を使うことができます。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスを取得する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // 既知のメールボックス"foo"を取得する
+
  ImapMailboxInfo mailbox = client.GetMailbox("foo");
+

          
+
  // すべてのメールボックスを取得する
+
  foreach (ImapMailboxInfo m in client.GetMailboxes()) {
+
    // メールボックス名を表示
+
    Console.WriteLine(m.FullName);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****メールボックスのステータス [#operation_examples_mailbox_status]
+
[[ImapMailboxInfo.ExistMessageCountなどメールボックスのステータス>#operation_reference_mailbox_status]]は、明示的に指定しない限り取得しません。 [[ImapClient.GetMailboxなどメールボックスを取得するメソッド>#operation_reference_mailbox_getcreate]]では、引数にImapMailboxListOptions.RequestStatusを指定することでメールボックスの取得と同時にステータスも取得します。 このほか、ImapMailboxInfo.Refreshメソッドを呼び出すことにより、メールボックスのステータスを取得しなおして最新の状態にすることができます。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスのステータスを取得する例)
+
#code{{
+
using (var client = new ImapClient()) {
+
  ImapMailboxInfo mailbox;
+

          
+
  // ImapMailboxListOptionsを指定せずにメールボックスを取得する
+
  mailbox = client.GetMailbox("foo");
+

          
+
  // ステータスは取得されていないので、0が出力される
+
  Console.WriteLine(mailbox.ExistMessageCount);
+

          
+
  // ステータスを更新する
+
  mailbox.Refresh();
+

          
+
  // メールボックスに存在するメッセージ数が出力される
+
  Console.WriteLine(mailbox.ExistMessageCount);
+

          
+
  // ImapMailboxListOptions.RequestStatusを指定してメールボックスを取得する
+
  mailbox = client.GetMailbox("foo", ImapMailboxListOptions.RequestStatus);
+

          
+
  // メールボックスに存在するメッセージ数が出力される
+
  Console.WriteLine(mailbox.ExistMessageCount);
+
}
+
}}
+
#tabpage-end
+

          
+

          
+
****メールボックスと階層 [#operation_examples_mailbox_hierarchy]
+
IMAPではメールボックス(フォルダ)に階層を持たせることができますが、メールボックスの階層区切り文字はIMAPサーバーによって異なります。 一例として、GMailでは階層区切り文字として ''/'' (スラッシュ)、Dovecotでは ''.'' (ドット)が使用されます。 従って、メールボックスが次のような階層を持っている場合、それぞれ次のような名前を持つことになります。
+

          
+
#column
+
#preformatted(メールボックスの階層){{
+
|--受信トレイ
+
|  |--フォルダ1
+
|  |  `--サブフォルダ1
+
|  `--フォルダ2
+
|--下書き
+
`--ごみ箱
+
   `--フォルダ1
+
}}
+
#column
+
#preformatted(GMailでのメールボックス名){{
+
INBOX
+
INBOX/フォルダ1
+
INBOX/フォルダ1/サブフォルダ1
+
INBOX/フォルダ2
+
下書き
+
ごみ箱
+
ごみ箱/フォルダ1
+
}}
+
#column
+
#preformatted(Dovecotでのメールボックス名){{
+
INBOX
+
INBOX.フォルダ1
+
INBOX.フォルダ1.サブフォルダ1
+
INBOX.フォルダ2
+
下書き
+
ごみ箱
+
ごみ箱.フォルダ1
+
}}
+
#column-end
+

          
+
(実際には[[Modified UTF-7>programming/netfx/tips/modified_utf7]]でエンコードされたメールボックス名が使われますが、本ライブラリでは自動的にModified UTF-7への変換を行います)
+

          
+
[[ImapClient.GetMailboxメソッド>#operation_reference_mailbox_getcreate]]などで階層化されたメールボックスを取得する場合は、適切な階層区切り文字を指定したフルパスを指定する必要があります。 ImapMailboxInfoクラスのGetMailboxメソッドやCreateChildメソッドを使う場合、階層区切り文字を意識せずに子メールボックスの取得・作成ができます。
+

          
+
#tabpage(codelang=cs,container-title=下位の階層のメールボックスを操作する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを取得
+
  ImapMailboxInfo inbox = client.GetInbox();
+

          
+
  // INBOXの下位に"test"という名前のメールボックスを作成する
+
  inbox.CreateChild("test");
+

          
+
  // INBOXの下位にあるメールボックス"test"を取得する
+
  ImapMailboxInfo test = inbox.GetChild("test");
+

          
+
  // INBOXの下位にあるすべてのメールボックスを取得する
+
  foreach (ImapMailboxInfo child in inbox.GetMailboxes()) {
+
    Console.WriteLine(child.FullName);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
メールボックスで使われる階層区切り文字を取得するにはImapMailboxInfo.MailboxSeparatorプロパティを参照してください。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスの階層区切り文字を取得する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  ImapMailboxInfo inbox = client.GetInbox();
+

          
+
  // INBOXの階層区切り文字を取得・表示
+
  Console.WriteLine(inbox.MailboxSeparator);
+
}
+
}}
+
#tabpage-end
+

          
+
****特別なメールボックス [#operation_examples_mailbox_specialuse]
+
メールクライアント上で「受信トレイ」と表示されるメールボックスには、INBOXというIMAPプロトコルで定められた名前が付けられています。 これ以外にもよく使われる''特別なメールボックス''に「送信済みメール」「ごみ箱」「下書き」などがあります。 一般的にこれらのメールボックスには「Sent」「Trash」「Drafts」といった名前が付けられていることが多いですが、IMAPプロトコルではこれらのメールボックス名は定められていないため、クライアントやサーバーの実装によってはこれと異なる名前が付けられている場合があります。 また、これらのメールボックスがINBOXと同階層にある場合や下位にある場合もあり、まちまちです。
+

          
+
IMAPサーバーがSPECIAL-USE(&urn2url(urn:ietf:rfc:6154);)をサポートしている場合、具体的な名前が分からない場合でもこれらの特別なメールボックスを取得することが出来ます。 [[ImapClient.GetMailboxなどのメソッド>#operation_reference_mailbox_getcreate]]では、引数にImapSpecialMailbox列挙体の値を指定することで、特別なメールボックスを取得することが出来ます。
+

          
+
#tabpage(codelang=cs,container-title=特別なメールボックスを取得する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // サーバーがSPECIAL-USE(RFC6154)をサポートしているか調べる
+
  if (client.ServerCapabilities.Contains(ImapCapability.SpecialUse)) {
+
    // 「送信済みメール」のメールボックスを取得する
+
    ImapMailboxInfo sent = client.GetMailbox(ImapSpecialMailbox.Sent);
+

          
+
    // 「下書き」のメールボックスを取得する
+
    ImapMailboxInfo drafts = client.GetMailbox(ImapSpecialMailbox.Drafts);
+

          
+
    // 「ごみ箱」のメールボックスを取得する
+
    ImapMailboxInfo trash = client.GetMailbox(ImapSpecialMailbox.Trash);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****メールボックスの購読 [#operation_examples_mailbox_subscribe]
+
IMAPではメールボックスを購読(SUBSCRIBE)するという機能があります。 メールクライアント上では購読中のメールボックスのみを表示するようにし、それ以外は見かけ上存在しないものとして扱うようにすることができます。 [[ImapClient.GetMailboxes>#operation_reference_mailbox_getcreate]]などのメールボックスを取得するメソッドでは引数にImapMailboxListOptionsを指定することができ、ImapMailboxListOptions.SubscribedOnlyを指定すれば購読中のメールボックスのみを取得することができます。
+

          
+
#tabpage(codelang=cs,container-title=購読中のメールボックスを取得する例)
+
#code{{
+
using (var client = new ImapClient()) {
+
  // アカウントの全てのメールボックスを取得して表示
+
  Console.WriteLine("[all mailboxes]");
+
  foreach (ImapMailboxInfo mailbox in client.GetMailboxes()) {
+
    Console.WriteLine(mailbox.FullName);
+
  }
+

          
+
  // アカウントの購読中のメールボックスを取得して表示
+
  Console.WriteLine("[subscribed mailboxes]");
+
  foreach (ImapMailboxInfo mailbox in client.GetMailboxes(ImapMailboxListOptions.SubscribedOnly)) {
+
    Console.WriteLine(mailbox.FullName);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
例えばアカウントが次のようなメールボックスを持っていて、''X''の付いたメールボックスのみを購読している場合、取得されるメールボックスは次のようになります。
+

          
+
#column
+
#preformatted(アカウントのメールボックスと購読状況){{
+
|--[X] 受信トレイ
+
|  |--[X] フォルダ1
+
|  |  `--[ ] サブフォルダ1
+
|  `--[X] フォルダ2
+
|--[X] 下書き
+
`--[X] ごみ箱
+
   `--[ ] フォルダ1
+
}}
+
#column
+
#prompt(ImapMailboxListOptionsの指定なし){{
+
INBOX
+
INBOX.フォルダ1
+
INBOX.フォルダ1.サブフォルダ1
+
INBOX.フォルダ2
+
下書き
+
ごみ箱
+
ごみ箱.フォルダ1
+
}}
+
#column
+
#prompt(ImapMailboxListOptions.SubscribedOnlyを指定){{
+
INBOX
+
INBOX.フォルダ1
+
INBOX.フォルダ2
+
下書き
+
ごみ箱
+
}}
+
#column-end
+

          
+
メールボックスの購読状況はImapMailboxInfoクラスの[[SubscribeメソッドおよびUnsubscribeメソッド>#operation_reference_mailbox_control]]を使うことにより変更することができます。 また[[ImapClient.CreateMailboxなど>#operation_reference_mailbox_getcreate]]メールボックスを作成するメソッドでは、作成すると同時に購読状態にするかどうかも指定することができます。
+

          
+
****メールボックスの選択 [#operation_examples_mailbox_select]
+
IMAPでは、メールボックスにあるメッセージの取得や検索・削除・コピーなどの操作は、''選択済みメールボックス''(selected mailbox)に対してのみ行うことができます。 [[ImapClient.OpenMailboxメソッドやImapMailboxInfo.Openメソッド>#operation_reference_mailbox_select]]を呼び出すことでメールボックスの選択(SELECT)が行えます。 これらのメソッドではImapOpenedMailboxInfoクラスのインスタンスが返されます。 ImapOpenedMailboxInfoクラスはImapMailboxInfoクラスから派生したクラスで、[[メッセージの取得>#operation_reference_message_get]]など[[選択済みメールボックスに対してのみ行える操作>#operation_reference_selectedmailbox]]が追加されています。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスの選択を行う例)
+
#code{{
+
using (var client = new ImapClient()) {
+
  // INBOXを開く
+
  ImapOpenedMailboxInfo inbox = client.OpenInbox();
+

          
+
  // INBOX.Trashを開く
+
  ImapOpenedMailboxInfo trash = client.OpenMailbox("INBOX.Trash");
+
}
+
}}
+
#tabpage-end
+

          
+
メールボックスへの[[メッセージのアップロード>#operation_examples_message_append]]は、メールボックスを選択しなくても行うことができます。
+

          
+
IMAPでは、メールボックスを''読み取り専用''で開くことができます。 読み取り専用で開いたメールボックスでは、メッセージに設定されている''新着フラグ''(``\Recent``)は消失せず、メッセージへのフラグの設定なども反映されません。 読み取り専用でメールボックスを開くには、[[ImapClient.OpenMailboxメソッドやImapMailboxInf.Openメソッド>#operation_reference_mailbox_select]]の引数&var{asReadOnly};にtrueを指定します。
+

          
+
#tabpage(codelang=cs,container-title=読み取り専用でメールボックスを開く例)
+
#code{{
+
using (var client = new ImapClient()) {
+
  // 読み取り専用でINBOXを開く
+
  ImapOpenedMailboxInfo inbox = client.OpenInbox(true);
+

          
+
  // 読み取り専用でINBOX.Trashを開く
+
  ImapOpenedMailboxInfo trash = client.OpenMailbox("INBOX.Trash", true);
+
}
+
}}
+
#tabpage-end
+

          
+
****メールボックスのクローズ [#operation_examples_mailbox_close]
+
IMAPでは選択したメールボックスを閉じる(CLOSE)際に''削除予定のフラグ''(``\Deleted``)を付けられているメッセージの削除が行われます。 [[ImapOpenedMailboxInfo.Closeメソッド>#operation_reference_selectedmailbox_control]]を呼び出すことでメールボックスを閉じることができますが、usingステートメントとともにImapOpenedMailboxInfoを使うことによりブロックから抜ける時点で自動的にメールボックスを閉じるようにすることもできます。
+

          
+
#tabpage(codelang=cs,container-title=開いたメールボックスを閉じる例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  ImapOpenedMailboxInfo inbox = client.OpenInbox();
+

          
+
  // 送信日時が2013年7月1日以前のメールに削除フラグ(\Deleted)を追加する
+
  inbox.GetMessages(ImapSearchCriteria.SentBefore(new DateTime(2013, 7, 1))).AddFlags(ImapMessageFlag.Deleted);
+

          
+
  // INBOXを閉じる (同時に削除フラグが設定されたメッセージが削除される)
+
  inbox.Close();
+
}
+
}}
+

          
+
次のコードは上記のコードと同じ動作となります。
+

          
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+

          
+
  // 送信日時が2013年7月1日以前のメールに削除フラグ(\Deleted)を追加する
+
    inbox.GetMessages(ImapSearchCriteria.SentBefore(new DateTime(2013, 7, 1))).AddFlags(ImapMessageFlag.Deleted);
+

          
+
  } // ブロックを抜ける時点でImapOpenedMailboxInfo.Closeメソッドが呼び出される
+
}
+
}}
+
#tabpage-end
+

          
+
この例で使用しているImapSearchCriteriaについては[[#operation_examples_message_search]]を参照してください。 また、メッセージを削除する際の注意点については[[#operation_examples_message_delete]]もご覧ください。
+

          
+
***メッセージの操作 [#operation_examples_message]
+
****メッセージの取得と通番・UID [#operation_examples_message_number]
+
メールボックスにあるメッセージ(メール)の情報を取得するには[[ImapOpenedMailboxInfo.GetMessagesなどのメソッド>#operation_reference_message_get]]を呼び出します。
+

          
+
IMAPではすべてのメッセージに1から始まる通し番号(sequence number, ''通番'')とユニークID(unique id, ''UID'')が割り振られます。 目的のメッセージの通番またはUIDが分かっている場合は、ImapOpenedMailboxInfo.GetMessageByUidやImapOpenedMailboxInfo.GetMessageBySequenceなどのメソッドを使うことで該当するメッセージのImapMessageInfoを取得することができます。 取得したメッセージの通番・UIDを取得するには、ImapMessageInfo.SequenceおよびImapMessageInfo.Uidプロパティを参照してください。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスにあるメッセージを取得する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // INBOXにあるすべてのメッセージを列挙
+
    foreach (ImapMessageInfo message in inbox.GetMessages()) {
+
      // 通番とUIDを表示
+
      Console.WriteLine("#{0} UID={1}", message.Sequence, message.Uid);
+
    }
+

          
+
    // 通番1のメッセージを取得
+
    ImapMessageInfo m1 = inbox.GetMessageBySequence(1);
+

          
+
    // UIDが1234のメッセージを取得
+
    ImapMessageInfo m2 = inbox.GetMessageByUid(1234);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
通番・UIDのどちらも明らかでない場合は[[メッセージの検索>#operation_examples_message_search]]を行うことにより目的のメッセージを取得することもできます。
+

          
+
通番は''永続的でない値''であるのに対し、UIDは''永続的な値''です。 各メールボックス内にあるメッセージには通番が割り振られますが、メッセージの削除や追加が行われるとこの番号は変わります。 従って通番1のメッセージは、次に操作を行おうとした時には異なるメッセージを表すものとなっている可能性があります。 一方、UIDはメールボックス内にメッセージが追加された時点で割り振られ、以降その値が変わることはありません。 従って、該当するメッセージが削除されない限り同一のメッセージを表すものとなります。
+

          
+
なお、サーバーの設定によってはUIDが永続的でないメールボックスが存在する場合もあります。 このようなメールボックスでは、ImapOpenedMailboxInfo.IsUidPersistentがfalseとなります。
+

          
+
****メッセージの本文のダウンロード [#operation_examples_download]
+
メッセージの本文を取得するには[[ImapMessageInfoクラスのOpenRead・Save・ReadAllTextなどのメソッド>#operation_reference_message_readbody]]を使います。 取得される本文はヘッダ部分を含みます。
+

          
+
#tabpage(codelang=cs,container-title=メッセージの本文をダウンロードする例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // 通番1のメッセージを取得する
+
    ImapMessageInfo message = inbox.GetMessageBySequence(1);
+

          
+
    // メッセージ本文をダウンロードしてファイル"1.eml"に保存する
+
    message.Save("1.eml");
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
IMAPでは本文のダウンロードと同時にメッセージを既読状態に(``\Seen``フラグをセット)することができます。 メッセージ本文を取得するメソッドの引数にImapMessageFetchBodyOptions.SetSeenを指定した場合、本文の取得が完了した時点でメッセージを既読にします。
+

          
+
#tabpage(codelang=cs,container-title=メッセージ本文のダウンロードと同時に既読にする例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // 通番1のメッセージを取得する
+
    ImapMessageInfo message = inbox.GetMessageBySequence(1);
+

          
+
    // メッセージ本文をダウンロードしてファイル"1.eml"に保存したあと、既読にする
+
    message.Save("1.eml", ImapMessageFetchBodyOptions.SetSeen);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****メッセージの属性 [#operation_examples_message_attributes]
+
IMAPサーバーで管理されるメッセージには、いくつかのプロパティ(message attribute, ''属性'')が与えられます。 各メッセージに与えられる属性には''動的属性''と''静的属性''の二種類が存在します。
+

          
+
静的属性とは、メッセージがメールボックスに格納されて以降変更されることがない属性で、例えばメッセージのサイズ(RFC822.SIZE)や、受信したメッセージがメールボックスに追加された日時(INTERNALDATE)、メッセージのエンベロープ(ENVELOPE, ヘッダ情報)がそれに当たります。 一方の動的属性とは、ユーザによる変更が可能な属性で、例えばメッセージのフラグ(FLAGS)がそれにあたります。 このようなメッセージの属性は[[ImapMessageInfoクラスのプロパティ>#operation_reference_message_status]]で取得・参照することができます。
+

          
+
なお、属性を未取得の状態でこれらのプロパティを参照しようとした場合、FETCHコマンドを発行して属性情報をダウンロードします。 ImapMessageInfoインスタンスの取得と同時に属性情報も取得したい場合は、[[ImapOpenedMailboxInfo.GetMessagesなどのメソッド>#operation_reference_message_get]]でImapMessageFetchAttributeOptionsを指定します。
+

          
+
#tabpage(codelang=cs,container-title=メッセージの属性を取得・参照する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // ImapMessageFetchAttributeOptionsを指定せずにINBOXにあるすべてのメッセージを列挙
+
    foreach (ImapMessageInfo message in inbox.GetMessages()) {
+
      // メッセージのサブジェクト(デコードされたSubjectヘッダ)を取得して表示
+
      // (ここで静的属性を取得するコマンドが発行される)
+
      Console.WriteLine("#{0} subject: {1}", message.Sequence, message.EnvelopeSubject);
+

          
+
      // メッセージが既読かどうかを取得して表示
+
      // (ここで動的属性を取得するコマンドが発行される)
+
      Console.WriteLine("#{0} is seen? {1}", message.Sequence, message.IsSeen);
+
    }
+

          
+
    // ImapMessageFetchAttributeOptions.AllAttributes(すべての属性を取得)を指定して
+
    // INBOXにあるすべてのメッセージを列挙
+
    foreach (ImapMessageInfo message in inbox.GetMessages(ImapMessageFetchAttributeOptions.AllAttributes)) {
+
      // メッセージのサブジェクト(デコードされたSubjectヘッダ)を取得して表示
+
      // (静的属性を取得するコマンドは発行されない)
+
      Console.WriteLine("#{0} subject: {1}", message.Sequence, message.EnvelopeSubject);
+

          
+
      // メッセージが既読かどうかを取得して表示
+
      // (動的属性を取得するコマンドは発行されない)
+
      Console.WriteLine("#{0} is seen? {1}", message.Sequence, message.IsSeen);
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****メッセージのフラグ [#operation_examples_message_flags]
+
IMAPではメッセージの状態を管理するために個々のメッセージに''フラグ''を持たせることができます。 フラグには削除予定であることを表す``\Deleted``や、新着メッセージであることを表す``\Recent``、既読であることをあらわす``\Seen``などがあります。 メッセージに設定されているフラグは[[ImapMessageInfoクラスのIsMarkedAsDeleted, IsRecent, IsSeenなどのプロパティや、Flagsプロパティ>#operation_reference_message_status]]を参照することで取得することができます。
+

          
+
これらのフラグはユーザーが変更することもできます。 [[ImapMessageInfo.AddFlagsメソッドやStoreメソッド>#operation_reference_message_control]]を使うことでこれらのフラグを変更することができます。 ただし、``\Recent``フラグはサーバーのみが変更することができ、ユーザーがこのフラグを変更することはできません。
+

          
+
IMAPでは``\Deleted``や``\Seen``など特別な意味を持つフラグ以外にも、ユーザー定義のフラグ(''キーワード'')を持たせることもできます。 よく使われるキーワードとして、迷惑メールであることを表す``Junk``や、Thunderbirdの「重要」タグ(``$label1``)や「ToDo」タグ(``$label4``)などがありますが、これ以外にも独自にキーワードを持たせて管理することができます。
+

          
+
#tabpage(codelang=cs,container-title=メッセージのフラグ・キーワードを取得・設定する例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
    // INBOXを開く
+
    using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
      // 動的属性(フラグを含む)とともに全てのメッセージを取得
+
      foreach (ImapMessageInfo message in inbox.GetMessages(ImapMessageFetchAttributeOptions.DynamicAttributes)) {
+
        // メッセージに付与されているすべてのフラグとキーワードを表示
+
        Console.WriteLine("#{0}: {1}", message.Sequence, string.Join(", ", message.Flags));
+
      }
+

          
+
      // 通番1のメッセージを取得してThunderbirdの「後で」タグ($label5)を付ける
+
      inbox.GetMessageBySequence(1).AddKeywords("$label5");
+

          
+
      // 通番2のメッセージから既読フラグを削除する(未読にする)
+
      inbox.GetMessageBySequence(2).RemoveFlags(ImapMessageFlag.Seen);
+

          
+
      // 通番3のメッセージの既読・未読状態を反転する
+
      inbox.GetMessageBySequence(3).ToggleFlags(ImapMessageFlag.Seen);
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
なお、キーワードは大文字小文字の違いが無視されます。 従って、メッセージにキーワード``FOO``と``foo``の二つを設定しようとしても、サーバー上ではどちらも同じキーワードとして保持されます。 また、[[検索クエリにキーワードを指定する>#operation_examples_message_search]]場合も、大文字小文字の違いが無視された上で検索されます。
+

          
+
サーバーの種類やメールボックスの設定によってはキーワードの設定や変更できるフラグに制限がある場合があります。 これらの設定は[[ImapOpenedMailboxInfo.IsAllowedToCreateKeywordsなどのプロパティ>#operation_reference_selectedmailbox_status]]を参照することで確認できます。 また、[[読み取り専用で開いたメールボックス>#operation_examples_mailbox_select]]では、フラグの変更は反映されません。
+

          
+
``\Deleted``フラグとメッセージの削除に関する動作・注意点については[[#operation_examples_message_delete]]を参照してください。
+

          
+
****メッセージの検索 [#operation_examples_message_search]
+
IMAPではサーバーサイドでのメッセージの検索(SEARCH)がサポートされます。 [[ImapOpenedMailboxInfo.GetMessagesメソッド>#operation_reference_message_get]]では検索クエリを指定することにより、該当するメッセージを検索して取得することができます。 検索クエリにはImapSearchCriteriaクラス(Smdn.Net.Imap4名前空間)を使います。
+

          
+
#tabpage(codelang=cs,container-title=メッセージの検索を行う例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // INBOXにあるすべての未読(unseen)メッセージを列挙
+
    foreach (ImapMessageInfo message in inbox.GetMessages(ImapSearchCriteria.Unseen)) {
+
      // UIDを表示
+
      Console.WriteLine(message.Uid);
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
ImapSearchCriteriaクラスは、値を結合することにより複雑な検索クエリを組み立てることも出来ます。
+

          
+
#tabpage(codelang=cs,container-title=ImapSearchCriteriaによる検索クエリの指定例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // 検索条件1: 差出人に文字列「コンサル」を含む
+
    ImapSearchCriteria c1 = ImapSearchCriteria.From("コンサル");
+
    // 検索条件2: ヘッダまたは本文に文字列「無料でお試し」を含む
+
    ImapSearchCriteria c2 = ImapSearchCriteria.Text("無料でお試し");
+
    // 検索条件3: 既読(\Seen)かつユーザー定義のキーワード"Junk"が設定されている
+
    ImapSearchCriteria c3 = ImapSearchCriteria.Seen & ImapSearchCriteria.Keyword("Junk");
+

          
+
    // 検索条件: 1〜3のいずれかの条件を満たす
+
    ImapSearchCriteria c = c1 | c2 | c3;
+

          
+
    // INBOXから検索条件に一致するメッセージを検索して列挙
+
    // (検索文字列のエンコーディングにUTF-8を使用)
+
    foreach (ImapMessageInfo message in inbox.GetMessages(c, Encoding.UTF8)) {
+
      // 条件にマッチしたメッセージのUIDを表示
+
      Console.WriteLine(message.Uid);
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****複数のメッセージに対する操作 (ImapMessageInfoList) [#operation_examples_message_multiplemessages]
+
ImapOpenedMailboxInfo.GetMessagesメソッドなどで複数のメッセージの取得・検索を行った結果はImapMessageInfoListとして返されます。 ImapMessageInfoListクラスは検索結果として得られたメッセージの通番・UIDをカプセル化するクラスで、foreach文などにより列挙を行うまではImapMessageInfoを生成しないという点でList<ImapMessageInfo>などのコレクションとは異なります。
+

          
+
複数のメッセージをまとめてコピー・削除したりすることができるように、ImapMessageInfoListクラスには[[CopyToメソッドやDeleteメソッド>#operation_reference_message_control]]などImapMessageInfoと共通のメソッドが複数用意されています。 ImapMessageInfoListクラスのメソッドを使うことにより、複数のメッセージに対する操作の場合でもメッセージの数に関わらず一度のコマンド発行で済ませることができます。
+

          
+
#tabpage(codelang=cs,container-title=複数のメッセージを別のメールボックスにコピーする例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // 返信済みのメッセージを取得する
+
    ImapMessageInfoList answerdMessages = inbox.GetMessages(ImapSearchCriteria.Answered);
+

          
+
    // メッセージをメールボックス「返信済み」にコピーする
+
    answerdMessages.CopyTo("返信済み");
+
  }
+
}
+
}}
+

          
+
以下のコードは上記のコードと結果は同じですが、メッセージの数だけコマンド発行が行われます。
+

          
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    // 返信済みのメッセージを取得する
+
    ImapMessageInfoList answerdMessages = inbox.GetMessages(ImapSearchCriteria.Answered);
+

          
+
    // 取得できたメッセージを列挙
+
    foreach (ImapMessageInfo answerdMessage in answerdMessages) {
+
      // メッセージをメールボックス「返信済み」にコピーする
+
      answerdMessage.CopyTo("返信済み");
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
****メッセージの削除 [#operation_examples_message_delete]
+
IMAPでは、メッセージの削除を行う場合、まず``\Deleted``フラグを設定することにより''削除予定''であることをマークし([[#operation_examples_message_flags]])、その後EXPUNGEコマンドまたはCLOSEコマンドを発行することにより``\Deleted``フラグが設定されたメッセージの削除が行われます。
+

          
+
[[ImapMessageInfo.Deleteメソッド>#operation_reference_message_control]]は``\Deleted``フラグの設定とEXPUNGEコマンドの発行を行うことによりメッセージを削除します。 そのため、他に``\Deleted``フラグが設定されているメッセージがある場合、ImapMessageInfo.Deleteメソッドを呼び出すことによって他のメッセージも同時に削除される点に注意してください。
+

          
+
#tabpage(codelang=cs,container-title=メッセージの削除を行う例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
    ImapMessageInfo m1 = inbox.GetMessageBySequence(1);
+
    ImapMessageInfo m2 = inbox.GetMessageBySequence(2);
+
    ImapMessageInfo m3 = inbox.GetMessageBySequence(3);
+

          
+
    // 通番1のメッセージに\Deletedフラグを追加する
+
    m1.AddFlags(ImapMessageFlag.Deleted);
+

          
+
    // 通番2のメッセージに\Deletedフラグを追加する
+
    m2.AddFlags(ImapMessageFlag.Deleted);
+

          
+
    // 通番3のメッセージを削除する
+
    // (\Deletedフラグを設定した後にEXPUNGEコマンドを発行するが、
+
    // \Deletedフラグが設定されているm1, m2も同時に削除される)
+
    m3.Delete();
+

          
+
    // IsDeletedはすべてtrueとなる
+
    Console.WriteLine(m1.IsDeleted);
+
    Console.WriteLine(m2.IsDeleted);
+
    Console.WriteLine(m3.IsDeleted);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
なお、IMAP拡張コマンドであるUID EXPUNGEコマンド(&urn2url(urn:ietf:rfc:4315);)をサポートしているサーバーの場合はこのような動作とはならず、ImapMessageInfo.DeleteメソッドはImapMessageInfoが表すメッセージのみを削除します。
+

          
+
****メッセージの移動 [#operation_examples_message_move]
+
IMAPにはメッセージの移動を行うコマンドが用意されていないため、[[ImapMessageInfo.MoveTo>#operation_reference_message_control]]などのメソッドではコピーと削除の操作を組み合わせることで移動の操作をエミュレートします。 そのため、移動を行おうとしてコピーを行ったが、その後の削除に失敗した場合などには、コピー元とコピー先のメールボックスに同一のメッセージが存在することとなります。 現在の実装では、コピー後の削除に失敗してもそのままにします(コピー先のメッセージを削除してコピー前の状態にするような実装とはなっていません)。
+

          
+
なお、IMAP拡張コマンドであるMOVEコマンド(&urn2url(urn:ietf:rfc:6851);)をサポートするサーバーの場合は、ImapMessageInfo.MoveToなどのメソッドはMOVEコマンドを使ってメッセージの移動を行います。
+

          
+
****ImapMessageInfoの有効期限
+
ImapMessageInfoは、その取得元のメールボックス(ImapOpenedMailboxInfo)が開かれている間のみ有効です。 メールボックスを閉じた後にImapMessageInfoを使って操作を行おうとした場合はImapUnavailableExceptionをスローします。 また、同名のメールボックスを再度開いた場合でも有効にはならず、再度ImapMessageInfoを取得しなおす必要があります。
+

          
+
#tabpage(codelang=cs,container-title=ImapMessageInfoの有効期限)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを開く
+
  ImapOpenedMailboxInfo inbox = client.OpenInbox();
+

          
+
  // INBOXから通番1のメッセージを取得する
+
  ImapMessageInfo m = inbox.GetMessageBySequence(1);
+

          
+
  // 新たに別のメールボックスを開く (INBOXは閉じられる)
+
  ImapOpenedMailboxInfo test = client.OpenMailbox("test");
+

          
+
  // INBOXから取得したメッセージは既に利用不可能なため、ImapUnavailableExceptionをスローする
+
  string body = m.ReadAllText();
+

          
+
  // INBOXを開きなおしてもメッセージは引き続き利用不可能
+
  inbox = client.OpenInbox();
+

          
+
  body = m.ReadAllText();
+
}
+
}}
+
#tabpage-end
+

          
+
さらに、MoveToメソッドやDeleteメソッドによりメッセージを移動・削除した場合も、以降は無効となります。 ImapMessageInfoが有効かどうかを調べるにはImapMessageInfo.IsAvailableプロパティを参照してください。
+

          
+
この他にも、IMAPでは複数のクライアントが同時に操作を行うことが許可されているため、メッセージに対して操作を行おうとした時点ではメッセージが削除されている、といった場合もあります。 そういった場合には例外ImapMessageVanishedExceptionをスローします。
+

          
+
****メッセージのアップロード [#operation_examples_message_append]
+
IMAPではユーザーがメッセージをアップロードしてメールボックスへ追加(APPEND)することができます。 メッセージのアップロードには[[ImapMailboxInfo.AppendMessageなどのメソッド>#operation_reference_message_append]]を使うことが出来ます。 アップロードの際、オプションでメールボックスへの追加日時(INTERNALDATE)とフラグを設定することもできます。
+

          
+
なお、選択されていないメールボックスへもメッセージのアップロードが出来るため、アップロードに際して[[メールボックスの選択>#operation_examples_mailbox_select]]を行う必要はありません。
+

          
+
#tabpage(codelang=cs,container-title=メッセージのアップロードを行う例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // INBOXを取得する
+
  ImapMailboxInfo inbox = client.GetInbox();
+

          
+
  // ファイルtest1.emlを開いてINBOXにアップロードする
+
  using (Stream stream = File.OpenRead("test1.eml")) {
+
    inbox.AppendMessage(stream);
+
  }
+

          
+
  // ファイルtest2.emlを開いてINBOXにアップロードする
+
  // 合わせてINTERNALDATEとフラグも設定する
+
  DateTimeOffset internalDate = new DateTimeOffset(2013, 7, 1, 0, 0, 0, TimeSpan.FromHours(+9.0));
+
  ImapMessageFlagSet flags = new ImapMessageFlagSet();
+

          
+
  flags.Add(ImapMessageFlag.Seen); // 既読状態で追加する
+
  flags.Add(new ImapMessageFlag("junk")); // キーワード"junk"を設定する
+

          
+
  using (Stream stream = File.OpenRead("test2.eml")) {
+
    inbox.AppendMessage(stream, internalDate, flags);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
***その他の操作 [#operation_examples_misc]
+
****サーバーからの通知 [#operation_examples_misc_notification]
+
IMAPでは複数のクライアントが同時に操作を行うことが許可されているため、他のクライアントがメッセージの追加・削除を行ったことによるメールボックスのステータス変更などが通知されます。 こういった通知は発行したコマンドに対するレスポンスに付随して送信されてきます。 新着メールの受信などもこれらの通知に含まれます。 これらのステータス変更は[[ImapClientクラスのExistMessageCountChangedイベントなど>#operation_reference_misc_events]]によって検知することができます。 また、定期的に[[ImapMailboxInfo.Refreshメソッド>#operation_reference_mailbox_control]]を呼び出してステータスを更新することでも他のクライアントによる変更を検知できます。
+

          
+

          
+

          
+
//TODO
+
//****INBOXの削除・移動
+
//****BODYSTRUCTURE
+

          
+

          
+
**機能別リファレンス [#operation_reference]
+
以下はSmdn.Net.Imap4.Client名前空間の各クラスの機能別の簡易リファレンスです。
+

          
+
***メールボックスに対する操作 [#operation_reference_mailbox]
+
****メールボックスの取得と作成 [#operation_reference_mailbox_getcreate]
 
以下はメールボックスの取得と作成に関するメソッドです。
以下はメールボックスの取得と作成に関するメソッドです。
 

        

        
 
|*ImapClientクラスのメソッド
|*ImapClientクラスのメソッド
1256,7 631,7
 
::RequestStatus|メールボックスの取得と同時に、メールボックスのメッセージ数などのステータスも取得します。 このオプションを指定しない場合は、ステータスは取得しません。
::RequestStatus|メールボックスの取得と同時に、メールボックスのメッセージ数などのステータスも取得します。 このオプションを指定しない場合は、ステータスは取得しません。
 
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 

        

        
~
****メールボックスの操作 [#operation_reference_mailbox_control]
***メールボックスの操作
 
以下はメールボックスの削除・作成・リネーム等の操作に関するメソッドです。
以下はメールボックスの削除・作成・リネーム等の操作に関するメソッドです。
 

        

        
 
|*ImapMailboxInfoクラスのメソッド
|*ImapMailboxInfoクラスのメソッド
1272,7 647,7
 

        

        
 
:移動先のメールボックス|移動先のメールボックスをImapMailboxInfoで指定する場合、ImapMailboxInfoが異なるクライアントから取得したものだった場合はNotImplementedExceptionをスローします。 アカウントもしくはサーバをまたがるメールボックスの移動は今後のバージョンで実装予定です。
:移動先のメールボックス|移動先のメールボックスをImapMailboxInfoで指定する場合、ImapMailboxInfoが異なるクライアントから取得したものだった場合はNotImplementedExceptionをスローします。 アカウントもしくはサーバをまたがるメールボックスの移動は今後のバージョンで実装予定です。
 

        

        
~
****メールボックスの状態の取得 [#operation_reference_mailbox_status]
***メールボックスの状態の取得
 
以下はメールボックスの状態を表すプロパティです。
以下はメールボックスの状態を表すプロパティです。
 

        

        
 
|*ImapMailboxInfoクラスのプロパティ
|*ImapMailboxInfoクラスのプロパティ
1295,7 670,7
 
|NextUid|メールボックスの次のメッセージに付与されるUIDを返します。 UIDが永続的でない場合などは、0を返します。|
|NextUid|メールボックスの次のメッセージに付与されるUIDを返します。 UIDが永続的でない場合などは、0を返します。|
 
|~プロパティ|~解説|f
|~プロパティ|~解説|f
 

        

        
~
****メールボックスの選択 [#operation_reference_mailbox_select]
***メールボックスの選択
 
以下はメールボックスの選択に関するメソッドです。 メールボックス内のメッセージに対する操作は、現在選択しているメールボックスのものに対してのみ行えます。
以下はメールボックスの選択に関するメソッドです。 メールボックス内のメッセージに対する操作は、現在選択しているメールボックスのものに対してのみ行えます。
 

        

        
 
|*ImapClientクラスのメソッド
|*ImapClientクラスのメソッド
1332,8 707,8
 

        

        
 
:すべてのメソッド|これらのメソッドは、選択済みメールボックスを表すImapOpenedMailboxInfoクラスのインスタンスを返します。
:すべてのメソッド|これらのメソッドは、選択済みメールボックスを表すImapOpenedMailboxInfoクラスのインスタンスを返します。
 

        

        
~
***選択済みメールボックスに対する操作 [#operation_reference_selectedmailbox]
**選択済みメールボックスに対する操作
~
****選択済みメールボックスの操作 [#operation_reference_selectedmailbox_control]
***選択済みメールボックスの操作
 
以下は選択済みメールボックスの操作に関するメソッドです。
以下は選択済みメールボックスの操作に関するメソッドです。
 

        

        
 
|*ImapOpenedMailboxInfoクラスのメソッド
|*ImapOpenedMailboxInfoクラスのメソッド
1348,7 723,7
 
|CloseMailbox()|選択済みのメールボックスがある場合、メールボックスを閉じます。 ない場合は何もしません。|CLOSE|
|CloseMailbox()|選択済みのメールボックスがある場合、メールボックスを閉じます。 ない場合は何もしません。|CLOSE|
 
|~メソッド|~解説|~対応するIMAPコマンド|f
|~メソッド|~解説|~対応するIMAPコマンド|f
 

        

        
~
****選択済みメールボックスの状態 [#operation_reference_selectedmailbox_status]
***選択済みメールボックスの状態
 
以下は選択済みメールボックスの状態を表すプロパティです。
以下は選択済みメールボックスの状態を表すプロパティです。
 

        

        
 
|*ImapOpenedMailboxInfoクラスのプロパティ
|*ImapOpenedMailboxInfoクラスのプロパティ
1362,7 737,7
 
|FirstUnseenMessageNumber|メールボックスを選択した時点で最初の未読メッセージの通番を返します。 未読メッセージがない場合は0を返します。|
|FirstUnseenMessageNumber|メールボックスを選択した時点で最初の未読メッセージの通番を返します。 未読メッセージがない場合は0を返します。|
 
|~プロパティ|~解説|f
|~プロパティ|~解説|f
 

        

        
~
****メッセージの待機 (IDLE) [#operation_reference_selectedmailbox_idle]
***メッセージの待機 (IDLE)
 
以下は選択済みメールボックスでのメッセージの待機、アイドルに関するメソッドです。
以下は選択済みメールボックスでのメッセージの待機、アイドルに関するメソッドです。
 

        

        
 
|*ImapOpenedMailboxInfoクラスのメソッド
|*ImapOpenedMailboxInfoクラスのメソッド
1425,8 800,8
 
また、待機中でも受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
また、待機中でも受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
 
このため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
このため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
 

        

        
~
***メールボックス内のメッセージに対する操作 [#operation_reference_message]
**メールボックス内のメッセージに対する操作
~
****メッセージの取得と検索 [#operation_reference_message_get]
***メッセージの取得と検索
 
以下はメールボックスにあるメッセージの取得と検索に関するメソッドです。
以下はメールボックスにあるメッセージの取得と検索に関するメソッドです。
 

        

        
 
|*ImapOpenedMailboxInfoクラスのメソッド
|*ImapOpenedMailboxInfoクラスのメソッド
1458,7 833,7
 
::Default, None|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
::Default, None|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 
:ImapMessageInfoList.GetEnumerator()|このメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
:ImapMessageInfoList.GetEnumerator()|このメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
 

        

        
~
****メッセージの状態の取得 [#operation_reference_message_status]
***メッセージの状態の取得
 
以下はメッセージの状態を表すプロパティです。
以下はメッセージの状態を表すプロパティです。
 

        

        
 
|*ImapMessageInfoクラスのプロパティ
|*ImapMessageInfoクラスのプロパティ
1470,7 845,6
 
|Mailbox|メッセージが属するメールボックスを表すインスタンスを返します。|
|Mailbox|メッセージが属するメールボックスを表すインスタンスを返します。|
 
|IsAvailable|メッセージが利用可能かどうかを表す値を返します。 インスタンスの取得元となったメールボックスが既に閉じられている場合、メッセージが移動または削除されている場合は、falseを返します。|
|IsAvailable|メッセージが利用可能かどうかを表す値を返します。 インスタンスの取得元となったメールボックスが既に閉じられている場合、メッセージが移動または削除されている場合は、falseを返します。|
 
|IsDeleted|メッセージが完全に削除されているかどうかを表す値を返します。|
|IsDeleted|メッセージが完全に削除されているかどうかを表す値を返します。|
+
|>|~動的属性を表すプロパティ|
 
|IsAnswered|メッセージが返信済みかどうかを表す値を返します。 \Answeredフラグが設定されている場合trueを返します。|
|IsAnswered|メッセージが返信済みかどうかを表す値を返します。 \Answeredフラグが設定されている場合trueを返します。|
 
|IsDraft|メッセージが下書きかどうかを表す値を返します。 \Draftフラグが設定されている場合trueを返します。|
|IsDraft|メッセージが下書きかどうかを表す値を返します。 \Draftフラグが設定されている場合trueを返します。|
 
|IsFlagged|メッセージが「フラグ済み」かどうかを表す値を返します。 \Flaggedフラグが設定されている場合trueを返します。|
|IsFlagged|メッセージが「フラグ済み」かどうかを表す値を返します。 \Flaggedフラグが設定されている場合trueを返します。|
1478,7 852,6
 
|IsRecent|メッセージが新着かどうかを表す値を返します。 \Recentフラグが設定されている場合trueを返します。|
|IsRecent|メッセージが新着かどうかを表す値を返します。 \Recentフラグが設定されている場合trueを返します。|
 
|IsSeen|メッセージが既読かどうかを表す値を返します。 \Seenフラグが設定されている場合trueを返します。|
|IsSeen|メッセージが既読かどうかを表す値を返します。 \Seenフラグが設定されている場合trueを返します。|
 
|Flags|メッセージに設定されているフラグ・キーワードの一覧を返します。|
|Flags|メッセージに設定されているフラグ・キーワードの一覧を返します。|
+
|>|~静的属性を表すプロパティ|
 
|IsMultiPart|メッセージがマルチパート形式のメッセージかどうかを表す値を返します。|
|IsMultiPart|メッセージがマルチパート形式のメッセージかどうかを表す値を返します。|
 
|MediaType|メッセージのメディアタイプを返します。|
|MediaType|メッセージのメディアタイプを返します。|
 
|Length|メッセージのサイズをバイト単位で返します。|
|Length|メッセージのサイズをバイト単位で返します。|
1490,10 863,12
 
|~プロパティ|~解説|f
|~プロパティ|~解説|f
 
//|ModSeq||
//|ModSeq||
 

        

        
~
:動的属性を表すプロパティ|メッセージ取得時にImapMessageFetchAttributeOptionsで動的属性を取得するように指定しなかった場合、プロパティの値を参照する際、コマンドを発行してから結果を返します。
:動的属性を表すプロパティ|メッセージ取得時に動的属性を取得するように指定しなかった場合、プロパティの値を参照する際、コマンドを発行してから結果を返します。
~
:静的属性を表すプロパティ|メッセージ取得時にImapMessageFetchAttributeOptionsで静的属性を取得するように指定しなかった場合、プロパティの値を参照する際、コマンドを発行してから結果を返します。
::該当するプロパティ|IsAnswered, IsDraft, IsFlagged, IsMarkedAsDeleted, IsRecent, IsSeen, Flags
-
:静的属性を表すプロパティ|メッセージ取得時に静的属性を取得するように指定しなかった場合、プロパティの値を参照する際、コマンドを発行してから結果を返します。
-
::該当するプロパティ|BodyStructure, Envelope, EnvelopeDate, EnvelopeSubject, InternalDate, Length, MediaType, IsMultiPart
 

        

        
~
****メッセージ本文の取得 [#operation_reference_message_readbody]
***メッセージ本文の取得
 
以下はメッセージ本文の取得に関するメソッドです。
以下はメッセージ本文の取得に関するメソッドです。
 

        

        
 
|*ImapMessageInfoクラスのメソッド
|*ImapMessageInfoクラスのメソッド
1563,7 938,7
 
:::サポートされる文字コード(Content-Typeのcharsetパラメータ)|utf-8, shift_jis, iso-2022-jpほか、ランタイムがサポートする文字コード
:::サポートされる文字コード(Content-Typeのcharsetパラメータ)|utf-8, shift_jis, iso-2022-jpほか、ランタイムがサポートする文字コード
 
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 

        

        
~
****メッセージヘッダの取得 [#operation_reference_message_readheader]
***メッセージヘッダの取得
 
以下はメッセージヘッダ(From, Subject, Content-Type等)の取得に関するメソッドです。
以下はメッセージヘッダ(From, Subject, Content-Type等)の取得に関するメソッドです。
 

        

        
 
|*ImapMessageInfoクラスのメソッド
|*ImapMessageInfoクラスのメソッド
1577,7 952,7
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージのヘッダ部分のみを取得し、単一の文字列として返します。 オプションで取得するヘッダを指定できます。|FETCH|
}}|メッセージのヘッダ部分のみを取得し、単一の文字列として返します。 オプションで取得するヘッダを指定できます。|FETCH|
 

        

        
~
****メッセージの操作 [#operation_reference_message_control]
***メッセージの操作
 
以下はメールボックスにあるメッセージの移動・削除・コピー・フラグの変更等の操作に関するメソッドです。
以下はメールボックスにあるメッセージの移動・削除・コピー・フラグの変更等の操作に関するメソッドです。
 

        

        
 
|*ImapMessageInfoクラスおよびImapMessageInfoListクラスのメソッド&br;(ImapMessageInfoBaseクラスから継承)
|*ImapMessageInfoクラスおよびImapMessageInfoListクラスのメソッド&br;(ImapMessageInfoBaseクラスから継承)
1648,7 1023,7
 
また、選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
また、選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
 
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
 

        

        
~
****メッセージのアップロード(メールボックスへの追加) [#operation_reference_message_append]
***メッセージのアップロード(メールボックスへの追加)
 
以下はメールボックスにメッセージをアップロード(追加)するためのメソッドです。
以下はメールボックスにメッセージをアップロード(追加)するためのメソッドです。
 

        

        
 
|*ImapMailboxInfoクラスのメソッド
|*ImapMailboxInfoクラスのメソッド
1672,8 1047,8
 
:追加先のメールボックス|選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
:追加先のメールボックス|選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
 
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
 

        

        
~
***その他のIMAPの操作 [#operation_reference_misc]
**その他のIMAPの操作
~
****サーバからの通知 [#operation_reference_misc_events]
***サーバからの通知
 
以下はサーバからの通知をハンドリングするためのイベントです。
以下はサーバからの通知をハンドリングするためのイベントです。
 

        

        
 
|*ImapClientクラスのイベント
|*ImapClientクラスのイベント
1685,7 1060,7
 
|AlertReceived|サーバからのアラートを受信した場合に発生します。&br;受信したアラートを含むImapAlertReceivedEventArgsが送られます。|
|AlertReceived|サーバからのアラートを受信した場合に発生します。&br;受信したアラートを含むImapAlertReceivedEventArgsが送られます。|
 
|~メソッド|~解説|f
|~メソッド|~解説|f
 

        

        
~
****クォータ [#operation_reference_misc_quota]
***クォータ
 
以下はクォータの取得に関するメソッドです。
以下はクォータの取得に関するメソッドです。
 

        

        
 
|*ImapClientクラスのメソッド
|*ImapClientクラスのメソッド
1699,7 1074,7
 
|GetQuota()|メールボックスに割り当てられているクォータの一覧をIEnumerable<ImapQuota>で返します。 サーバがQUOTAをサポートしていない場合は、空のIEnumerable<ImapQuota>を返します。|GETQUOTAROOT|
|GetQuota()|メールボックスに割り当てられているクォータの一覧をIEnumerable<ImapQuota>で返します。 サーバがQUOTAをサポートしていない場合は、空のIEnumerable<ImapQuota>を返します。|GETQUOTAROOT|
 
|~メソッド|~解説|~対応するIMAPコマンド|f
|~メソッド|~解説|~対応するIMAPコマンド|f
 

        

        
~
***IMAPコマンドの引数およびレスポンスのデータ型
**IMAPコマンドの引数およびレスポンスのデータ型
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
 
-ImapStoreDataItem
-ImapStoreDataItem
 
-ImapSearchCriteria
-ImapSearchCriteria