2014-06-21T23:16:41の更新内容

works/libs/Smdn.Net.Pop3.Client/releases/index.wiki.txt

current previous
7,32 7,6
 
以下のバージョンはすべて[[MIT X11ライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
以下のバージョンはすべて[[MIT X11ライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
 

        

        
 
|~バージョン|>|~パッケージ|h
|~バージョン|>|~パッケージ|h
+
|~[[1.24 (2014-06-21)>#changes_v1.24]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.24-netfx3.5-combined.zip,.NET 3.5}
+
}}|
+
|~[[1.23 (2014-06-21)>#changes_v1.23]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.23-netfx3.5-combined.zip,.NET 3.5}
+
}}|
 
|~[[1.22 (2014-06-02)>#changes_v1.22]]|~ソースコード|{{
|~[[1.22 (2014-06-02)>#changes_v1.22]]|~ソースコード|{{
 
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.22.tar.bz2}
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.22.tar.bz2}
 
}}|
}}|
293,18 267,6
 
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
 

        

        
 
*変更履歴 [#changes]
*変更履歴 [#changes]
+
**1.24 (2014-06-21) [#changes_v1.24]
+
-修正・改善
+
--PopClient
+
---PopMessageInfoインスタンスの管理、接続処理などの内部実装を一部簡略化
+

          
+
**1.23 (2014-06-21) [#changes_v1.23]
+
-機能追加
+
--PopClient
+
---PopClient.UpdateStatus(), UpdateStatusAsync()を追加、PopClient.MessageCountおよびTotalSizeプロパティを参照する前にメールボックスの情報を取得・更新できるようにした
+
---PopMessageInfo.GetUniqueIdAsync()を追加
+
-修正・改善
+
--アセンブリの製品名(AssemblyProductAttribute)およびバージョン情報(AssemblyInformationalVersionAttribute)にバージョン番号と対象フレームワークを含むパッケージ名の情報を埋め込むようにした
 

        

        
 
**1.22 (2014-06-02) [#changes_v1.22]
**1.22 (2014-06-02) [#changes_v1.22]
 
-機能追加
-機能追加

works/libs/Smdn.Net.Pop3.Client/index.wiki.txt

current previous
13,7 13,7
 
*ダウンロード
*ダウンロード
 
本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
 

        

        
~
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Pop3.Client-1.24.tar.bz2}
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Pop3.Client-1.22.tar.bz2}
 
:開発版|[[http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/]]よりチェックアウトできます
:開発版|[[http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/]]よりチェックアウトできます
 
:ビルド済みパッケージ・過去のバージョン|[[works/libs/Smdn.Net.Pop3.Client/releases]]をご覧ください
:ビルド済みパッケージ・過去のバージョン|[[works/libs/Smdn.Net.Pop3.Client/releases]]をご覧ください
 

        

        

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

current previous
2,7 2,7
 
${smdncms:keywords,}
${smdncms:keywords,}
 
${smdncms:document_versions,codelang=cs,codelang=vb}
${smdncms:document_versions,codelang=cs,codelang=vb}
 
${pragma,parser-options,non-limited-list}
${pragma,parser-options,non-limited-list}
~
[[works/libs/Smdn.Net.Pop3.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.24>works/libs/Smdn.Net.Pop3.Client/releases#changes_v1.24]]時点のものです。
[[works/libs/Smdn.Net.Pop3.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.22>works/libs/Smdn.Net.Pop3.Client/releases#changes_v1.22]]時点のものです。
 

        

        
 
サンプルコードは[[このページの最後>#samples]]にあります。
サンプルコードは[[このページの最後>#samples]]にあります。
 

        

        
40,7 40,7
 
クライアントの実装は次の2種類があります。
クライアントの実装は次の2種類があります。
 
|*クライアント実装の種類と概要
|*クライアント実装の種類と概要
 
|~名前空間|~クラス|~概要|h
|~名前空間|~クラス|~概要|h
~
|Smdn.Net.Pop3.Client|PopClient&br;PopMessageInfo|POPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfoクラスに似たインターフェイスで行えるようにしてあります。 このドキュメントではこれらのクラスについて解説しています。|
|Smdn.Net.Pop3.Client|PopClient&br;PopMessageInfo|POPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfoクラスに似たインターフェイスで行えるようにしてあります。|
 
|Smdn.Net.Pop3.Client.Session|PopSession|POPコマンドと1対1に対応するメソッドを持つクラスです。 POPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|
|Smdn.Net.Pop3.Client.Session|PopSession|POPコマンドと1対1に対応するメソッドを持つクラスです。 POPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|
 

        

        
 
#hr
#hr
286,8 286,8
 
|BeginConnect(string)&br;BeginConnect(string, AsyncCallback, object)&br;BeginConnect(ICredentialsByHost)&br;BeginConnect(ICredentialsByHost, AsyncCallback, object)|Connect()メソッドと同じ処理を非同期的に実行します。 オプションでコールバックメソッドを指定できます。|USER/PASS, STLS, APOP, AUTH, CAPA|
|BeginConnect(string)&br;BeginConnect(string, AsyncCallback, object)&br;BeginConnect(ICredentialsByHost)&br;BeginConnect(ICredentialsByHost, AsyncCallback, object)|Connect()メソッドと同じ処理を非同期的に実行します。 オプションでコールバックメソッドを指定できます。|USER/PASS, STLS, APOP, AUTH, CAPA|
 
|EndConnect(IAsyncResult)|BeginConnect()で開始した非同期接続を完了します。 BeginConnect()を呼び出した場合、EndConnect()で操作を完了する必要があります。|-|
|EndConnect(IAsyncResult)|BeginConnect()で開始した非同期接続を完了します。 BeginConnect()を呼び出した場合、EndConnect()で操作を完了する必要があります。|-|
 
|ConnectAsync(string)&br;ConnectAsync(ICredentialsByHost)|[.NET 4.0]&br;Connect()メソッドと同じ処理を非同期的に実行し、非同期操作を表すTaskを返します。|USER/PASS, STLS, APOP, AUTH, CAPA|
|ConnectAsync(string)&br;ConnectAsync(ICredentialsByHost)|[.NET 4.0]&br;Connect()メソッドと同じ処理を非同期的に実行し、非同期操作を表すTaskを返します。|USER/PASS, STLS, APOP, AUTH, CAPA|
~
|Logout()|ログアウト処理を行った後に接続を切断します。 削除マークが付けられているメッセージは削除されます。|QUIT|
|Logout()|ログアウトします。 削除マークが付けられているメッセージは削除されます。|QUIT|
~
|Disconnect()&br;IDisposable.Dispose()|ログアウト処理を行わずに接続を切断します。 削除マークが付けられているメッセージがあっても削除されません。|-|
|Disconnect()&br;IDisposable.Dispose()|ログアウトせずに切断します。 削除マークが付けられているメッセージがあっても削除されません。|-|
 
|KeepAlive()&br;KeepAliveAsync()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。|NOOP|
|KeepAlive()&br;KeepAliveAsync()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。|NOOP|
 

        

        
 
|*PopClientクラスのプロパティ
|*PopClientクラスのプロパティ
748,20 748,12
 
**メールボックスの状態の取得
**メールボックスの状態の取得
 
以下はメールボックスの状態を表すプロパティです。
以下はメールボックスの状態を表すプロパティです。
 

        

        
+
|*PopClientクラスのメソッド
+
|~メソッド|~解説|~対応するPOPコマンド|h
+
|{{
+
UpdateStatus()
+
UpdateStatusAsync()
+
}}|メールボックスの状態を取得してMessageCountおよびTotalSizeプロパティの値を最新の状態に更新します。|STAT|
+

          
 
|*PopClientクラスのプロパティ
|*PopClientクラスのプロパティ
 
|~プロパティ|~解説|h
|~プロパティ|~解説|h
 
|MessageCount|メールボックスに存在するメッセージの数を取得します。|
|MessageCount|メールボックスに存在するメッセージの数を取得します。|
 
|TotalSize|メールボックスに存在するメッセージの総サイズをバイト単位で取得します。|
|TotalSize|メールボックスに存在するメッセージの総サイズをバイト単位で取得します。|
 

        

        
~
:MessageCount, TotalSize|このプロパティは、値が未取得の場合、もしくはPopClient.CancelDelete()やPopMessageInfo.MarkAsDeleted()で状態が更新されている場合、STATコマンドを発行して最新の値を取得します。 また、切断されている状態で取得しようとした場合(PopClient.IsConnectedがfalseの場合)、例外をスローします。
:MessageCount, TotalSize|このプロパティは、値が未取得の場合、もしくはPopClient.CancelDelete()やPopMessageInfo.MarkAsDeleted()で状態が更新されている場合、STATコマンドを発行して最新の値を取得します。 切断されている状態で取得しようとした場合(PopClient.IsConnectedがfalseの場合)、例外をスローします。
+
UpdateStatus()メソッドを呼び出して最新の値を取得した直後はMessageCountおよびTotalSizeの値が最新となるため、プロパティを参照してもコマンドは発行されません。
 

        

        
 
**メッセージに対する操作
**メッセージに対する操作
 
以下はメッセージの操作に関するメソッドです。
以下はメッセージの操作に関するメソッドです。
772,10 764,7
 
MarkAsDeleted()
MarkAsDeleted()
 
MarkAsDeletedAsync()
MarkAsDeletedAsync()
 
}}|メッセージを削除マーク済みにします。 すでに削除マーク済み(IsMarkedAsDeletedがtrue)の場合は何もしません。|DELE|
}}|メッセージを削除マーク済みにします。 すでに削除マーク済み(IsMarkedAsDeletedがtrue)の場合は何もしません。|DELE|
~
|{{
|GetUniqueId()|メッセージのIDを取得します。 未取得の場合、コマンドを発行してから結果を返します。 取得できない場合は例外をスローします。|UIDL|
+
GetUniqueId()
+
GetUniqueIdAsync()
+
}}|メッセージのIDを取得します。 未取得の場合、コマンドを発行してから結果を返します。 取得できない場合は例外をスローします。|UIDL|
 
|TryGetUniqueId(out string)|メッセージのIDの取得を試みます。 未取得の場合、コマンドを発行してから結果を返します。 取得できない場合は戻り値falseを返し、outパラメータにはnullがセットされます。|UIDL|
|TryGetUniqueId(out string)|メッセージのIDの取得を試みます。 未取得の場合、コマンドを発行してから結果を返します。 取得できない場合は戻り値falseを返し、outパラメータにはnullがセットされます。|UIDL|
 

        

        
 
***GetUniqueId()、TryGetUniqueId()メソッドとUniqueIdプロパティの動作
***GetUniqueId()、TryGetUniqueId()メソッドとUniqueIdプロパティの動作
883,7 872,9
 
(現時点では非同期操作の実装は不完全です。 特に複数の操作を並列して進行させようとした場合の動作については今後のバージョンで変更する可能性があります。)
(現時点では非同期操作の実装は不完全です。 特に複数の操作を並列して進行させようとした場合の動作については今後のバージョンで変更する可能性があります。)
 

        

        
 
**非同期操作の制限 [#async_operations_restrictions]
**非同期操作の制限 [#async_operations_restrictions]
~
PopClientおよび関連クラスは''並列操作をサポートしません''。 常に''1クライアントにつき同時に1操作のみ''行えます。 この制限は非同期バージョンのメソッドを使った場合も同様です。 非同期バージョンのメソッドは''非同期操作のみをサポートします''。 同期操作・非同期操作に関わらず、何らかの操作が進行中の場合は同一のクライアントから別の操作を開始することはできません。 操作が進行中の場合、PopClient.IsBusyプロパティはtrueを返します。 この状態で別の操作を開始しようとした場合にはInvalidOperationExceptionがスローされます。
PopClientおよび関連クラスは''並列操作をサポートしません''。 常に''1クライアントにつき同時に1操作のみ''行えます。 この制限は非同期バージョンのメソッドを使った場合も同様です。 非同期バージョンのメソッドは''非同期操作のみをサポートします''。 同期操作・非同期操作に関わらず、何らかの操作が進行中の場合は同一のクライアントで別の操作を開始することはできません。 進行中に別の操作を開始しようとした場合にはInvalidOperationExceptionがスローされます。
-

          
-
(なおこの動作は現時点での動作で、今後のバージョンでは例外をスローする代わりにロックするなどの動作に変更する可能性もありますが、''1クライアントにつき同時に1操作のみ''の制限については変更する予定はありません)
 

        

        
 
例えば、次のような操作は正しく動作する保証はありません。
例えば、次のような操作は正しく動作する保証はありません。
 

        

        
951,7 942,7
 

        

        
 

        

        
 
**スレッドセーフティ
**スレッドセーフティ
~
PopClientクラスおよびPopMessageInfoクラスはスレッドセーフとなっているため、同時に複数のスレッドから参照することができます。 だだし、[[並列操作はサポートしていない>#async_operations_restrictions]]ため、同時に複数のスレッドから操作を行う場合、InvalidOperationExceptionがスローされる場合があります。
現時点では、PopClientクラスおよびPopMessageInfoクラスは完全なスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 非同期操作のメソッドを除いて、同一クライアントから取得した個々のインスタンスは同一スレッド内で使用することを推奨します。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
 

        

        
 
なお、アプリケーションドメインをまたがる使用については全く考慮していないため、動作および安全性の保証はできません。
なお、アプリケーションドメインをまたがる使用については全く考慮していないため、動作および安全性の保証はできません。
 

        

        
973,7 964,7
 
|Smdn.Net.Pop3|PopProtocolViolationException|プロトコル上不正な操作を行おうとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
|Smdn.Net.Pop3|PopProtocolViolationException|プロトコル上不正な操作を行おうとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
 
|Smdn.Net.Pop3.Client|PopMessageDeletedException|削除マーク済み(PopMessageInfo.IsMarkedAsDeletedがtrue)のメッセージに対して操作を行おうとした|PopClient.GetMessage()&br;PopMessageInfoの各メソッド・プロパティ|
|Smdn.Net.Pop3.Client|PopMessageDeletedException|削除マーク済み(PopMessageInfo.IsMarkedAsDeletedがtrue)のメッセージに対して操作を行おうとした|PopClient.GetMessage()&br;PopMessageInfoの各メソッド・プロパティ|
 
|Smdn.Net.Pop3.Client|PopMessageNotFoundException|指定された番号もしくはIDを持つメッセージが存在しない&br;空のメールボックスに対して番号を指定してメッセージを取得しようとした|PopClient.GetMessage()&br;PopClient.GetMessages()|
|Smdn.Net.Pop3.Client|PopMessageNotFoundException|指定された番号もしくはIDを持つメッセージが存在しない&br;空のメールボックスに対して番号を指定してメッセージを取得しようとした|PopClient.GetMessage()&br;PopClient.GetMessages()|
~
|System|InvalidOperationException|切断された状態(PopClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態(PopClient.IsBusyがtrue)で別の操作を開始しようとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_restrictions]]|
|System|InvalidOperationException|切断された状態(PopClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態で別の操作を開始しようとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_restrictions]]|
 
|System|TimeoutException|PopClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_cancellation]]|
|System|TimeoutException|PopClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_cancellation]]|
 
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
 

        

        

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

current previous
7,32 7,6
 
以下のバージョンはすべて[[MIT X11ライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
以下のバージョンはすべて[[MIT X11ライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
 

        

        
 
|~バージョン|>|~パッケージ|h
|~バージョン|>|~パッケージ|h
+
|~[[1.09 (2014-06-21)>#changes_v1.09]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.09-netfx3.5-combined.zip,.NET 3.5}
+
}}|
+
|~[[1.05 (2014-06-21)>#changes_v1.05]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.05-netfx3.5-combined.zip,.NET 3.5}
+
}}|
 
|~[[1.04 (2014-06-02)>#changes_v1.04]]|~ソースコード|{{
|~[[1.04 (2014-06-02)>#changes_v1.04]]|~ソースコード|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.04.tar.bz2}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.04.tar.bz2}
 
}}|
}}|
323,38 297,6
 
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
 

        

        
 
*変更履歴 [#changes]
*変更履歴 [#changes]
+
**1.09 (2014-06-21) [#changes_v1.09]
+
主に非同期操作用のメソッドを追加するための下準備。
+

          
+
-機能追加
+
--ImapClient
+
---ImapOpenedMailboxInfo.IsIdling, ImapClient.IsIdlingプロパティを追加、クライアントがImapOpenedMailboxInfo.Idle()メソッドなどを使ったIDLE処理中かどうかを判別できるようにした
+
---ImapClient.SynchronizingObjectを追加、ImapClientに設定されたイベントハンドラを呼び出す際に指定された同期オブジェクトを使うようにした
+
-修正・改善
+
--ImapClient
+
---ImapMessageInfo.OpenRead()/OpenText()で取得したStream/StreamReaderをClose()しない限り、以降の操作を開始しようとした時点でInvalidOperationExceptionとなるように動作を変更
+
---ImapOpenedMailboxInfo.Idle()で開始したIDLEをStopIdle()で停止した場合、Stop/StartIdle()を異なる組み合わせで呼び出した場合、Idle()を開始していない状態でStopIdle()を呼び出した場合にスローする例外の種類をImapProtocolViolationExceptionからInvalidOperationExceptionに変更
+
---ImapOpenedMailboxInfo.Idle()等で開始したIDLE操作がNOOPによるフォールバックとなる場合でもIsBusyがtrueとなるように動作を改善
+
---ImapClient.GetMailboxes(), ImapMailboxInfo.GetChildren()の戻り値について、遅延実行を行うIEnumerable<ImapMailboxInfo>を返す動作を変更し、読み取り専用のIList<ImapMailboxInfo>(.NET 4.5ではIReadOnlyList<ImapMailboxInfo>)を返すようにした
+
---ImapMessageInfoList.GetEnumerator()の戻り値について、遅延実行を行うIEnumerator<ImapMessageInfo>を返す動作を変更し、GetEnumerator()を呼び出した時点ですべての結果を生成し、その結果を読み取るIEnumerator<ImapMessageInfo>を返すようにした
+
---ImapClientの各イベントの発生タイミングを、レスポンス受信時ではなく操作終了時に変更
+
---ImapClientではイベントハンドラで発生した例外を無視するようにした
+

          
+
**1.05 (2014-06-21) [#changes_v1.05]
+
-機能追加
+
--ImapClient
+
---ImapMessageInfoListクラスにToList(), ToArray()を追加
+
---ImapOpenedMailboxInfoクラスにGetMessagesRecent(), GetMessagesUnseen(), GetMessagesNew()を追加
+
-修正・改善
+
--アセンブリの製品名(AssemblyProductAttribute)およびバージョン情報(AssemblyInformationalVersionAttribute)にバージョン番号と対象フレームワークを含むパッケージ名の情報を埋め込むようにした
+
--65536回目に送信するコマンドのタグが意図しない値となっていたのを修正
+
--ImapClient
+
---IDLE中にメッセージ削除・メールボックスステータス変更のレスポンスを受信した場合、レスポンスを二重に処理して内部状態と実際の状態が不一致となる不具合を修正
+
---ImapMessageInfo.OpenRead()などFETCHコマンドを発行するメソッドを呼び出した際において、動的属性が変更されていない場合でもMessageStatusChangedイベントが発生してしまう不具合を修正
+
---未取得のImapMessageInfoの動的属性が変更された場合にはMessageStatusChangedイベントを発生させないように動作を変更
+
---ImapOpenedMailboxInfo.Idle()などIDLEを行うメソッドについて、一定間隔毎にIDLEしなおすことによりサーバー側からの自動切断を抑止するようにした
+
---ImapMailboxInfo.GetMailboxes()をobsoleteにし、代わりにImapMailboxInfo.GetChildren()を追加
+

          
 
**1.04 (2014-06-02) [#changes_v1.04]
**1.04 (2014-06-02) [#changes_v1.04]
 
-機能追加
-機能追加
 
--ImapClient
--ImapClient

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

current previous
13,8 13,7
 
*ダウンロード
*ダウンロード
 
本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses/MIT_license]]でのリリースとなります。
 

        

        
~
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Imap4.Client-1.05.tar.bz2}
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Imap4.Client-1.04.tar.bz2}
+
${smdncms:distfilelink,Smdn.Net.Imap4.Client-1.09.tar.bz2}
 
:開発版|[[http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/]]よりチェックアウトできます
:開発版|[[http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/]]よりチェックアウトできます
 
:ビルド済みパッケージ・過去のバージョン|[[works/libs/Smdn.Net.Imap4.Client/releases]]をご覧ください
:ビルド済みパッケージ・過去のバージョン|[[works/libs/Smdn.Net.Imap4.Client/releases]]をご覧ください
 

        

        

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

current previous
2,7 2,7
 
${smdncms:keywords,}
${smdncms:keywords,}
 
${smdncms:document_versions,codelang=cs,codelang=vb}
${smdncms:document_versions,codelang=cs,codelang=vb}
 
${pragma,parser-options,non-limited-list}
${pragma,parser-options,non-limited-list}
~
[[works/libs/Smdn.Net.Imap4.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.09>works/libs/Smdn.Net.Imap4.Client/releases#changes_v1.09]]時点のものです。
[[works/libs/Smdn.Net.Imap4.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.03>works/libs/Smdn.Net.Imap4.Client/releases#changes_v1.03]]時点のものです。
 

        

        
 
認証・接続のサンプルコードは[[#connection_authentication_examples]]、IMAP操作を行う具体例は[[#operation_examples]]に記載しています。
認証・接続のサンプルコードは[[#connection_authentication_examples]]、IMAP操作を行う具体例は[[#operation_examples]]に記載しています。
 

        

        
42,7 42,7
 
クライアントの実装は次の2種類があります。
クライアントの実装は次の2種類があります。
 
|*クライアント実装の種類と概要
|*クライアント実装の種類と概要
 
|~名前空間|~クラス|~概要|h
|~名前空間|~クラス|~概要|h
~
|Smdn.Net.Imap4.Client|ImapClient&br;ImapMailboxInfo&br;ImapMessageInfoなど|IMAPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfo, DirectoryInfoクラスに似たインターフェイスで行えるようにしてあります。 このドキュメントではこれらのクラスについて解説しています。|
|Smdn.Net.Imap4.Client|ImapClient&br;ImapMailboxInfo&br;ImapMessageInfoなど|IMAPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfo, DirectoryInfoクラスに似たインターフェイスで行えるようにしてあります。|
 
|Smdn.Net.Imap4.Client.Session|ImapSession|IMAPコマンドと1対1に対応するメソッドを持つクラスです。 IMAPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|
|Smdn.Net.Imap4.Client.Session|ImapSession|IMAPコマンドと1対1に対応するメソッドを持つクラスです。 IMAPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|
 

        

        
 
#hr
#hr
299,8 299,8
 
|~|BeginConnect(string)&br;BeginConnect(string, AsyncCallback, object)&br;BeginConnect(ICredentialsByHost)&br;BeginConnect(ICredentialsByHost, AsyncCallback, object)|Connect()メソッドと同じ処理を非同期的に実行します。 オプションでコールバックメソッドを指定できます。|LOGIN, AUTHENTICATE, STARTTLS, CAPABILITY&br;(サポートしている場合はID, NAMESPACEも)|
|~|BeginConnect(string)&br;BeginConnect(string, AsyncCallback, object)&br;BeginConnect(ICredentialsByHost)&br;BeginConnect(ICredentialsByHost, AsyncCallback, object)|Connect()メソッドと同じ処理を非同期的に実行します。 オプションでコールバックメソッドを指定できます。|LOGIN, AUTHENTICATE, STARTTLS, CAPABILITY&br;(サポートしている場合はID, NAMESPACEも)|
 
|~|EndConnect(IAsyncResult)|BeginConnect()で開始した非同期接続を完了します。 BeginConnect()を呼び出した場合、EndConnect()で操作を完了する必要があります。|-|
|~|EndConnect(IAsyncResult)|BeginConnect()で開始した非同期接続を完了します。 BeginConnect()を呼び出した場合、EndConnect()で操作を完了する必要があります。|-|
 
|~|ConnectAsync(string)&br;ConnectAsync(ICredentialsByHost)|[.NET 4.0]&br;Connect()メソッドと同じ処理を非同期的に実行し、非同期操作を表すTaskを返します。|LOGIN, AUTHENTICATE, STARTTLS, CAPABILITY&br;(サポートしている場合はID, NAMESPACEも)|
|~|ConnectAsync(string)&br;ConnectAsync(ICredentialsByHost)|[.NET 4.0]&br;Connect()メソッドと同じ処理を非同期的に実行し、非同期操作を表すTaskを返します。|LOGIN, AUTHENTICATE, STARTTLS, CAPABILITY&br;(サポートしている場合はID, NAMESPACEも)|
~
|~|Logout()|ログアウト処理を行った後に接続を切断します。 選択済みメールボックスの削除フラグが設定されているメッセージは削除されます。|CLOSE, LOGOUT|
|~|Logout()|ログアウトします。 選択済みメールボックスの削除フラグが設定されているメッセージは削除されます。|CLOSE, LOGOUT|
~
|~|Disconnect()&br;IDisposable.Dispose()|ログアウト処理を行わずに接続を切断します。 削除フラグが設定されているメッセージがあっても削除されません。|-|
|~|Disconnect()&br;IDisposable.Dispose()|ログアウトせずに切断します。 削除フラグが設定されているメッセージがあっても削除されません。|-|
 
|~|Refresh()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。 メールボックスを選択している場合は、メールボックスの状態も更新します。 サーバからメールボックスの状態に関する通知があった場合はイベントを発生させます。|NOOP|
|~|Refresh()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。 メールボックスを選択している場合は、メールボックスの状態も更新します。 サーバからメールボックスの状態に関する通知があった場合はイベントを発生させます。|NOOP|
 

        

        
 
|*接続・切断に関するプロパティ
|*接続・切断に関するプロパティ
310,8 310,7
 
|~|SendTimeout|ソケット送信時(コマンド送信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
|~|SendTimeout|ソケット送信時(コマンド送信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
 
|~|ReceiveTimeout|ソケット受信時(レスポンス受信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
|~|ReceiveTimeout|ソケット受信時(レスポンス受信)のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
 
|~|IsConnected|接続中かどうかを表す値を取得します。|
|~|IsConnected|接続中かどうかを表す値を取得します。|
~
|~|IsBusy|操作が進行中かどうかを表す値を取得します。 trueの場合、同一クライアントから他の操作を開始することはできません。|
|~|IsBusy|BeginConnect()/ConnectAsync()による非同期接続が進行中かどうか、もしくはIDLE中であるかどうかを表す値を取得します。|
+
|~|IsIdle|IDLE中であるかどうかを表す値を取得します。 trueの場合、同一クライアントからIDLEの停止以外の操作を開始することはできません。|
 

        

        
 
:IDisposable.Dispose()|ImapClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
:IDisposable.Dispose()|ImapClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
 
:Logout(), Disconnect(), IDisposable.Dispose()|これらのメソッドのいずれかを呼び出した後でも、再度ImapClient.Connect()を呼び出すことで同じインスタンスを使って再度接続することはできます。
:Logout(), Disconnect(), IDisposable.Dispose()|これらのメソッドのいずれかを呼び出した後でも、再度ImapClient.Connect()を呼び出すことで同じインスタンスを使って再度接続することはできます。
769,7 768,7
 

        

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

        

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

        

        
 
#tabpage(codelang=cs,container-title=下位の階層のメールボックスを操作する例)
#tabpage(codelang=cs,container-title=下位の階層のメールボックスを操作する例)
 
#code{{
#code{{
784,7 783,7
 
  ImapMailboxInfo test = inbox.GetChild("test");
  ImapMailboxInfo test = inbox.GetChild("test");
 

        

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

        

        
~
したがって、メールボックス内のメッセージを取得・検索した結果を''ImapMessageInfoのコレクション''として保持しておきたい場合は、[[ToList(), ToArray()などのメソッド>#operation_reference_message_get]]を使ってImapMessageInfoListからList<ImapMessageInfo>などに変換する必要があります。
したがって、メールボックス内のメッセージを取得・検索した結果を''ImapMessageInfoのコレクション''として保持しておきたい場合、ImapMessageInfoListからList<ImapMessageInfo>などに変換する必要があります。
 

        

        
 
#tabpage(codelang=cs,container-title=ImapMessageInfoListからList<ImapMessageInfo>への変換)
#tabpage(codelang=cs,container-title=ImapMessageInfoListからList<ImapMessageInfo>への変換)
 
#code{{
#code{{
1249,7 1248,7
 

        

        
 
    // ImapMessageInfoListからList<ImapMessageInfo>を作成する
    // ImapMessageInfoListからList<ImapMessageInfo>を作成する
 
    // (この時点でコマンドが発行される)
    // (この時点でコマンドが発行される)
~
    List<ImapMessageInfo> messageList = messages.ToList();
    List<ImapMessageInfo> messageList = new List<ImapMessageInfo>(messages);
 

        

        
 
    // List<T>のメンバを使って操作することができる
    // List<T>のメンバを使って操作することができる
 
    Console.WriteLine(messageList.Count);
    Console.WriteLine(messageList.Count);
1275,7 1274,7
 
}
}
 
}}
}}
 

        

        
~
上記のコードでは、''コピーされるメッセージの数に関わらず一度だけ''コマンド発行が行われます。 一方、以下のコードは上記のコードと結果は同じですが、''コピーされるメッセージの数だけ''コマンド発行が行われる点で動作が異なります。
以下のコードは上記のコードと結果は同じですが、メッセージの数だけコマンド発行が行われる点で動作が異なります。
 

        

        
 
#code{{
#code{{
 
using (ImapClient client = new ImapClient()) {
using (ImapClient client = new ImapClient()) {
1294,7 1293,7
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
~
ImapMessageInfoListクラスは、検索などの''クエリは保持しますが、結果はキャッシュしません''。 列挙を行う度に同じクエリでコマンドの再発行を行います。 そのため、同じImapMessageInfoListを何度も列挙する場合、''一度目に列挙した際と同じ結果が得られるとは限りません''。
ImapMessageInfoListクラスは、検索などの''クエリは保持しますが、結果はキャッシュしません''。 列挙を行う度に同じクエリでコマンドの再発行を行います。 そのため、同じImapMessageInfoListを何度も列挙する場合、一度目に列挙した際と同じ結果が得られるとは限りません。 したがって、結果を保持しておきたい場合は、他の処理を行う前にImapMessageInfoListからList<ImapMessageInfo>などに変換する必要があります。
 

        

        
 
#tabpage(codelang=cs,container-title=ImapMessageInfoListの再列挙とその動作)
#tabpage(codelang=cs,container-title=ImapMessageInfoListの再列挙とその動作)
 
#code{{
#code{{
1322,9 1321,6
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
+
したがって、結果を保持しておきたい場合は、他の処理を行う前にImapMessageInfoListからList<ImapMessageInfo>などに変換する必要があります。
+

          
+

          
 

        

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

        

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

          
+
これらのステータス変更は[[ImapClientクラスのExistMessageCountChangedイベントなど>#operation_reference_misc_events]]によって検知することができます。 また、定期的に[[ImapMailboxInfo.Refreshメソッド>#operation_reference_mailbox_control]]を呼び出してメールボックスのステータスを更新することでも他のクライアントによる変更を検知できます。
+

          
+
#tabpage(codelang=cs,container-title=メールボックスのステータス変更イベントをハンドリングする例)
+
#code{{
+
using (ImapClient client = new ImapClient()) {
+
  // イベントハンドラを設定
+
  client.ExistMessageCountChanged += delegate(object sender, ImapMailboxSizeChangedEventArgs e) {
+
    Console.WriteLine("'{0}' 現在のメール総数: {1}", e.Mailbox.FullName, e.CurrentCount);
+
  };
+

          
+
  using (var inbox = client.OpenInbox()) {
+
    for (;;) {
+
      // 1分おきにメールボックスの状態を更新する
+
      inbox.Refresh();
+

          
+
      Thread.Sleep(TimeSpan.FromMinutes(1.0));
+
    }
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
非同期メソッドを使って操作を開始した場合や、別スレッドで開始した操作の結果としてイベントが発生した場合は、そのスレッドからイベントハンドラが呼び出されるため、以下のような例ではInvokeRequiredがtrueとなります。
+

          
+
#tabpage(codelang=cs,container-title=非同期処理とイベントハンドラ)
+
#code{{
+
public class Form1 : Form {
+
  ImapClient client;
+
  Label label1;
+

          
+
  public Form1()
+
  {
+
    client.ExistMessageCountChanged += delegate(object sender, ImapMailboxSizeChangedEventArgs e) {
+
      if (InvokeRequired) {
+
        // Invokeする必要がある場合
+
        Invoke(new Action(delegate {
+
          label1.Text = string.Format("'{0}' 現在のメール総数: {1}", e.Mailbox.FullName, e.CurrentCount);
+
        }));
+
      }
+
      else {
+
        // Invokeする必要がない場合
+
        label1.Text = string.Format("'{0}' 現在のメール総数: {1}", e.Mailbox.FullName, e.CurrentCount);
+
      }
+
    };
+
  }
+

          
+
    :
+
    :
+
}
+
}}
+
#tabpage-end
+

          
+
イベントハンドラをUIスレッドで実行させたい場合は、ImapClient.SynchronizingObjectプロパティに同期オブジェクトとなるインスタンスを設定してください。 このようにすることでイベントハンドラでのInvokeが不要となります。
+

          
+
#tabpage(codelang=cs,container-title=同期オブジェクトを指定する例)
+
#code{{
+
public class Form1 : Form {
+
  ImapClient client;
+
  Label label1;
+

          
+
  public Form1()
+
  {
+
    client.SynchronizingObject = this; // 同期オブジェクトとしてFormのインスタンスを指定する
+

          
+
    client.ExistMessageCountChanged += delegate(object sender, ImapMailboxSizeChangedEventArgs e) {
+
      // Invokeは不要
+
      label1.Text = string.Format("'{0}' 現在のメール総数: {1}", e.Mailbox.FullName, e.CurrentCount);
+
    };
+
  }
+

          
+
    :
+
    :
+
}
+
}}
+
#tabpage-end
+

          
 

        

        
 
****ステータス変更の待機 (IDLE) [#operation_examples_misc_idle]
****ステータス変更の待機 (IDLE) [#operation_examples_misc_idle]
 
IMAP拡張コマンドであるIDLEコマンド(&urn2url(urn:ietf:rfc:2177);)をサポートしているサーバーでは、このコマンドを使うことによりメールボックスのステータス変更などを''プッシュ通知''させることができます。 ステータス変更の待機には[[ImapOpenedMailboxInfo.Idleなどのメソッド>#operation_reference_selectedmailbox_idle]]を使うことが出来ます。 IDLE中に発生したメールボックスのステータス変更は[[ImapClientクラスのExistMessageCountChangedイベントなど>#operation_reference_misc_events]]によって検知することができます。
IMAP拡張コマンドであるIDLEコマンド(&urn2url(urn:ietf:rfc:2177);)をサポートしているサーバーでは、このコマンドを使うことによりメールボックスのステータス変更などを''プッシュ通知''させることができます。 ステータス変更の待機には[[ImapOpenedMailboxInfo.Idleなどのメソッド>#operation_reference_selectedmailbox_idle]]を使うことが出来ます。 IDLE中に発生したメールボックスのステータス変更は[[ImapClientクラスのExistMessageCountChangedイベントなど>#operation_reference_misc_events]]によって検知することができます。
2115,7 2034,7
 
|~|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|すべてのメールボックスを取得します。|LIST/LSUB|
|~|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|すべてのメールボックスを取得します。|LIST/LSUB|
 
|~|GetOrCreateMailbox(string)&br;GetOrCreateMailbox(string, ImapMailboxListOptions)&br;GetOrCreateMailbox(string, bool)&br;GetOrCreateMailbox(string, bool, ImapMailboxListOptions)|指定した名前のメールボックスを取得します。 存在しない場合は作成します。 オプションで、メールボックスを作成した場合に購読するかどうか指定できます。|LIST/LSUB, CREATE, SUBSCRIBE|
|~|GetOrCreateMailbox(string)&br;GetOrCreateMailbox(string, ImapMailboxListOptions)&br;GetOrCreateMailbox(string, bool)&br;GetOrCreateMailbox(string, bool, ImapMailboxListOptions)|指定した名前のメールボックスを取得します。 存在しない場合は作成します。 オプションで、メールボックスを作成した場合に購読するかどうか指定できます。|LIST/LSUB, CREATE, SUBSCRIBE|
 
|~|CreateMailbox(string)&br;CreateMailbox(string, bool)|指定した名前のメールボックスを作成します。|CREATE, SUBSCRIBE|
|~|CreateMailbox(string)&br;CreateMailbox(string, bool)|指定した名前のメールボックスを作成します。|CREATE, SUBSCRIBE|
~
|~ImapMailboxInfo|GetChildren()&br;GetChildren(ImapMailboxListOptions)|現在のメールボックスの下位にあるすべてのメールボックスを取得します。|LIST/LSUB|
|~ImapMailboxInfo|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|現在のメールボックスの下位にあるすべてのメールボックスを取得します。|LIST/LSUB|
 
|~|GetChild(string)&br;GetChild(string, ImapMailboxListOptions)|現在のメールボックスの下位にある指定した名前のメールボックスを取得します。|LIST/LSUB|
|~|GetChild(string)&br;GetChild(string, ImapMailboxListOptions)|現在のメールボックスの下位にある指定した名前のメールボックスを取得します。|LIST/LSUB|
 
|~|GetParent()&br;GetParent(ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。|LIST/LSUB|
|~|GetParent()&br;GetParent(ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。|LIST/LSUB|
 
|~|GetOrCreateParent()&br;GetOrCreateParent(ImapMailboxListOptions)&br;GetOrCreateParent(bool)&br;GetOrCreateParent(bool, ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。 存在しない場合は作成します。|LIST/LSUB, CREATE, SUBSCRIBE|
|~|GetOrCreateParent()&br;GetOrCreateParent(ImapMailboxListOptions)&br;GetOrCreateParent(bool)&br;GetOrCreateParent(bool, ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。 存在しない場合は作成します。|LIST/LSUB, CREATE, SUBSCRIBE|
2123,7 2042,8
 
|~|CreateChild(string)&br;CreateChild(string, bool)|現在のメールボックスの下位に指定した名前でメールボックスを作成します。|CREATE, SUBSCRIBE|
|~|CreateChild(string)&br;CreateChild(string, bool)|現在のメールボックスの下位に指定した名前でメールボックスを作成します。|CREATE, SUBSCRIBE|
 
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
 

        

        
~
:すべてのメソッド|これらのメソッドは、メールボックスを表すImapMailboxInfoクラスのインスタンス、もしくは読み取り専用のIList<ImapMailboxInfo>(.NET 4.5ではIReadOnlyList<ImapMailboxInfo>)を返します。
:すべてのメソッド|これらのメソッドは、メールボックスを表すImapMailboxInfoクラスのインスタンス、もしくはIEnumerable<ImapMailboxInfo>を返します。
-
:ImapClient.GetMailboxes(), ImapMailboxInfo.GetMailboxes()|これらのメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
 
:ImapMailboxInfo.GetParent(), GetOrCreateParent()|最上位のメールボックスに対して呼び出した場合、例外ImapProtocolViolationExceptionをスローします。
:ImapMailboxInfo.GetParent(), GetOrCreateParent()|最上位のメールボックスに対して呼び出した場合、例外ImapProtocolViolationExceptionをスローします。
 
:ImapMailboxInfo.GetChild(), GetOrCreateChild(), CreateChild()|下位に階層を作成できないメールボックス(CanHaveChildプロパティがfalse)の場合、ImapProtocolViolationExceptionをスローします。
:ImapMailboxInfo.GetChild(), GetOrCreateChild(), CreateChild()|下位に階層を作成できないメールボックス(CanHaveChildプロパティがfalse)の場合、ImapProtocolViolationExceptionをスローします。
 
:メールボックスの取得オプション(ImapMailboxListOptions)|これらのメソッドには、ImapMailboxListOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMailboxListOptionsを指定することで、メールボックスの取得時の動作を変更することができます。 以下の値を組み合わせて指定できます。
:メールボックスの取得オプション(ImapMailboxListOptions)|これらのメソッドには、ImapMailboxListOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMailboxListOptionsを指定することで、メールボックスの取得時の動作を変更することができます。 以下の値を組み合わせて指定できます。
2303,12 2223,7
 
|~クラス|~プロパティ|~解説|f
|~クラス|~プロパティ|~解説|f
 

        

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

          
+
|*選択済みメールボックスでのメッセージの待機に関するプロパティ
+
|~クラス|~プロパティ|~解説|h
+
|~ImapOpenedMailboxInfo|IsIdle|現在このメールボックスでメッセージの待機中(IDLE操作の進行中)かどうかを表す値を返します。|
+
|~ImapClient|IsIdle|現在このクライアントでメッセージの待機中(IDLE操作が進行中)かどうかを表す値を返します。 ImapClient.OpenedMailbox.IsIdleと同じ値を返します。|
 

        

        
 
|*選択済みメールボックスでのメッセージの待機に関するメソッド
|*選択済みメールボックスでのメッセージの待機に関するメソッド
 
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|h
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|h
2364,15 2279,14
 
StopWaitForMessageArrival()
StopWaitForMessageArrival()
 
}}|StartWaitForMessageArrivalで開始したアイドル状態から復帰します。 待機中に新着メッセージを受信していた場合は、戻り値のImapMessageInfoListに新着メッセージが含まれます。|-|
}}|StartWaitForMessageArrivalで開始したアイドル状態から復帰します。 待機中に新着メッセージを受信していた場合は、戻り値のImapMessageInfoListに新着メッセージが含まれます。|-|
 

        

        
~
:NOOPの送信間隔 (pollingInterval)|サーバがIDLEをサポートしていない場合、IDLEでの待機の代わりに、引数&var{pollingInterval};で指定された間隔でNOOPを送信します。 指定しなかった場合はデフォルトの動作として10分おきにNOOPを送信します。 &var{pollingInterval};には30分以上の値を指定することはできません。 IDLEをサポートしている場合は、引数&var{pollingInterval};の指定は動作に影響しません。
:NOOPの送信間隔 (pollingInterval)|サーバがIDLEをサポートしていない場合、IDLEでの待機の代わりに、引数pollingIntervalで指定された間隔でNOOPを送信します。 指定しなかった場合はデフォルトの動作として10分おきにNOOPを送信します。 IDLEをサポートしている場合は、引数pollingIntervalの指定は動作に影響しません。
 
:メッセージ属性の取得オプション(ImapMessageFetchAttributeOptions)|ImapMessageFetchAttributeOptionsについては、[[ImapOpenedMailboxInfo.GetMessages()等のメソッドの解説>#operation_reference_message_get]]を参照してください。
:メッセージ属性の取得オプション(ImapMessageFetchAttributeOptions)|ImapMessageFetchAttributeOptionsについては、[[ImapOpenedMailboxInfo.GetMessages()等のメソッドの解説>#operation_reference_message_get]]を参照してください。
+
:サーバー側からの自動ログアウト|IMAPサーバーでは、一定時間操作がないと自動的にログアウトが行われます。 サーバがIDLEをサポートしている場合は、一定間隔毎にIDLEしなおすことでサーバー側からの自動切断を抑止します。 そのため、IDLE中はRefresh()メソッドなどを使った自動ログアウトタイマの更新操作を行う不要はありません。 IDLEをサポートしていない場合でも、NOOPコマンドによるポーリングを行うため、同様にログアウトタイマの更新操作は不要です。
 
:待機中の操作とイベント|IDLEを開始してから終了するまでの間は、他のコマンドを実行することはできません。 待機中に他の操作を行おうとした場合、例外をスローします。
:待機中の操作とイベント|IDLEを開始してから終了するまでの間は、他のコマンドを実行することはできません。 待機中に他の操作を行おうとした場合、例外をスローします。
 
また、待機中は受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
また、待機中は受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
 
そのため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
そのため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
 
[[#async_operations_restrictions]]も合わせて参照してください。
[[#async_operations_restrictions]]も合わせて参照してください。
 
:IDLE中のReceiveTimeout|サーバからのレスポンスを待機する都合上、IDLE中はReceiveTimeoutの値が``Timeout.Inifinite``(-1)に設定されます。 例えばStartIdle()メソッドでIDLEを開始した直後にReceiveTimeoutは``Timeout.Inifinite``に設定され、EndIdle()メソッドでIDLEを終了する際にReceiveTimeoutはIDLE前の値に戻ります。 なお、IDLE中にReceiveTimeoutの値を変更することはできず、変更しようとした場合には例外がスローされます。
:IDLE中のReceiveTimeout|サーバからのレスポンスを待機する都合上、IDLE中はReceiveTimeoutの値が``Timeout.Inifinite``(-1)に設定されます。 例えばStartIdle()メソッドでIDLEを開始した直後にReceiveTimeoutは``Timeout.Inifinite``に設定され、EndIdle()メソッドでIDLEを終了する際にReceiveTimeoutはIDLE前の値に戻ります。 なお、IDLE中にReceiveTimeoutの値を変更することはできず、変更しようとした場合には例外がスローされます。
~
:ImapClient.IsBusy, ImapClient.IsIdle, ImapOpenedMailboxInfo.IsIdle|IDLE中、各プロパティはtrueを返します。 サーバがIDLEをサポートしていない場合、NOOPでの待機を行う場合でもIsBusy, IsIdleプロパティはtrueとなります。
:ImapClient.IsBusy|IDLE中はImapClient.IsBusyプロパティはtrueを返します。 サーバがIDLEをサポートしていない場合、NOOPでの待機を行う場合にはIsBusyプロパティはfalseとなります。
 

        

        
 
***メールボックス内のメッセージに対する操作 [#operation_reference_message]
***メールボックス内のメッセージに対する操作 [#operation_reference_message]
 
****メッセージの取得と検索 [#operation_reference_message_get]
****メッセージの取得と検索 [#operation_reference_message_get]
2384,18 2298,13
 
|~|GetMessages(long, params long[])&br;GetMessages(ImapMessageFetchAttributeOptions, long, params long[])|メールボックスにあるメッセージのうち、指定したUIDを持つ1つ以上のメッセージを取得します。|FETCH|
|~|GetMessages(long, params long[])&br;GetMessages(ImapMessageFetchAttributeOptions, long, params long[])|メールボックスにあるメッセージのうち、指定したUIDを持つ1つ以上のメッセージを取得します。|FETCH|
 
|~|GetMessageByUid(long)&br;GetMessageByUid(long, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定したUIDを持つ1つのメッセージを取得します。|FETCH|
|~|GetMessageByUid(long)&br;GetMessageByUid(long, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定したUIDを持つ1つのメッセージを取得します。|FETCH|
 
|~|GetMessageBySequence(long)&br;GetMessageBySequence(long, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した通番を持つ1つのメッセージを取得します。|FETCH|
|~|GetMessageBySequence(long)&br;GetMessageBySequence(long, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した通番を持つ1つのメッセージを取得します。|FETCH|
+
|~|GetMessagesRecent()&br;GetMessagesRecent(ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、新着メッセージ(``\Recent``フラグが設定されているメッセージ)を取得します。|SEARCH|
+
|~|GetMessagesUnseen()&br;GetMessagesUnseen(ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、未読メッセージ(``\Seen``フラグが設定されていないメッセージ)を取得します。|SEARCH|
+
|~|GetMessagesNew()&br;GetMessagesNew(ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、''新しい''メッセージ(新着あるいは未読のメッセージ)を取得します。|SEARCH|
 
|~|GetMessages(ImapSearchCriteria)&br;GetMessages(ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetMessages(ImapSearchCriteria, Encoding)&br;GetMessages(ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを取得します。 オプションでエンコーディングを指定できます。|SEARCH|
|~|GetMessages(ImapSearchCriteria)&br;GetMessages(ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetMessages(ImapSearchCriteria, Encoding)&br;GetMessages(ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを取得します。 オプションでエンコーディングを指定できます。|SEARCH|
 
|~|GetMessagesGmailSearch(string)&br;GetMessagesGmailSearch(string, ImapMessageFetchAttributeOptions)|[[Gmail search syntax (Gmail詳細検索演算子):https://support.google.com/mail/answer/7190]]にマッチしたメッセージを取得します。 Gmailサーバー以外の場合(X-GM-RAWをサポートしていない場合)は、ImapIncapableExceptionをスローします。|SEARCH X-GM-RAW|
|~|GetMessagesGmailSearch(string)&br;GetMessagesGmailSearch(string, ImapMessageFetchAttributeOptions)|[[Gmail search syntax (Gmail詳細検索演算子):https://support.google.com/mail/answer/7190]]にマッチしたメッセージを取得します。 Gmailサーバー以外の場合(X-GM-RAWをサポートしていない場合)は、ImapIncapableExceptionをスローします。|SEARCH X-GM-RAW|
 
|~|GetSortedMessages(ImapSortCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージを指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|SORT|
|~|GetSortedMessages(ImapSortCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージを指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|SORT|
 
|~|GetSortedMessages(ImapSortCriteria, ImapSearchCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージのみを指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|SORT|
|~|GetSortedMessages(ImapSortCriteria, ImapSearchCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージのみを指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|SORT|
 
|~|GetThreadedMessages(ImapThreadingAlgorithm)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージを指定したアルゴリズムでスレッド化した状態で取得します。&br;サーバがTHREADコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|THREAD|
|~|GetThreadedMessages(ImapThreadingAlgorithm)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージを指定したアルゴリズムでスレッド化した状態で取得します。&br;サーバがTHREADコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|THREAD|
 
|~|GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria, Encoding)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージのみを指定したアルゴリズムでスレッド化した状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがTHREADコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|THREAD|
|~|GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria, Encoding)&br;GetThreadedMessages(ImapThreadingAlgorithm, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージのみを指定したアルゴリズムでスレッド化した状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがTHREADコマンドをサポートしていない場合は、ImapIncapableExceptionをスローします。|THREAD|
~
|~ImapMessageInfoList|GetEnumerator()|ImapMessageInfoListインスタンスが表すクエリに該当するImapMessageInfoを取得し、列挙します。|FETCH|
|~ImapMessageInfoList|GetEnumerator()|ImapMessageInfoListインスタンスに対して列挙操作を行うことにより、ImapMessageInfoインスタンスを取得できます。|FETCH|
+
|~|ToList()|ImapMessageInfoListインスタンスが表すクエリに該当するImapMessageInfoを取得し、List<ImapMessageInfo>として返します。|~|
+
|~|ToArray()|ImapMessageInfoListインスタンスが表すクエリに該当するImapMessageInfoを取得し、ImapMessageInfoの配列として返します。|~|
 
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
 

        

        
 
//-これらのメソッドは、接続してから切断するまでの間、同じ通番のメッセージに対しては常に同じPopMessageInfoインスタンスを返します。
//-これらのメソッドは、接続してから切断するまでの間、同じ通番のメッセージに対しては常に同じPopMessageInfoインスタンスを返します。
2410,8 2319,8
 
::DynamicAttributes|メッセージに設定される動的な属性のみを取得します。
::DynamicAttributes|メッセージに設定される動的な属性のみを取得します。
 
::AllAttributes|メッセージに設定されるすべての属性を取得します。 StaticAttributesとDynamicAttributesの組み合わせと同値です。
::AllAttributes|メッセージに設定されるすべての属性を取得します。 StaticAttributesとDynamicAttributesの組み合わせと同値です。
 
::Default, None|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
::Default, None|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
~
:ImapOpenedMailboxInfo.Get(Sorted)Messages(...)|これらのメソッドは戻り値としてImapMessageInfoListを返します。 メソッドの呼び出し時点ではコマンドの送受信は行われず、戻り値のImapMessageInfoListに対して列挙操作を開始する時点で初めてコマンドの送受信が行われます。
:ImapOpenedMailboxInfo.Get(Sorted)Messages(...)|これらのメソッドは戻り値としてImapMessageInfoListを返します。 このクラスはList<ImapMessageInfo>のようなコレクションクラスではなく、列挙することで初めてImapMessageInfoを取得することができます。 このクラスから取得したImapMessageInfoを保持したい場合は、List<ImapMessageInfo>などに格納しなおしてください。
~
:ImapMessageInfoList|このクラスはList<ImapMessageInfo>のようなコレクションクラスではなく、検索クエリを内包して結果を遅延取得するクラスです。 列挙操作を行うことで検索クエリに一致するメッセージの検索、ImapMessageInfoの生成が行われます。 このクラスから取得したImapMessageInfoを保持したい場合は、List<ImapMessageInfo>などに格納しなおすか、ToArray()、ToList()などのメソッドを使って生成した結果を使用してください。
:ImapMessageInfoList.GetEnumerator()|このメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
 
:エンコーディング|サーバーが指定されたエンコーディングをサポートしていないことを示すレスポンス(``[BADCHARSET]``)を返した場合は、例外Smdn.Formats.EncodingNotSupportedExceptionをスローします。
:エンコーディング|サーバーが指定されたエンコーディングをサポートしていないことを示すレスポンス(``[BADCHARSET]``)を返した場合は、例外Smdn.Formats.EncodingNotSupportedExceptionをスローします。
 

        

        
 
*****メッセージの検索クエリ(ImapSearchCriteria) [#operation_reference_message_get_searchcriteria]
*****メッセージの検索クエリ(ImapSearchCriteria) [#operation_reference_message_get_searchcriteria]
2591,8 2500,6
 
:すべてのメソッド|これらすべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、Download()メソッドでメモリ上にダウンロードしたStreamを取得するか、Save()メソッドでファイルに保存するなどしてください。
:すべてのメソッド|これらすべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、Download()メソッドでメモリ上にダウンロードしたStreamを取得するか、Save()メソッドでファイルに保存するなどしてください。
 
:OpenRead()/OpenText()とDownload()|OpenRead()/OpenText()メソッドはメッセージ本文を適宜ダウンロードしながら読み込むためのStream/StreamReaderを返します。 メソッド呼び出しが完了した時点ではメッセージ本文の先頭一部のみがダウンロードされていて、Readメソッドなどで読み込むことにより続きの部分が適宜ダウンロードされます。 OpenRead()/OpenText()が返すStream/StreamReaderはシーク操作および書き込み操作をサポートしません。
:OpenRead()/OpenText()とDownload()|OpenRead()/OpenText()メソッドはメッセージ本文を適宜ダウンロードしながら読み込むためのStream/StreamReaderを返します。 メソッド呼び出しが完了した時点ではメッセージ本文の先頭一部のみがダウンロードされていて、Readメソッドなどで読み込むことにより続きの部分が適宜ダウンロードされます。 OpenRead()/OpenText()が返すStream/StreamReaderはシーク操作および書き込み操作をサポートしません。
 
一方Download()メソッドはメッセージ全文をメモリ上にダウンロードしたStreamを返します。 メソッド呼び出しが完了した時点でメッセージ全文がダウンロードされています。 Download()メソッドが返すStreamはシーク操作および書き込み操作をサポートします。
一方Download()メソッドはメッセージ全文をメモリ上にダウンロードしたStreamを返します。 メソッド呼び出しが完了した時点でメッセージ全文がダウンロードされています。 Download()メソッドが返すStreamはシーク操作および書き込み操作をサポートします。
+
:OpenRead()/OpenText()が返すStream/StreamReaderのクローズ|OpenRead()/OpenText()メソッドによって取得したStream/StreamReaderに対してClose()メソッドを呼び出さない限り、ImapClient.IsBusyはtrueのままとなり、他の操作を開始しようとしてもInvalidOperationExceptionをスローします。 OpenRead()/OpenText()メソッドを使用する場合は、次の操作を開始するまでに取得したStream/StreamReaderのClose()メソッドを呼び出すようにしてください。 また、読み込み処理を行いながら他の操作を行いたい場合は、Download()メソッドで取得したStreamを使用するなどしてください。
+
:ReadLines()が返すIEnumerable<string>|ReadLines()は遅延実行するIEnumerable<string>を返します。 列挙操作が完了するまではImapClient.IsBusyはtrueのままとなり、他の操作を開始しようとしてもInvalidOperationExceptionをスローします。 列挙中に他の操作を行いたい場合は、遅延実行を行わないReadAllLines()メソッドを使用してください。
 
:非同期バージョンのメソッド|OpenReadAsync()など名前がAsyncで終わるメソッドは非同期バージョンのメソッドです。 基本的な動作は同期バージョンと同じです。 非同期バージョンのメソッドを使う際の注意点は[[#async_operations]]を参照してください。
:非同期バージョンのメソッド|OpenReadAsync()など名前がAsyncで終わるメソッドは非同期バージョンのメソッドです。 基本的な動作は同期バージョンと同じです。 非同期バージョンのメソッドを使う際の注意点は[[#async_operations]]を参照してください。
 
:セクションの指定|これらすべてのメソッドは、引数でセクション番号あるいはセクションを表すBODYSTRUCTUREのIImapBodyStructureを指定することができるオーバーロードが用意されています。 これらのオーバーロードでは、メッセージ本文全体ではなく指定したセクション部分だけを取得します。 詳細については[[#operation_reference_message_section_bodystructure]]で解説します。
:セクションの指定|これらすべてのメソッドは、引数でセクション番号あるいはセクションを表すBODYSTRUCTUREのIImapBodyStructureを指定することができるオーバーロードが用意されています。 これらのオーバーロードでは、メッセージ本文全体ではなく指定したセクション部分だけを取得します。 詳細については[[#operation_reference_message_section_bodystructure]]で解説します。
 
:メッセージ本文の取得オプション(ImapMessageFetchBodyOptions)|これらのメソッドには、ImapMessageFetchBodyOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMessageFetchBodyOptionsを指定することで、メッセージ本文取得時の動作を指定することができます。 以下の値を組み合わせて指定できます。
:メッセージ本文の取得オプション(ImapMessageFetchBodyOptions)|これらのメソッドには、ImapMessageFetchBodyOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMessageFetchBodyOptionsを指定することで、メッセージ本文取得時の動作を指定することができます。 以下の値を組み合わせて指定できます。
2833,34 2740,17
 
:DisabledCapabilities|このコレクションを変更することにより、サーバーがサポートしている拡張機能を使用せず、標準機能のみで処理を行うようにすることができます。 例えば``DisabledCapabilities.Add(ImapCapability.Idle)``のようにすれば、サーバーがIDLEをサポートしている場合でもIDLEを使わないようにすることができます。
:DisabledCapabilities|このコレクションを変更することにより、サーバーがサポートしている拡張機能を使用せず、標準機能のみで処理を行うようにすることができます。 例えば``DisabledCapabilities.Add(ImapCapability.Idle)``のようにすれば、サーバーがIDLEをサポートしている場合でもIDLEを使わないようにすることができます。
 

        

        
 
****サーバーからの通知 [#operation_reference_misc_events]
****サーバーからの通知 [#operation_reference_misc_events]
~
以下はサーバーからの通知をハンドリングするためのイベントと関連するプロパティです。
以下はサーバーからの通知をハンドリングするためのイベントです。
 

        

        
 
|*サーバーからの通知に関するイベント
|*サーバーからの通知に関するイベント
 
|~クラス|~イベント|~解説|h
|~クラス|~イベント|~解説|h
 
|~ImapClient|ExistMessageCountChanged|現在選択しているメールボックスにあるすべてのメッセージの数が変わった場合に発生します。&br;イベント発生前後のメッセージ数と、現在選択しているメールボックスのImapOpenedMailboxInfoを含むImapMailboxSizeChangedEventArgsが送られます。|
|~ImapClient|ExistMessageCountChanged|現在選択しているメールボックスにあるすべてのメッセージの数が変わった場合に発生します。&br;イベント発生前後のメッセージ数と、現在選択しているメールボックスのImapOpenedMailboxInfoを含むImapMailboxSizeChangedEventArgsが送られます。|
 
|~|RecentMessageCountChanged|現在選択しているメールボックスにある新着メッセージの数が変わった場合に発生します。&br;イベント発生前後のメッセージ数と、現在選択しているメールボックスのImapOpenedMailboxInfoを含むImapMailboxSizeChangedEventArgsが送られます。|
|~|RecentMessageCountChanged|現在選択しているメールボックスにある新着メッセージの数が変わった場合に発生します。&br;イベント発生前後のメッセージ数と、現在選択しているメールボックスのImapOpenedMailboxInfoを含むImapMailboxSizeChangedEventArgsが送られます。|
~
|~|MessageDeleted|現在選択しているメールボックスにあるメッセージが削除(移動を含む)された場合に発生します。&br;削除されたメッセージのImapMessageInfo[]を含むImapMessageStatusChangedEventArgsが送られます。|
|~|MessageDeleted|現在選択しているメールボックスにあるメッセージが削除された場合に発生します。&br;削除されたメッセージのImapMessageInfo[]を含むImapMessageStatusChangedEventArgsが送られます。|
 
|~|MessageStatusChanged|現在選択しているメールボックスにあるメッセージの動的属性が変更された場合に発生します。&br;属性が変更されたメッセージのImapMessageInfo[]を含むImapMessageStatusChangedEventArgsが送られます。|
|~|MessageStatusChanged|現在選択しているメールボックスにあるメッセージの動的属性が変更された場合に発生します。&br;属性が変更されたメッセージのImapMessageInfo[]を含むImapMessageStatusChangedEventArgsが送られます。|
 
|~|AlertReceived|サーバーからのアラートを受信した場合に発生します。&br;受信したアラートを含むImapAlertReceivedEventArgsが送られます。|
|~|AlertReceived|サーバーからのアラートを受信した場合に発生します。&br;受信したアラートを含むImapAlertReceivedEventArgsが送られます。|
 
|~クラス|~イベント|~解説|f
|~クラス|~イベント|~解説|f
 

        

        
+
|*サーバーからの通知に関するイベント引数とプロパティ
+
|~クラス|~プロパティ|~解説|h
+
|~ImapMailboxSizeChangedEventArgs|Mailbox|新着メッセージ数や総メッセージ数などの''サイズ''が変化したメールボックスのインスタンス(ImapOpenedMailboxInfo)を返します。|
+
|~|CurrentCount|変化した''サイズ''の現在の値を返します。|
+
|~|PrevCount|変化する前の''サイズ''の値を返します。|
+
|~ImapMessageStatusChangedEventArgs|Messages|削除あるいは動的属性の変更など、状態が変更されたメッセージのインスタンス(ImapMessageInfo[])を返します。|
+
|~ImapAlertReceivedEventArgs|Alert|サーバーから受信したアラートを文字列として返します。|
+
|~|Condition|アラートとして受信したレスポンスの状態(``OK``, ``NG``, ``BYE``等)を返します。|
+

          
+
|*サーバーからの通知に関するプロパティ
+
|~クラス|~プロパティ|~解説|h
+
|~ImapClient|SynchronizingObject|イベントハンドラを呼び出す際に使用する同期オブジェクト(&msdn(netfx,type,System.ComponentModel.ISynchronizeInvoke){ISynchronizeInvoke};)を取得・設定します。 非同期メソッドを呼び出した場合や別スレッドで操作を行った際に発生したイベントを、UIスレッドでハンドリングさせたい場合などに使用します。|
+
|~クラス|~イベント|~解説|f
+

          
+
:イベントの&var{sender};|すべてのイベントについて、引数&var{sender};にはイベントの発生元となるImapClientのインスタンスが渡されます。
+
:IDLE中のイベントと追加の操作|IDLE中にサーバー側から通知が行われた場合も、上記のイベントが発生します。 IDLE中はイベントハンドラから追加の操作(IDLEの停止を除く)を行なうことはできない点に注意してください。 IDLE中のImapClientはビジー状態(IsBusyがtrue)となっているため、追加の操作を行おうとした場合にはInvalidOperationExceptionをスローします。
+

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

        

        
2920,8 2810,12
 

        

        
 
これらのうち、Asyncで終わる名前のメソッドは.NET Framework 4.0以降でのみ使用できるもので、いずれも&msdn(netfx,type,System.Threading.Tasks.Task){TaskまたはTask<T>};を返します。
これらのうち、Asyncで終わる名前のメソッドは.NET Framework 4.0以降でのみ使用できるもので、いずれも&msdn(netfx,type,System.Threading.Tasks.Task){TaskまたはTask<T>};を返します。
 

        

        
-
(現時点では非同期操作の実装は不完全です。 特に複数の操作を並列して進行させようとした場合の動作については今後のバージョンで変更する可能性があります。)
-

          
 
**非同期操作の制限 [#async_operations_restrictions]
**非同期操作の制限 [#async_operations_restrictions]
~
ImapClientおよび関連クラスは''並列操作をサポートしません''。 常に''1クライアントにつき同時に1操作のみ''行えます。 この制限は非同期バージョンのメソッドを使った場合も同様です。 非同期バージョンのメソッドは''非同期操作のみをサポートします''。 同期操作・非同期操作に関わらず、何らかの操作が進行中の場合は同一のクライアントから別の操作を開始することはできません。 操作が進行中の場合、ImapClient.IsBusyプロパティはtrueを返します。 この状態で別の操作を開始しようとした場合にはInvalidOperationExceptionがスローされます。
ImapClientおよび関連クラスは''並列操作をサポートしません''。 常に''1クライアントにつき同時に1操作のみ''行えます。 この制限は非同期バージョンのメソッドを使った場合も同様です。 非同期バージョンのメソッドは''非同期操作のみをサポートします''。 同期操作・非同期操作に関わらず、何らかの操作が進行中の場合は同一のクライアントで別の操作を開始することはできません。 進行中に別の操作を開始しようとした場合にはInvalidOperationExceptionがスローされます。
-

          
-
(なおこの動作は現時点での動作で、今後のバージョンでは例外をスローする代わりにロックするなどの動作に変更する可能性もありますが、''1クライアントにつき同時に1操作のみ''の制限については変更する予定はありません)
 

        

        
 
例えば、次のような操作は正しく動作する保証はありません。
例えば、次のような操作は正しく動作する保証はありません。
 

        

        
2981,11 2875,11
 
Task.WaitAll(t1, t2);
Task.WaitAll(t1, t2);
 
}}
}}
 

        

        
~
なお、ImapMessageInfoクラスのうち、[[動的属性・静的属性を表すプロパティ>#operation_reference_message_status]]は、属性が未取得の場合は参照時にコマンドを発行します。 したがって、別の操作の進行中にこれらのプロパティを参照した場合も同様に例外をスローするので注意してください。 ImapMessageInfoの取得時にImapMessageFetchAttributeOptionsを指定し、事前に属性を取得しておくようにしておけば例外の発生を避けることができます。
なお、ImapMessageInfoクラスには[[プロパティの参照時にコマンドを発行する>#operation_reference_message_status]]ものがあります。 別の操作の進行中にこれらのプロパティを参照した場合も同様に例外をスローする場合もあるので注意してください。
 

        

        
~
ImapMessageInfo.OpenRead()およびOpenText()メソッドが返すStream/StreamReaderについても取り扱いに注意する必要があります。 これらのメソッドが返すStream/StreamReaderは、Closeメソッドが呼び出されるまで操作を完了しません(Closeメソッドが呼び出されるまではIsBusyがtrueとなる)。 そのため、Stream/StreamReaderがCloseされる前に他の処理を行おうとした場合にはInvalidOperationExceptionがスローされることになります。
ImapMessageInfo.OpenRead()およびOpenText()メソッドが返すStream/StreamReaderについても取り扱いに注意する必要があります。 これらのメソッドが返すStream/StreamReaderは、Readメソッドなどで読み込みを行う際必要に応じてコマンドを発行し、メッセージ本文の一部分を取得してその結果を返します。 そのため、読み込み操作の進行中に他の処理を行おうとした場合にはInvalidOperationExceptionがスローされることになります。
 

        

        
~
従って、次のような操作も正しく動作しません。
従って、次のような操作も正しく動作する保証はありません。
 

        

        
 
#code(cs,OpenRead/OpenTextで取得したStream/StreamReaderの読み込み中に他の処理を行う){{
#code(cs,OpenRead/OpenTextで取得したStream/StreamReaderの読み込み中に他の処理を行う){{
 
var client = new ImapClient(...);
var client = new ImapClient(...);
2993,14 2887,16
 
var m1 = inbox.GetMessageBySequence(1);
var m1 = inbox.GetMessageBySequence(1);
 

        

        
 
// メッセージ本文を読み込むStreamReaderを取得する
// メッセージ本文を読み込むStreamReaderを取得する
~
using (var reader = m1.OpenText()) {
var reader = m1.OpenText();
~
  // ImapMessaageInfoから取得したStreamReaderがCloseされるまでは

          
~
  // 他の処理を開始できず、例外をスローする
// 取得したStreamReaderで非同期読み込みを開始する
~
  var m2 = inbox.GetMessageBySequence(2);
var t = reader.ReadToEndAsync();
~
}

          
-
// ImapMessaageInfoから取得したStreamReaderは読み込み中にコマンドを発行するため、
-
// その際には他の処理を開始できず、例外をスローする場合がある
-
var m2 = inbox.GetMessageBySequence(2);
 

        

        
~
// 取得したStreamReaderをCloseした時点で別の処理を開始できるようになる
t.Wait();
+
var m3 = inbox.GetMessageBySequence(3);
 
}}
}}
 

        

        
 

        

        
3027,7 2923,7
 

        

        
 

        

        
 
**スレッドセーフティ
**スレッドセーフティ
~
ImapClientなどのクラスはスレッドセーフとなっているため、同時に複数のスレッドから参照することができます。 だだし、[[並列操作はサポートしていない>#async_operations_restrictions]]ため、同時に複数のスレッドから操作を行う場合、InvalidOperationExceptionがスローされる場合があります。
現時点では、ImapClientなどのクラスは完全なスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 非同期操作のメソッドを除いて、同一クライアントから取得した個々のインスタンスは同一スレッド内で使用することを推奨します。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
 

        

        
 
なお、アプリケーションドメインをまたがる使用については全く考慮していないため、動作および安全性の保証はできません。
なお、アプリケーションドメインをまたがる使用については全く考慮していないため、動作および安全性の保証はできません。
 

        

        
3053,7 2949,7
 
|Smdn.Net.Imap4.Client|ImapUnavailableException|既に閉じたメールボックス、既に削除・移動したメッセージや取得元のメールボックスが既に閉じているメッセージに対して操作を行おうとした|ImapOpenedMailboxInfoクラス・ImapMessageInfoクラスの各メソッド・プロパティ|
|Smdn.Net.Imap4.Client|ImapUnavailableException|既に閉じたメールボックス、既に削除・移動したメッセージや取得元のメールボックスが既に閉じているメッセージに対して操作を行おうとした|ImapOpenedMailboxInfoクラス・ImapMessageInfoクラスの各メソッド・プロパティ|
 
|Smdn.Net.Imap4.Client|ImapMessageVanishedException|他のクライアントによって削除・移動されたことにより該当するメッセージが消滅した|ImapMessageInfoクラスの各プロパティ、ImapMessageInfo.Open*(),ImapMessageInfo.Read*()などのメソッド|
|Smdn.Net.Imap4.Client|ImapMessageVanishedException|他のクライアントによって削除・移動されたことにより該当するメッセージが消滅した|ImapMessageInfoクラスの各プロパティ、ImapMessageInfo.Open*(),ImapMessageInfo.Read*()などのメソッド|
 
|Smdn.Formats|EncodingNotSupportedException|サーバーは指定したエンコーディングをサポートしていない|ImapOpenedMailboxInfo.GetMessages()などEncodingを指定するメソッド|
|Smdn.Formats|EncodingNotSupportedException|サーバーは指定したエンコーディングをサポートしていない|ImapOpenedMailboxInfo.GetMessages()などEncodingを指定するメソッド|
~
|System|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態(ImapClient.IsBusyがtrue)で別の操作を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_restrictions]])|
|System|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態で別の操作を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_restrictions]])|
 
|System|TimeoutException|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_cancellation]])|
|System|TimeoutException|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_cancellation]])|
 
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|ImapClientおよび各クラスのメソッド・プロパティ|
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|ImapClientおよび各クラスのメソッド・プロパティ|
 

        

        

works/tools/junk/SimpleMailer/index.wiki.txt

current previous
20,20 20,6
 
-開発版
-開発版
 
--[[http://svn.smdn.jp/anonsvn/tools/SimpleMailer/trunk/]]よりチェックアウトできます
--[[http://svn.smdn.jp/anonsvn/tools/SimpleMailer/trunk/]]よりチェックアウトできます
 
-1.0x
-1.0x
+
--${smdncms:distfilelink,SimpleMailer-1.09.tar.bz2}
+
---下記ライブラリのソースを同梱しています
+
----[[works/libs/Smdn.Net.Imap4.Client]] 1.09
+
----[[works/libs/Smdn.Net.Pop3.Client]] 1.24
+
----[[works/libs/Smdn.Security.Authentication.Sasl]] 1.00
+
----[[works/libs/Smdn.Formats.Mime]] 0.37
+
----[[works/libs/Smdn.Formats.Ini]] 0.22
+
--${smdncms:distfilelink,SimpleMailer-1.05.tar.bz2}
+
---下記ライブラリのソースを同梱しています
+
----[[works/libs/Smdn.Net.Imap4.Client]] 1.05
+
----[[works/libs/Smdn.Net.Pop3.Client]] 1.23
+
----[[works/libs/Smdn.Security.Authentication.Sasl]] 1.00
+
----[[works/libs/Smdn.Formats.Mime]] 0.37
+
----[[works/libs/Smdn.Formats.Ini]] 0.22
 
--${smdncms:distfilelink,SimpleMailer-1.04.tar.bz2}
--${smdncms:distfilelink,SimpleMailer-1.04.tar.bz2}
 
---下記ライブラリのソースを同梱しています
---下記ライブラリのソースを同梱しています
 
----[[works/libs/Smdn.Net.Imap4.Client]] 1.04
----[[works/libs/Smdn.Net.Imap4.Client]] 1.04
136,13 122,6
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

        

        
 
*変更履歴
*変更履歴
+
**1.09 (2014-06-21)
+
-修正・改善
+
--ライブラリのインターフェイス変更にあわせて実装を修正
+

          
+
**1.05 (2014-06-21)
+
-ライブラリの更新のみ、本体部分は変更なし
+

          
 
**1.04 (2014-06-02)
**1.04 (2014-06-02)
 
-修正・改善
-修正・改善
 
--ライブラリのインターフェイス変更にあわせて実装を修正
--ライブラリのインターフェイス変更にあわせて実装を修正