2014-05-24T15:49:59の更新内容

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

current previous
7,19 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.03 (2014-05-24)>#changes_v1.03]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.03-netfx3.5-combined.zip,.NET 3.5}
+
}}|
 
|~[[1.02 (2014-05-07)>#changes_v1.02]]|~ソースコード|{{
|~[[1.02 (2014-05-07)>#changes_v1.02]]|~ソースコード|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.02.tar.bz2}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-1.02.tar.bz2}
 
}}|
}}|
284,21 271,6
 
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
コンパイラにMono mcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
 

        

        
 
*変更履歴 [#changes]
*変更履歴 [#changes]
+
**1.03 (2014-05-24) [#changes_v1.03]
+
-機能追加
+
--ImapClient
+
---(.NET 4.0以上のみ) ImapMessageInfoクラスにOpenReadAsync(), SaveAsync(), ReadAsAsync()など非同期バージョンのメッセージ取得メソッドを追加 ([[works/libs/Smdn.Net.Imap4.Client/docs#async_operations]])
+
---(.NET 4.0以上のみ) ImapMessageInfo.OpenReadにCancellationTokenおよびIProgressを指定できるバージョンを追加
+
---ImapMessageInfo.Download()を追加、メッセージ本文をメモリ上にダウンロードしたStreamを取得できるようにした
+
-修正・改善
+
--適切な認証方式が見つからない場合にスローする例外をImapAuthenticationExceptionからImapNoAppropriateAuthMechanismExceptionに変更
+
--ImapClient
+
---ImapMessageInfo.Save(), WriteTo(Stream), WriteTo(BinaryWriter)の各メソッドについて、引数が不正な場合はコマンドを送信する前に例外をスローするように動作を変更
+
---ImapMessageInfo.Save(), WriteTo(Stream), WriteTo(BinaryWriter)の各メソッドについて、可能な場合はバッファを介さず直接ストリームに書き込むように動作を変更
+
---ImapMessageInfo.ReadAs()メソッドの型パラメータの名称をTOutputからTResultに変更
+
---ImapMessageInfo.OpenRead(), Save()などのうちImapPartialRangeを指定するバージョンについて、取得するメッセージのサイズによってはArgumentOutOfRangeExceptionがスローされる場合がある不具合を修正
+
---ImapMessageInfo.GetHeader(), GetRawHeader()メソッドでヘッダを取得する場合にRFC822.SIZEの取得を要求しないように修正
+

          
 
**1.02 (2014-05-07) [#changes_v1.02]
**1.02 (2014-05-07) [#changes_v1.02]
 
-機能追加
-機能追加
 
--ImapClient
--ImapClient

works/libs/Smdn.Net.Imap4.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.Imap4.Client-1.03.tar.bz2}
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Imap4.Client-1.02.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.03>works/libs/Smdn.Net.Imap4.Client/releases#changes_v1.03]]時点のものです。
[[works/libs/Smdn.Net.Imap4.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.02>works/libs/Smdn.Net.Imap4.Client/releases#changes_v1.02]]時点のものです。
 

        

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

        

        
232,64 232,6
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
+

          
+
***接続・認証時のパラメータ [#connection_authentication_clientprofile]
+
接続・認証時のパラメータは、ImapClientクラスのコンストラクタまたはImapClient.Profileプロパティで指定します。 指定できるパラメータは次のとおりです。
+

          
+
|*接続・認証時のパラメータ
+
|>|~ImapClient.Profileのプロパティ|~対応するImapClientコンストラクタの引数|~意味と接続・認証時の動作|~補足|~詳細|h
+
|~接続に関するパラメータ|Authority|authority|接続先のURL (IMAP URL形式)|Host, Port, SecurePort, UserName, AuthTypeに指定されているものと同等の値が反映されます|[[#connection_authentication_connectparams]]|
+
|~|Host|host|接続先のホスト名|Authorityのホスト名部分に指定されているものと同じ値が反映されます|~|
+
|~|Port|port|接続先のポート番号|Authorityのポート番号部分に指定されているものと同じ値が反映されます&br;``-1``を指定した場合は標準のポート番号で接続します(``imaps``なら993、``imap``なら143)|~|
+
|~|SecurePort|securePort|接続先のポートがSSL/TLSで保護されているかどうか&br;(SSL/TLSを使用して接続する必要があるかどうか)|Authorityに指定されているものと同じ設定が反映されます&br;スキーム部分が``imaps``ならtrue、``imap``ならfalseになります|~|
+
|~|UseTlsIfAvailable|-|可能なら接続後にSSL/TLSへアップグレードするかどうか|SecurePortがfalse(スキーム部分が``imap``)の場合のみ有効&br;デフォルト:``true``|~|
+
|~認証に関するパラメータ|UserName|userName|認証時に使用するユーザー名|Authorityのユーザー名部分に指定されているものと同じ値が反映されます|[[#connection_authentication_authparams]]|
+
|~|AuthType|authType|認証時に使用する方式|Authorityの認証方式部分に指定されているものと同じ値が反映されます|~|
+
|~|UsingSaslMechanisms|-|認証時に試行するSASL認証方式|AuthTypeを指定しない(null)、あるいは``"*"``を指定した場合のみ有効|~|
+
|~|AllowInsecureLogin|-|平文による''安全でない''認証を許可するかどうか|現在の接続がSSL/TLSで''保護されていない場合のみ''有効&br;保護されている場合は常に平文による認証を試行します&br;デフォルト:``false``|~|
+
|>|~ImapClient.Profileのプロパティ|~対応するImapClientコンストラクタの引数|~意味と接続・認証時の動作|~補足|~詳細|f
+

          
+
なお、パスワードはImapClient.Connect()など接続用のメソッドの引数として指定します。 Profileプロパティやコンストラクタで指定することはできません。
+

          
+
ImapClientコンストラクタで指定した値はImapClient.Profileプロパティに反映されます。 また、ImapClient.Profileプロパティはシリアライズ可能なので設定ファイル等に保存されている値を読み込むこともできます。
+

          
+
ImapClientProfileを指定してImapClientのインスタンスを作成することもできます。 これにより同じ接続設定を使用して複数のインスタンスを作成することができます。
+

          
+
#tabpage(codelang=cs,container-title=共通のImapClientProfileからインスタンスを作成する例)
+
#code{{
+
// ホスト"imap.example.net"のIMAPデフォルトポートに接続し、
+
// ユーザ名"user"で認証を行う設定を作成
+
var profile = new ImapClientProfile(new Uri("imap://user@imap.example.net/"));
+

          
+
// SSL/TLSが使用できない場合は、平文による認証を許可しない
+
profile.AllowInsecureLogin = false;
+

          
+
// 上記の設定でクライアントを2つ作成する
+
var c1 = new ImapClient(profile);
+
var c2 = new ImapClient(profile);
+

          
+
c1.Connect("pass");
+
c2.Connect("pass");
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
' ホスト"imap.example.net"のIMAPデフォルトポートに接続し、
+
' ユーザ名"user"で認証を行う設定を作成
+
Dim profile As New ImapClientProfile(New Uri("imap://user@imap.example.net/"))
+

          
+
' SSL/TLSが使用できない場合は、平文による認証を許可しない
+
profile.AllowInsecureLogin = False
+

          
+
' 上記の設定でクライアントを2つ作成する
+
Dim c1 As New ImapClient(profile)
+
Dim c2 As New ImapClient(profile)
+

          
+
c1.Connect("pass")
+
c2.Connect("pass")
+
}}
+
#tabpage-end
+

          
+

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

        

        
315,7 257,6
 
: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()を呼び出すことで同じインスタンスを使って再度接続することはできます。
 
: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プロパティを設定してください。
+
操作のタイムアウトと中断に関しての注意点は[[#async_operations_cancellation]]を参照してください。
 

        

        
 
***接続に関するパラメータと動作 [#connection_authentication_connectparams]
***接続に関するパラメータと動作 [#connection_authentication_connectparams]
 
接続時の動作は、接続時のパラメータにより次のように変わります。
接続時の動作は、接続時のパラメータにより次のように変わります。
327,7 268,7
 
:SSL/TLSを使用しない|常にSSL/TLSを使用せずに接続を試みます。 サーバがSTARTTLSをサポートしていてもSSL/TLSへのアップグレードはしません。 デフォルトのポート番号は143です。
:SSL/TLSを使用しない|常にSSL/TLSを使用せずに接続を試みます。 サーバがSTARTTLSをサポートしていてもSSL/TLSへのアップグレードはしません。 デフォルトのポート番号は143です。
 
接続先URL&sub{*1};のスキームに''"imap"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''false''を指定した場合はこの動作になります。
接続先URL&sub{*1};のスキームに''"imap"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''false''を指定した場合はこの動作になります。
 

        

        
~
これら[[接続時のパラメータ>#connection_authentication_clientprofile]]は次の箇所で指定します。
これら接続時のパラメータは次の箇所で指定します。
 
:接続先URL&sup{*1};|ImapClientクラスのコンストラクタで指定する引数authority
:接続先URL&sup{*1};|ImapClientクラスのコンストラクタで指定する引数authority
 
:SecurePortプロパティ&sup{*2};|ImapClientクラスのコンストラクタで指定する引数securePort、もしくはImapClient.Profile.SecurePortプロパティ
:SecurePortプロパティ&sup{*2};|ImapClientクラスのコンストラクタで指定する引数securePort、もしくはImapClient.Profile.SecurePortプロパティ
 
:UseTlsIfAvailableプロパティ&sup{*3};|ImapClient.Profile.UseTlsIfAvailableプロパティ
:UseTlsIfAvailableプロパティ&sup{*3};|ImapClient.Profile.UseTlsIfAvailableプロパティ
338,44 279,41
 

        

        
 
|*URLと接続動作の例
|*URLと接続動作の例
 
|~接続先URL|~接続ポート|~SSL/TLS|h
|~接続先URL|~接続ポート|~SSL/TLS|h
~
|``imaps://user@imap.example.net/``|993|SSL/TLSを使用して接続|
|imaps://user@imap.example.net/|993|SSL/TLSを使用|
~
|``imaps://user@imap.example.net:10143/``|10143|~|
|imaps://user@imap.example.net:10143/|10143|SSL/TLSを使用|
~
|``imap://user@imap.example.net/``|143|SSL/TLSを使用しないで接続&br;もしくは可能なら接続後にSSL/TLSへアップグレード(UseTlsIfAvailable=trueの場合)|
|imap://user@imap.example.net/|143|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
~
|``imap://user@imap.example.net:993/``|993|~|
|imap://user@imap.example.net:993/|993|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 

        

        
 
***認証に関するパラメータと動作 [#connection_authentication_authparams]
***認証に関するパラメータと動作 [#connection_authentication_authparams]
 
接続に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からはパスワードを取得しません(指定されていてもパスワードとしては解釈しません)。
 

        

        
~
認証方式を指定しない場合、もしくは``"*"``が指定されている場合は次の順で認証を試行します。
認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
 
+AUTHENTICATEコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
+AUTHENTICATEコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
 
+LOGINコマンド (サーバが許可している場合のみ)
+LOGINコマンド (サーバが許可している場合のみ)
 

        

        
~
URLもしくはパラメータでユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。 認証方式にANONYMOUSを指定して認証を行う場合、ユーザ名の部分をログイントークンとして送信します。 ユーザ名が指定されていない場合は``"anonymous@"``をログイントークンとして送信します。 ログイントークンに@などの記号を含める場合はURLエスケープする必要があります。
URLもしくはパラメータでユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。 認証方式にANONYMOUSを指定して認証を行う場合、ユーザ名の部分をログイントークンとして送信します。 ユーザ名が指定されていない場合は"anonymous@"をログイントークンとして送信します。 ログイントークンに@などの記号を含める場合はURLエスケープする必要があります。
 

        

        
~
認証方式の大文字小文字の違いは無視します(IMAP URLの場合は``;AUTH=``の部分も大文字小文字を無視します)。
認証方式の大文字小文字の違いは無視します(IMAP URLの場合は';AUTH='の部分も大文字小文字を無視します)。
 

        

        
 
例として接続先のURLと認証時の動作を表にまとめると以下のようになります。
例として接続先のURLと認証時の動作を表にまとめると以下のようになります。
 

        

        
 
|*URLと認証動作の例
|*URLと認証動作の例
 
|~接続先URL|~認証に使用するユーザ名|~使用する認証メカニズム|h
|~接続先URL|~認証に使用するユーザ名|~使用する認証メカニズム|h
~
|``imap://user;AUTH=DIGEST-MD5@imap.example.net/``|user|DIGEST-MD5|
|imap://user;AUTH=DIGEST-MD5@imap.example.net/|user|DIGEST-MD5|
~
|``imap://;AUTH=DIGEST-MD5@imap.example.net/``|ICredentialsByHostインターフェイスより取得|DIGEST-MD5|
|imap://;AUTH=DIGEST-MD5@imap.example.net/|ICredentialsByHostインターフェイスより取得|DIGEST-MD5|
~
|``imap://user;AUTH=*@imap.example.net/``|user|サーバ・クライアントが対応しているものを順に試行|
|imap://user;AUTH=*@imap.example.net/|user|サーバ・クライアントが対応しているものを順に試行|
~
|``imap://user@imap.example.net/``|user|サーバ・クライアントが対応しているものを順に試行|
|imap://user@imap.example.net/|user|サーバ・クライアントが対応しているものを順に試行|
~
|``imap://;AUTH=ANONYMOUS@imap.example.net/``|匿名ユーザ&br;(ログイントークン: ``anonymous@``)|ANONYMOUS|
|imap://;AUTH=ANONYMOUS@imap.example.net/|匿名ユーザ&br;(ログイントークン: anonymous@)|ANONYMOUS|
~
|``imap://user@localhost;AUTH=ANONYMOUS@imap.example.net/``|匿名ユーザ&br;(ログイントークン: ``user@localhost``)|ANONYMOUS|
|imap://user@localhost;AUTH=ANONYMOUS@imap.example.net/|匿名ユーザ&br;(ログイントークン: user@localhost)|ANONYMOUS|
~
|``imap://imap.example.net/``|匿名ユーザ&br;(ログイントークン: ``anonymous@``)|ANONYMOUSもしくはIMAP LOGINコマンドを使用|
|imap://imap.example.net/|匿名ユーザ&br;(ログイントークン: anonymous@)|ANONYMOUSもしくはIMAP LOGINコマンドを使用|
+

          
+
試行する認証メカニズムを制御するには、ImapClient.Profile.UsingSaslMechanismsプロパティの値を変更してください。 UsingSaslMechanismsプロパティにANONYMOUSが含まれていても匿名ログインは試行しません。
 

        

        
~
ImapClient.Profile.AllowInsecureLoginプロパティにfalseを指定した場合で、かつ現在の接続がSSL/TLSで保護されていない場合、平文による認証は試行されません(デフォルトはfalseです)。
試行する認証メカニズムを制御するには、ImapClient.Profile.UsingSaslMechanismsプロパティの値を変更してください。 UsingSaslMechanismsプロパティにANONYMOUSが含まれていても匿名ログインは試行しません。 ImapClient.Profile.AllowInsecureLoginプロパティにfalseを指定した場合で、かつ現在の接続がSSL/TLSで保護されていない場合、平文による認証は試行されません(デフォルトはfalseです)。
 

        

        
 
|*サーバが対応している認証方式と認証試行順の例
|*サーバが対応している認証方式と認証試行順の例
~
|~サーバが対応している認証方式|~UsingSaslMechanismsの値|>|~認証の試行順序|h
|~サーバが対応している認証方式|~UsingSaslMechanismsの値|~試行順序&br;(接続がSSL/TLSで保護されている、もしくはAllowInsecureLoginがtrueの場合)|~試行順序&br;(接続がSSL/TLSで保護されていない、かつAllowInsecureLoginがfalseの場合)|h
+
|~|~|~接続がSSL/TLSで保護されている&br;もしくはAllowInsecureLoginがtrueの場合|~接続がSSL/TLSで保護されていない&br;かつAllowInsecureLoginがfalseの場合|h
 
|DIGEST-MD5&br;CRAM-MD5&br;IMAP LOGIN|{"DIGEST-MD5", "CRAM-MD5"}|1.DIGEST-MD5&br;2.CRAM-MD5&br;3.IMAP LOGIN|1.DIGEST-MD5&br;2.CRAM-MD5|
|DIGEST-MD5&br;CRAM-MD5&br;IMAP LOGIN|{"DIGEST-MD5", "CRAM-MD5"}|1.DIGEST-MD5&br;2.CRAM-MD5&br;3.IMAP LOGIN|1.DIGEST-MD5&br;2.CRAM-MD5|
 
|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|ImapNoAppropriateAuthMechanismExceptionをスロー&br;(試行できる認証方式なし)|
|PLAIN&br;IMAP LOGIN|null|1.IMAP LOGIN|ImapAuthenticationExceptionをスロー&br;(試行できる認証方式なし)|
 

        

        
 
***認証時に参照する資格情報 [#connection_authentication_credentials]
***認証時に参照する資格情報 [#connection_authentication_credentials]
 
認証時に必要なユーザ名・パスワードは&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);を返すクラスなら何でも設定できます。
2284,7 2222,6
 
:待機中の操作とイベント|IDLEを開始してから終了するまでの間は、他のコマンドを実行することはできません。 待機中に他の操作を行おうとした場合、例外をスローします。
:待機中の操作とイベント|IDLEを開始してから終了するまでの間は、他のコマンドを実行することはできません。 待機中に他の操作を行おうとした場合、例外をスローします。
 
また、待機中は受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
また、待機中は受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
 
そのため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
そのため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
+
[[#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|IDLE中はImapClient.IsBusyプロパティはtrueを返します。 サーバがIDLEをサポートしていない場合、NOOPでの待機を行う場合にはIsBusyプロパティはfalseとなります。
:ImapClient.IsBusy|IDLE中はImapClient.IsBusyプロパティはtrueを返します。 サーバがIDLEをサポートしていない場合、NOOPでの待機を行う場合にはIsBusyプロパティはfalseとなります。
 

        

        
2427,27 2364,22
 
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|h
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|h
 
|~ImapMessageInfo|{{
|~ImapMessageInfo|{{
 
OpenRead()
OpenRead()
+
OpenReadAsync()
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を読み込むためのStreamを取得します。|FETCH|
}}|メッセージ本文を読み込むためのStreamを取得します。|FETCH|
 
|~|{{
|~|{{
 
OpenText()
OpenText()
+
OpenTextAsync()
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を読み込むためのStreamReaderを取得します。|FETCH|
}}|メッセージ本文を読み込むためのStreamReaderを取得します。|FETCH|
 
|~|{{
|~|{{
 
ReadAllBytes()
ReadAllBytes()
+
ReadAllBytesAsync()
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文をbyte[]で取得します。|FETCH|
}}|メッセージ本文をbyte[]で取得します。|FETCH|
 
|~|{{
|~|{{
 
ReadAllLines()
ReadAllLines()
+
ReadAllLinesAsync()
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文をstring[]で取得します。|FETCH|
}}|メッセージ本文をstring[]で取得します。|FETCH|
 
|~|{{
|~|{{
 
ReadAllText()
ReadAllText()
+
ReadAllTextAsync()
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文をstringで取得します。|FETCH|
}}|メッセージ本文をstringで取得します。|FETCH|
 
|~|{{
|~|{{
2455,10 2387,9
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文をIEnumerable<string>で取得します。|FETCH|
}}|メッセージ本文をIEnumerable<string>で取得します。|FETCH|
 
|~|{{
|~|{{
~
ReadAs<TResult>(Converter<Stream, TResult>)
ReadAs<TOutput>(Converter<Stream, TOutput>)
+
ReadAsAsync<TResult>(Converter<Stream, TResult>)
 
および類似のオーバーロード
および類似のオーバーロード
~
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TResult>で変換された結果を取得します。|FETCH|
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TOutput>で変換された結果を取得します。|FETCH|
 
|~|{{
|~|{{
 
ReadAs<T, TResult>
ReadAs<T, TResult>
 
(Func<Stream, T, TResult>, T)
(Func<Stream, T, TResult>, T)
2471,36 2402,24
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたFunc<Stream, T, TResult>~Func<Stream, T1, T2, T3, T4, TResult>で変換された結果を取得します。|FETCH|
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたFunc<Stream, T, TResult>~Func<Stream, T1, T2, T3, T4, TResult>で変換された結果を取得します。|FETCH|
 
|~|{{
|~|{{
~
ReadAs<TResult>(Converter<StreamReader, TResult>)
ReadAs<TOutput>(Converter<StreamReader, TOutput>)
+
ReadAsAsync<TResult>(Converter<StreamReader, TResult>)
 
および類似のオーバーロード
および類似のオーバーロード
~
}}|メッセージ本文を読み込むためのStreamReaderを取得し、指定されたConverter<StreamReader, TResult>で変換された結果を取得します。|FETCH|
}}|メッセージ本文を読み込むためのStreamReaderを取得し、指定されたConverter<StreamReader, TOutput>で変換された結果を取得します。|FETCH|
 
|~|{{
|~|{{
 
Save(string)
Save(string)
+
SaveAsync(string)
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を指定されたファイルに保存します。|FETCH|
}}|メッセージ本文を指定されたファイルに保存します。|FETCH|
 
|~|{{
|~|{{
 
WriteTo(Stream)
WriteTo(Stream)
+
WriteToAsync(Stream)
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を指定されたStreamに書き込みます。|FETCH|
}}|メッセージ本文を指定されたStreamに書き込みます。|FETCH|
 
|~|{{
|~|{{
 
WriteTo(BinaryWriter)
WriteTo(BinaryWriter)
+
WriteToAsync(BinaryWriter)
 
および類似のオーバーロード
および類似のオーバーロード
 
}}|メッセージ本文を指定されたBinaryWriterに書き込みます。|FETCH|
}}|メッセージ本文を指定されたBinaryWriterに書き込みます。|FETCH|
+
|~|{{
+
Download()
+
DownloadAsync()
+
および類似のオーバーロード
+
}}|メッセージ本文をメモリ上にダウンロードしたStreamを取得します。|FETCH|
 
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
|~クラス|~メソッド|~解説|~対応するIMAPコマンド|f
 

        

        
~
:すべてのメソッド|これらすべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、Download()メソッドでメモリ上にダウンロードしたStreamを取得するか、Save()メソッドでファイルに保存するなどしてください。
:すべてのメソッド|これらすべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、WriteTo()メソッドでMemoryStream等に書き出すか、Save()メソッドでファイルに保存するなどしてください。
+
:OpenRead()/OpenText()とDownload()|OpenRead()/OpenText()メソッドはメッセージ本文を適宜ダウンロードしながら読み込むためのStream/StreamReaderを返します。 メソッド呼び出しが完了した時点ではメッセージ本文の先頭一部のみがダウンロードされていて、Readメソッドなどで読み込むことにより続きの部分が適宜ダウンロードされます。 OpenRead()/OpenText()が返すStream/StreamReaderはシーク操作および書き込み操作をサポートしません。
+
一方Download()メソッドはメッセージ全文をメモリ上にダウンロードしたStreamを返します。 メソッド呼び出しが完了した時点でメッセージ全文がダウンロードされています。 Download()メソッドが返すStreamはシーク操作および書き込み操作をサポートします。
+
:非同期バージョンのメソッド|OpenReadAsync()など名前がAsyncで終わるメソッドは非同期バージョンのメソッドです。 基本的な動作は同期バージョンと同じです。 非同期バージョンのメソッドを使う際の注意点は[[#async_operations]]を参照してください。
 
:セクションの指定|これらすべてのメソッドは、引数でセクション番号あるいはセクションを表すBODYSTRUCTUREのIImapBodyStructureを指定することができるオーバーロードが用意されています。 これらのオーバーロードでは、メッセージ本文全体ではなく指定したセクション部分だけを取得します。 詳細については[[#operation_reference_message_section_bodystructure]]で解説します。
:セクションの指定|これらすべてのメソッドは、引数でセクション番号あるいはセクションを表すBODYSTRUCTUREのIImapBodyStructureを指定することができるオーバーロードが用意されています。 これらのオーバーロードでは、メッセージ本文全体ではなく指定したセクション部分だけを取得します。 詳細については[[#operation_reference_message_section_bodystructure]]で解説します。
 
:メッセージ本文の取得オプション(ImapMessageFetchBodyOptions)|これらのメソッドには、ImapMessageFetchBodyOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMessageFetchBodyOptionsを指定することで、メッセージ本文取得時の動作を指定することができます。 以下の値を組み合わせて指定できます。
:メッセージ本文の取得オプション(ImapMessageFetchBodyOptions)|これらのメソッドには、ImapMessageFetchBodyOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMessageFetchBodyOptionsを指定することで、メッセージ本文取得時の動作を指定することができます。 以下の値を組み合わせて指定できます。
 
::SetSeen|メッセージ本文の取得と同時に、メッセージを既読にします。 このオプションを指定しない場合は、メッセージの既読/未読の状態をそのままにします。
::SetSeen|メッセージ本文の取得と同時に、メッセージを既読にします。 このオプションを指定しない場合は、メッセージの既読/未読の状態をそのままにします。
2805,129 2724,6
 
-IImapMailboxFlagSet
-IImapMailboxFlagSet
 

        

        
 

        

        
+
*非同期操作 [#async_operations]
+
本ライブラリでは[[ImapClient.BeginConnect()/EndConnect()、ImapClient.ConnectAsync()>#connection_authentication_reference]]や、[[ImapMessageInfo.OpenReadAsync()、SaveAsync()>#operation_reference_message_readbody]]など非同期バージョンのメソッドを用意しています。 また、[[ImapOpenedMailboxInfo.StartIdle()/EndIdle()>#operation_reference_selectedmailbox_idle]]などのメソッドでも非同期操作を行うことができます。
+

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

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

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

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

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

          
+
#code(cs,メッセージの取得を並列して行う){{
+
var client = new ImapClient(...);
+
var inbox = client.OpenInbox();
+

          
+
var m1 = inbox.GetMessageBySequence(1);
+
var m2 = inbox.GetMessageBySequence(2);
+

          
+
// 2つのメッセージの本文の取得を並列して開始する
+
var t1 = m1.ReadAllBytesAsync();
+
var t2 = m2.ReadAllBytesAsync(); // タスクが進行中の場合は他の処理を開始できず、例外をスローする場合がある
+

          
+
Task.WaitAll(t1, t2);
+
}}
+

          
+
#code(cs,メッセージの取得中に他の処理を行う){{
+
var client = new ImapClient(...);
+
var inbox = client.OpenInbox();
+

          
+
var m1 = inbox.GetMessageBySequence(1);
+
var t1 = m1.ReadAllBytesAsync();
+

          
+
// 本文の取得が開始している状態で別の処理(メッセージの取得)を行う
+
var m2 = inbox.GetMessageBySequence(2); // タスクが進行中の場合は他の処理を開始できず、例外をスローする場合がある
+

          
+
t1.Wait();
+
}}
+

          
+
#code(cs,IDLE中に他の処理を行う){{
+
var client = new ImapClient(...);
+
var inbox = client.OpenInbox();
+

          
+
// IDLEを開始する
+
inbox.StartIdle();
+

          
+
// IDLEの進行中に別の処理(メッセージの取得)を行う
+
var m = inbox.GetMessageBySequence(1); // IDLEが進行中の場合は他の処理を開始できず、例外をスローする場合がある
+
}}
+

          
+
並列操作を行いたい場合は、ImapClientのインスタンスを並列数分だけ用意してください。 例えば、次のような操作は正しく動作します。
+

          
+
#code(cs,別々のクライアントを用意してメッセージ本文の取得を並列して行う){{
+
var client1 = new ImapClient(...);
+
var client2 = new ImapClient(...);
+
var inbox1 = client1.OpenInbox();
+
var inbox2 = client2.OpenInbox();
+

          
+
var m1 = inbox1.GetMessageBySequence(1);
+
var m2 = inbox2.GetMessageBySequence(2);
+

          
+
// 別々のクライアントから取得したメッセージを使い、そのそれぞれで並列して本文を取得する
+
var t1 = m1.ReadAllBytesAsync();
+
var t2 = m2.ReadAllBytesAsync();
+

          
+
Task.WaitAll(t1, t2);
+
}}
+

          
+
なお、ImapMessageInfoクラスには[[プロパティの参照時にコマンドを発行する>#operation_reference_message_status]]ものがあります。 別の操作の進行中にこれらのプロパティを参照した場合も同様に例外をスローする場合もあるので注意してください。
+

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

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

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

          
+
// メッセージ本文を読み込むStreamReaderを取得する
+
var reader = m1.OpenText();
+

          
+
// 取得したStreamReaderで非同期読み込みを開始する
+
var t = reader.ReadToEndAsync();
+

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

          
+
t.Wait();
+
}}
+

          
+

          
+

          
+

          
+
**非同期操作の中断とタイムアウト [#async_operations_cancellation]
+
非同期バージョンのメソッドでは、&msdn(netfx,type,System.Threading.CancellationToken){CancellationToken};を指定することにより非同期操作を中断することができるものもあります。 ただしCancellationTokenで中断要求を行なった場合でもプロトコル上の制限などにより即座には中断しない場合もあります。
+

          
+
[[Timeoutプロパティ>#connection_authentication_reference]]などの設定によって強制的にタイムアウトさせることでも操作を中断させることができます。 非同期操作の場合も同期操作と同様にTimeoutプロパティなどの設定に従って操作がタイムアウトします。
+

          
+
なお、操作がタイムアウトしてTimeoutExceptionをスローする場合、ImapClientは''内部的に接続を切断し''ImapClient.IsConnectedプロパティはfalseとなります。 ''タイムアウトした場合は処理を継続できない''ため、再接続する必要があります。 一方CancellationTokenによって中断を行った場合は接続は維持され、以後も処理を継続することができます。
+

          
+

          
+
**非同期操作の進捗通知 [#async_operations_progress]
+
一部の非同期操作メソッドは進捗通知を行わせることができます。 進捗通知は.NET Framework 4.5以降でサポートしていて、&msdn(netfx,type,System.IProgress`1){IProgress<T>};を指定することにより非同期操作の進捗を通知させることができます。 進捗の具体的な取得方法に関しては&msdn(netfx,type,System.Progress`1){Progress<T>クラス};を参照してください。
+

          
+
ImapMessageInfoクラスの非同期メソッドでは、IProgress<ImapMessageFetchProgressInfo>で進捗の通知を行います。 ImapMessageFetchProgressInfo構造体からは以下の情報を取得できます。
+

          
+
|*ImapMessageFetchProgressInfo構造体のプロパティ
+
|~プロパティ|~解説|h
+
|FetchedOctetCount|現在までに取得が完了したメッセージ本文のオクテット数|
+
|TotalOctetCount|取得されるメッセージ本文の総オクテット数|
+
|ProgressPercentage|現在までに取得が完了した割合(%)&br;百分率に100を掛けて0〜100までの整数で表した値|
+

          
+

          
+
**スレッドセーフティ
+
現時点では、ImapClientなどのクラスは完全なスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 非同期操作のメソッドを除いて、同一クライアントから取得した個々のインスタンスは同一スレッド内で使用することを推奨します。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
+

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

          
+

          
 
#hr
#hr
 

        

        
 

        

        
2939,18 2735,16
 
|~名前空間|~例外クラス|~状況|~スローする可能性のあるメソッド|h
|~名前空間|~例外クラス|~状況|~スローする可能性のあるメソッド|h
 
|Smdn.Net.Imap4.Protocol|ImapConnectionException|接続に失敗した場合、送受信中にソケットエラーが発生した場合など|ImapClient.Connect()|
|Smdn.Net.Imap4.Protocol|ImapConnectionException|接続に失敗した場合、送受信中にソケットエラーが発生した場合など|ImapClient.Connect()|
 
|Smdn.Net.Imap4.Protocol|ImapSecureConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|ImapClient.Connect()|
|Smdn.Net.Imap4.Protocol|ImapSecureConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|ImapClient.Connect()|
~
|Smdn.Net.Imap4|ImapAuthenticationException|認証に失敗した|ImapClient.Connect()|
|Smdn.Net.Imap4|ImapAuthenticationException|認証に失敗した&br;試行できる認証メカニズムが無い|ImapClient.Connect()|
+
|Smdn.Net.Imap4|ImapNoAppropriateAuthMechanismException|現在の設定で試行できる認証メカニズムが無い|ImapClient.Connect()|
 
|Smdn.Net.Imap4|ImapErrorResponseException|サーバがエラー応答を返した|ImapClientおよび各クラスのメソッド・プロパティ|
|Smdn.Net.Imap4|ImapErrorResponseException|サーバがエラー応答を返した|ImapClientおよび各クラスのメソッド・プロパティ|
 
|Smdn.Net.Imap4|ImapProtocolViolationException|プロトコル上不正な操作を行おうとした|ImapClientおよび各クラスのメソッド・プロパティ|
|Smdn.Net.Imap4|ImapProtocolViolationException|プロトコル上不正な操作を行おうとした|ImapClientおよび各クラスのメソッド・プロパティ|
~
|Smdn.Net.Imap4|ImapIncapableException|サーバがサポートしていない機能、あるいは無効化している機能を使った処理を要求しようとした|ImapClientおよび各クラスのメソッド&br;([[#operation_reference_extension_specs]])|
|Smdn.Net.Imap4|ImapIncapableException|サーバがサポートしていない機能、あるいは無効化している機能を使った処理を要求しようとした|ImapClientおよび各クラスのメソッド ([[#operation_reference_extension_specs]])|
 
|Smdn.Net.Imap4.Client|ImapMailboxNotFoundException|指定された名前のメールボックスが見つからない|ImapClient.GetMailbox()&br;ImapMessageInfo.CopyTo()など|
|Smdn.Net.Imap4.Client|ImapMailboxNotFoundException|指定された名前のメールボックスが見つからない|ImapClient.GetMailbox()&br;ImapMessageInfo.CopyTo()など|
 
|Smdn.Net.Imap4.Client|ImapMessageNotFoundException|指定されたUIDもしくは通番を持つメッセージが存在しない|ImapOpenedMailboxInfo.GetMessageByUid()&br;ImapOpenedMailboxInfo.GetMessageBySequence()|
|Smdn.Net.Imap4.Client|ImapMessageNotFoundException|指定されたUIDもしくは通番を持つメッセージが存在しない|ImapOpenedMailboxInfo.GetMessageByUid()&br;ImapOpenedMailboxInfo.GetMessageBySequence()|
 
|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を指定するメソッド|
|System|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;非同期接続中に新たに接続を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ|
~
|System|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態で別の操作を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_restrictions]])|
|System|TimeoutException|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ|
+
|System|TimeoutException|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ&br;([[#async_operations_cancellation]])|
 
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|ImapClientおよび各クラスのメソッド・プロパティ|
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|ImapClientおよび各クラスのメソッド・プロパティ|
 

        

        
 
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
2968,12 2762,8
 
----Smdn.Net.Imap4.ImapProtocolViolationException
----Smdn.Net.Imap4.ImapProtocolViolationException
 
----Smdn.Net.Imap4.Client.ImapMessageVanishedException
----Smdn.Net.Imap4.Client.ImapMessageVanishedException
 
----Smdn.Net.Imap4.Client.ImapUnavailableException
----Smdn.Net.Imap4.Client.ImapUnavailableException
+
---Smdn.Net.Imap4.ImapNoAppropriateAuthMechanismException
 
---Smdn.Net.Imap4.Client.ImapMailboxNotFoundException
---Smdn.Net.Imap4.Client.ImapMailboxNotFoundException
 
---Smdn.Net.Imap4.Client.ImapMessageNotFoundException
---Smdn.Net.Imap4.Client.ImapMessageNotFoundException
+
--System.NotSupportedException
+
---Smdn.Formats.EncodingNotSupportedException
+

          
 

        

        
 
**ログ [#logging]
**ログ [#logging]
 
シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。 ログ出力に使用する&msdn(netfx,type,System.Diagnostics.TraceSource){TraceSource};の名前と、出力内容は次のとおりです。
シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。 ログ出力に使用する&msdn(netfx,type,System.Diagnostics.TraceSource){TraceSource};の名前と、出力内容は次のとおりです。
3079,6 2869,13
 
}
}
 
}}
}}
 

        

        
-
*非同期操作・スレッドセーフティ
-
現時点で非同期操作をサポートするメソッドは、ImapClient.BeginConnect()/EndConnect()、ImapClient.ConnectAsync()のみです。
-

          
-
また現時点では、上記の非同期操作用のメソッドを除き、ImapClientなどのクラスはスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 個々のインスタンスは同一スレッド内で使用してください。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
-

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

          
 

        

        
 
#hr
#hr
 

        

        

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

current previous
7,19 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.21 (2014-05-24)>#changes_v1.21]]|~ソースコード|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21.tar.bz2}
+
}}|
+
|~|~DLL|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx4.5.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx3.5.zip,.NET 3.5}
+
}}|
+
|~|~DLL&br;([[単一アセンブリ版>#releases_combined]])|{{
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx4.5-combined.zip,.NET 4.5}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.21-netfx3.5-combined.zip,.NET 3.5}
+
}}|
 
|~[[1.20 (2014-04-23)>#changes_v1.20]]|~ソースコード|{{
|~[[1.20 (2014-04-23)>#changes_v1.20]]|~ソースコード|{{
 
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.20.tar.bz2}
${smdncms:distfilelink,../Smdn.Net.Pop3.Client-1.20.tar.bz2}
 
}}|
}}|
255,18 242,6
 

        

        
 
*変更履歴 [#changes]
*変更履歴 [#changes]
 

        

        
+
**1.21 (2014-05-24) [#changes_v1.21]
+
-機能追加
+
--PopClient
+
---(.NET 4.0以上のみ) PopMessageInfoクラスにOpenReadAsync(), SaveAsync(), ReadAsAsync()など非同期バージョンのメッセージ取得メソッドを追加 ([[works/libs/Smdn.Net.Pop3.Client/docs#async_operations]])
+
---PopClient.Profile.AllowStandardLoginおよびAllowApopLoginプロパティを追加し、APOPおよびUSER/PASSによるログインを試行するかどうかを指定できるようにした
+
-修正・改善
+
--POP URLで";AUTH=+APOP"を指定してもAPOP認証が行われず、常にエラーとなる不具合を修正
+
--適切な認証方式が見つからない場合にスローする例外をPopAuthenticationExceptionからPopNoAppropriateAuthMechanismExceptionに変更
+
--PopClient
+
---PopMessageInfo.Save(), WriteTo(Stream)メソッドについて、バッファを使用せず指定されたストリームに直接書き込みを行うように動作を変更
+
---PopMessageInfo.ReadAs(), PopClient.Download*MessageAs()メソッドなどの型パラメータの名称をTOutputからTResultに変更
+

          
 
**1.20 (2014-04-23) [#changes_v1.20]
**1.20 (2014-04-23) [#changes_v1.20]
 
-修正・改善
-修正・改善
 
--&color(red){.NET Framework 2.0のサポートを廃止};
--&color(red){.NET Framework 2.0のサポートを廃止};

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.21.tar.bz2}
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Pop3.Client-1.20.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.21>works/libs/Smdn.Net.Pop3.Client/releases#changes_v1.21]]時点のものです。
[[works/libs/Smdn.Net.Pop3.Client]]のドキュメントとサンプルです。 ここに記載されているものは[[version 1.20>works/libs/Smdn.Net.Pop3.Client/releases#changes_v1.20]]時点のものです。
 

        

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

        

        
134,7 134,7
 
var client4 = new PopClient("pop.example.net", -1, false, null, "*");
var client4 = new PopClient("pop.example.net", -1, false, null, "*");
 

        

        
 
client4.Profile.UseTlsIfAvailable = false;
client4.Profile.UseTlsIfAvailable = false;
~
client4.Profile.UsingSaslMechanisms = new[] {"DIGEST-MD5", "CRAM-MD5"};
client4.Profile.UsingSaslMechanisms = new[] {"DIGEST-MD5", "CRAM-MD5", "+APOP"};
 

        

        
 
client4.Connect(new NetworkCredential("user", "pass"));
client4.Connect(new NetworkCredential("user", "pass"));
 

        

        
192,7 192,7
 
Dim client4 As New PopClient("pop.example.net", -1, False, Nothing, "*")
Dim client4 As New PopClient("pop.example.net", -1, False, Nothing, "*")
 

        

        
 
client4.Profile.UseTlsIfAvailable = False
client4.Profile.UseTlsIfAvailable = False
~
client4.Profile.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5"}
client4.Profile.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5", "+APOP"}
 

        

        
 
client4.Connect(New NetworkCredential("user", "pass"))
client4.Connect(New NetworkCredential("user", "pass"))
 

        

        
218,65 218,6
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
+
***接続・認証時のパラメータ [#clientprofile]
+
接続・認証時のパラメータは、PopClientクラスのコンストラクタまたはPopClient.Profileプロパティで指定します。 指定できるパラメータは次のとおりです。
+

          
+
|*接続・認証時のパラメータ
+
|>|~PopClient.Profileのプロパティ|~対応するPopClientコンストラクタの引数|~意味と接続・認証時の動作|~補足|~詳細|h
+
|~接続に関するパラメータ|Authority|authority|接続先のURL (POP URL形式)|Host, Port, SecurePort, UserName, AuthTypeに指定されているものと同等の値が反映されます|[[#connect]]|
+
|~|Host|host|接続先のホスト名|Authorityのホスト名部分に指定されているものと同じ値が反映されます|~|
+
|~|Port|port|接続先のポート番号|Authorityのポート番号部分に指定されているものと同じ値が反映されます&br;``-1``を指定した場合は標準のポート番号で接続します(``pops``なら995、``pop``なら110)|~|
+
|~|SecurePort|securePort|接続先のポートがSSL/TLSで保護されているかどうか&br;(SSL/TLSを使用して接続する必要があるかどうか)|Authorityに指定されているものと同じ設定が反映されます&br;スキーム部分が``pops``ならtrue、``pop``ならfalseになります|~|
+
|~|UseTlsIfAvailable|-|可能なら接続後にSSL/TLSへアップグレードするかどうか|SecurePortがfalse(スキーム部分が``pop``)の場合のみ有効&br;デフォルト:``true``|~|
+
|~認証に関するパラメータ|UserName|userName|認証時に使用するユーザー名|Authorityのユーザー名部分に指定されているものと同じ値が反映されます|[[#auth]]|
+
|~|AuthType|authType|認証時に使用する方式|Authorityの認証方式部分に指定されているものと同じ値が反映されます|~|
+
|~|UsingSaslMechanisms|-|認証時に試行するSASL認証方式|AuthTypeを指定しない(null)、あるいは``"*"``を指定した場合のみ有効|~|
+
|~|AllowInsecureLogin|-|平文およびAPOPによる''安全でない''認証を許可するかどうか|現在の接続がSSL/TLSで''保護されていない場合のみ''有効&br;保護されている場合は常に平文およびAPOPによる認証を試行します&br;デフォルト:``false``|~|
+
|~|AllowStandardLogin|-|POP標準のUSER/PASSによる認証を許可するかどうか|現在の接続がSSL/TLSで''保護されているかどうかに関わらず''有効&br;デフォルト:``true``|~|
+
|~|AllowApopLogin|-|APOPによる認証を許可するかどうか|~|~|
+
|>|~PopClient.Profileのプロパティ|~対応するPopClientコンストラクタの引数|~意味と接続・認証時の動作|~補足|~詳細|f
+

          
+
なお、パスワードはPopClient.Connect()など接続用のメソッドの引数として指定します。 Profileプロパティやコンストラクタで指定することはできません。
+

          
+
PopClientコンストラクタで指定した値はPopClient.Profileプロパティに反映されます。 また、PopClient.Profileプロパティはシリアライズ可能なので設定ファイル等に保存されている値を読み込むこともできます。
+

          
+
PopClientProfileを指定してPopClientのインスタンスを作成することもできます。 これにより同じ接続設定を使用して複数のインスタンスを作成することができます。
+

          
+
#tabpage(codelang=cs,container-title=共通のPopClientProfileからインスタンスを作成する例)
+
#code{{
+
// ホスト"pop.example.net"のPOPデフォルトポートに接続し、
+
// ユーザ名"user"で認証を行う設定を作成
+
var profile = new PopClientProfile(new Uri("pop://user@pop.example.net/"));
+

          
+
// SSL/TLSが使用できない場合は、平文による認証を許可しない
+
profile.AllowInsecureLogin = false;
+

          
+
// 上記の設定でクライアントを2つ作成する
+
var c1 = new PopClient(profile);
+
var c2 = new PopClient(profile);
+

          
+
c1.Connect("pass");
+
c2.Connect("pass");
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
' ホスト"pop.example.net"のPOPデフォルトポートに接続し、
+
' ユーザ名"user"で認証を行う設定を作成
+
Dim profile As New PopClientProfile(New Uri("pop://user@pop.example.net/"))
+

          
+
' SSL/TLSが使用できない場合は、平文による認証を許可しない
+
profile.AllowInsecureLogin = False
+

          
+
' 上記の設定でクライアントを2つ作成する
+
Dim c1 As New PopClient(profile)
+
Dim c2 As New PopClient(profile)
+

          
+
c1.Connect("pass")
+
c2.Connect("pass")
+
}}
+
#tabpage-end
+

          
+

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

        

        
284,7 225,7
 
|~メソッド|~解説|~対応するPOPコマンド|h
|~メソッド|~解説|~対応するPOPコマンド|h
 
|Connect(string)&br;Connect(ICredentialsByHost)|PopClient.Profileプロパティで指定された内容、および引数で指定されたパスワード(もしくはICredentialsByHost)を使って接続・認証を試みます。&br;接続・認証できた場合は、サーバの能力も取得します。|USER/PASS, STLS, APOP, AUTH, CAPA|
|Connect(string)&br;Connect(ICredentialsByHost)|PopClient.Profileプロパティで指定された内容、および引数で指定されたパスワード(もしくはICredentialsByHost)を使って接続・認証を試みます。&br;接続・認証できた場合は、サーバの能力も取得します。|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|
|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)|BeginConnecto()で開始した非同期接続を完了します。 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()|ログアウトせずに切断します。 削除マークが付けられているメッセージがあっても削除されません。|-|
302,10 243,8
 
:IDisposable.Dispose()|PopClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
:IDisposable.Dispose()|PopClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
 
:Logout(), Disconnect(), IDisposable.Dispose()|これらのメソッドのいずれかを呼び出した後でも、再度PopClient.Connect()を呼び出すことで同じインスタンスを使って再度接続することはできます。
:Logout(), Disconnect(), IDisposable.Dispose()|これらのメソッドのいずれかを呼び出した後でも、再度PopClient.Connect()を呼び出すことで同じインスタンスを使って再度接続することはできます。
 
:Timeout, SendTimeout, ReceiveTimeout|これらのプロパティはそれぞれPopClient.Profile.Timeout, PopClient.Profile.SendTimeout, PopClient.Profile.RecieveTimeoutを設定することと同じですが、接続後はPopClient.Profileの値を変更してもPopClientの動作には反映されません。 接続後はPopClient.Timeout, PopClient.SendTimeout, PopClient.ReceiveTimeoutプロパティを設定してください。
:Timeout, SendTimeout, ReceiveTimeout|これらのプロパティはそれぞれPopClient.Profile.Timeout, PopClient.Profile.SendTimeout, PopClient.Profile.RecieveTimeoutを設定することと同じですが、接続後はPopClient.Profileの値を変更してもPopClientの動作には反映されません。 接続後はPopClient.Timeout, PopClient.SendTimeout, PopClient.ReceiveTimeoutプロパティを設定してください。
+
操作のタイムアウトと中断に関しての注意点は[[#async_operations_cancellation]]を参照してください。
 
:ServerCapabilities|切断されている状態で取得しようとした場合(PopClient.IsConnectedがfalseの場合)、例外をスローします。
:ServerCapabilities|切断されている状態で取得しようとした場合(PopClient.IsConnectedがfalseの場合)、例外をスローします。
 

        

        
+

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

        

        
316,7 255,7
 
:SSL/TLSを使用しない|常にSSL/TLSを使用せずに接続を試みます。 サーバがSTLSをサポートしていてもSSL/TLSへのアップグレードはしません。 デフォルトのポート番号は110です。
:SSL/TLSを使用しない|常にSSL/TLSを使用せずに接続を試みます。 サーバがSTLSをサポートしていてもSSL/TLSへのアップグレードはしません。 デフォルトのポート番号は110です。
 
接続先URL&sub{*1};のスキームに''"pop"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''false''を指定した場合はこの動作になります。
接続先URL&sub{*1};のスキームに''"pop"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''false''を指定した場合はこの動作になります。
 

        

        
~
これら[[接続時のパラメータ>#clientprofile]]は次の箇所で指定します。
これら接続時のパラメータは次の箇所で指定します。
 
:接続先URL&sup{*1};|PopClientクラスのコンストラクタで指定する引数authority
:接続先URL&sup{*1};|PopClientクラスのコンストラクタで指定する引数authority
 
:SecurePortプロパティ&sup{*2};|PopClientクラスのコンストラクタで指定する引数securePort、もしくはPopClient.Profile.SecurePortプロパティ
:SecurePortプロパティ&sup{*2};|PopClientクラスのコンストラクタで指定する引数securePort、もしくはPopClient.Profile.SecurePortプロパティ
 
:UseTlsIfAvailableプロパティ&sup{*3};|PopClient.Profile.UseTlsIfAvailableプロパティ
:UseTlsIfAvailableプロパティ&sup{*3};|PopClient.Profile.UseTlsIfAvailableプロパティ
327,57 266,46
 

        

        
 
|*URLと接続動作の例
|*URLと接続動作の例
 
|~接続先URL|~接続ポート|~SSL/TLS|h
|~接続先URL|~接続ポート|~SSL/TLS|h
~
|``pops://user&#x40;pop.example.net/``|995|SSL/TLSを使用して接続|
|pops://user&#x40;pop.example.net/|995|SSL/TLSを使用|
~
|``pops://user&#x40;pop.example.net:10110/``|10110|~|
|pops://user&#x40;pop.example.net:10110/|10110|SSL/TLSを使用|
~
|``pop://user&#x40;pop.example.net/``|110|SSL/TLSを使用しないで接続&br;もしくは可能なら接続後にSSL/TLSへアップグレード(UseTlsIfAvailable=trueの場合)|
|pop://user&#x40;pop.example.net/|110|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
~
|``pop://user&#x40;pop.example.net:995/``|995|~|
|pop://user&#x40;pop.example.net:995/|995|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 

        

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

        

        
~
認証方式にAPOPを使用する場合は、``"APOP"``ではなく``"+APOP"``を指定してください。 認証方式を指定しない場合、もしくは``"*"``が指定されている場合は次の順で認証を試行します。
認証方式にAPOPを使用する場合は、"APOP"ではなく"+APOP"を指定してください。 認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
 
+AUTHコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
+AUTHコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
 
+APOPコマンド (サーバがサポートしている場合のみ)
+APOPコマンド (サーバがサポートしている場合のみ)
 
+USER/PASSコマンド
+USER/PASSコマンド
 

        

        
~
URLもしくはパラメータでユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。 認証方式にANONYMOUSを指定して認証を行う場合、ユーザ名の部分をログイントークンとして送信します。 ユーザ名が指定されていない場合は``"anonymous@"``をログイントークンとして送信します。 ログイントークンに``@``などの記号を含める場合はURLエスケープする必要があります。
URLもしくはパラメータでユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。 認証方式にANONYMOUSを指定して認証を行う場合、ユーザ名の部分をログイントークンとして送信します。 ユーザ名が指定されていない場合は"anonymous@"をログイントークンとして送信します。 ログイントークンに@などの記号を含める場合はURLエスケープする必要があります。
 

        

        
~
認証方式の大文字小文字の違いは無視します(POP URLの場合は``;AUTH=``の部分も大文字小文字を無視します)。
認証方式の大文字小文字の違いは無視します(POP URLの場合は';AUTH='の部分も大文字小文字を無視します)。
 

        

        
 
例として接続先のURLと認証時の動作を表にまとめると以下のようになります。
例として接続先のURLと認証時の動作を表にまとめると以下のようになります。
 

        

        
 
|*URLと認証動作の例
|*URLと認証動作の例
 
|~接続先URL|~認証に使用するユーザ名|~使用する認証メカニズム|h
|~接続先URL|~認証に使用するユーザ名|~使用する認証メカニズム|h
~
|``pop://user;AUTH=+APOP&#x40;pop.example.net/``|user|APOP|
|pop://user;AUTH=+APOP&#x40;pop.example.net/|user|APOP|
~
|``pop://user;AUTH=DIGEST-MD5&#x40;pop.example.net/``|user|DIGEST-MD5|
|pop://user;AUTH=DIGEST-MD5&#x40;pop.example.net/|user|DIGEST-MD5|
~
|``pop://;AUTH=DIGEST-MD5&#x40;pop.example.net/``|ICredentialsByHostインターフェイスより取得|DIGEST-MD5|
|pop://;AUTH=DIGEST-MD5&#x40;pop.example.net/|ICredentialsByHostインターフェイスより取得|DIGEST-MD5|
~
|``pop://user;AUTH=*&#x40;pop.example.net/``|user|サーバ・クライアントが対応しているものを順に試行|
|pop://user;AUTH=*&#x40;pop.example.net/|user|サーバ・クライアントが対応しているものを順に試行|
~
|``pop://user&#x40;pop.example.net/``|user|サーバ・クライアントが対応しているものを順に試行|
|pop://user&#x40;pop.example.net/|user|サーバ・クライアントが対応しているものを順に試行|
~
|``pop://;AUTH=ANONYMOUS&#x40;pop.example.net/``|匿名ユーザ&br;(ログイントークン: ``anonymous@``)|ANONYMOUS|
|pop://;AUTH=ANONYMOUS&#x40;pop.example.net/|匿名ユーザ&br;(ログイントークン: anonymous@)|ANONYMOUS|
~
|``pop://user&amp;#x40;localhost;AUTH=ANONYMOUS&#x40;pop.example.net/``|匿名ユーザ&br;(ログイントークン: ``user&#x40;localhost``)|ANONYMOUS|
|pop://user&amp;#x40;localhost;AUTH=ANONYMOUS&#x40;pop.example.net/|匿名ユーザ&br;(ログイントークン: user&#x40;localhost)|ANONYMOUS|
~
|``pop://pop.example.net/``|匿名ユーザ&br;(ログイントークン: ``anonymous@``)|ANONYMOUSもしくはUSER/PASSコマンドを使用|
|pop://pop.example.net/|匿名ユーザ&br;(ログイントークン: anonymous@)|ANONYMOUSもしくはUSER/PASSコマンドを使用|
+

          
+
試行する認証メカニズムを制御するには、PopClient.Profile.UsingSaslMechanismsプロパティの値を変更してください。 UsingSaslMechanismsプロパティにANONYMOUSが含まれていても匿名ログインは試行しません。
 

        

        
~
PopClient.Profile.AllowInsecureLoginプロパティにfalseを指定した場合で、かつ現在の接続がSSL/TLSで保護されていない場合、平文およびAPOPによる認証は試行されません(デフォルトはfalseです)。
試行する認証メカニズムを制御するには、PopClient.Profile.UsingSaslMechanismsプロパティの値を変更してください。 UsingSaslMechanismsプロパティにANONYMOUSが含まれていても匿名ログインは試行しません。 PopClient.Profile.AllowInsecureLoginプロパティにfalseを指定した場合で、かつ現在の接続がSSL/TLSで保護されていない場合、平文およびAPOPによる認証は試行されません(デフォルトはfalseです)。
 

        

        
 
|*サーバが対応している認証方式と認証試行順の例
|*サーバが対応している認証方式と認証試行順の例
~
|~サーバが対応している認証方式|~UsingSaslMechanismsの値|>|~認証の試行順序|h
|~サーバが対応している認証方式|~UsingSaslMechanismsの値|~試行順序&br;(接続がSSL/TLSで保護されている、もしくはAllowInsecureLoginがtrueの場合)|~試行順序&br;(接続がSSL/TLSで保護されていない、かつAllowInsecureLoginがfalseの場合)|h
+
|~|~|~接続がSSL/TLSで保護されている&br;もしくはAllowInsecureLoginがtrueの場合|~接続がSSL/TLSで保護されていない&br;かつAllowInsecureLoginがfalseの場合|h
 
|DIGEST-MD5&br;CRAM-MD5&br;APOP&br;USER/PASS|{"DIGEST-MD5", "CRAM-MD5"}|1.DIGEST-MD5&br;2.CRAM-MD5&br;3.APOP&br;4.USER/PASS|1.DIGEST-MD5&br;2.CRAM-MD5|
|DIGEST-MD5&br;CRAM-MD5&br;APOP&br;USER/PASS|{"DIGEST-MD5", "CRAM-MD5"}|1.DIGEST-MD5&br;2.CRAM-MD5&br;3.APOP&br;4.USER/PASS|1.DIGEST-MD5&br;2.CRAM-MD5|
 
|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;APOP&br;USER/PASS|null|1.APOP&br;2.USER/PASS|PopNoAppropriateAuthMechanismExceptionをスロー&br;(試行できる認証方式なし)|
|PLAIN&br;APOP&br;USER/PASS|null|1.APOP&br;2.USER/PASS|PopAuthenticationExceptionをスロー&br;(試行できる認証方式なし)|
 

        

        
 
APOPを使用した認証については脆弱性が指摘されているため、本ライブラリではAPOPは平文による認証と同程度のものとして扱います。 参考:[[情報処理推進機構:情報セキュリティ:脆弱性関連情報取扱い:APOP方式におけるセキュリティ上の弱点(脆弱性)の注意喚起について:http://www.ipa.go.jp/security/vuln/200704_APOP.html]]
APOPを使用した認証については脆弱性が指摘されているため、本ライブラリではAPOPは平文による認証と同程度のものとして扱います。 参考:[[情報処理推進機構:情報セキュリティ:脆弱性関連情報取扱い:APOP方式におけるセキュリティ上の弱点(脆弱性)の注意喚起について:http://www.ipa.go.jp/security/vuln/200704_APOP.html]]
 

        

        
+
各認証方式を個別に無効にする・試行しないようにする場合は、次のように各プロパティの値を設定してください。 PopClient.Profile.AllowInsecureLoginプロパティとは異なり、これらの設定は現在の接続が''SSL/TLSで保護されているかどうかに関わらず''各認証方式を無効にします。
+

          
+
|*認証方式を無効にする設定
+
|~無効にする認証方式|~設定するプロパティ|~設定する値|h
+
|SASL&br;(CRAM-MD5, PLAINなど)|PopClient.Profile.UsingSaslMechanisms|nullあるいは空の配列|
+
|USER/PASS|PopClient.Profile.AllowStandardLogin|false|
+
|APOP|PopClient.Profile.AllowApopLogin|false|
+

          
 
***認証時に参照する資格情報 [#creds]
***認証時に参照する資格情報 [#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);を返すクラスなら何でも設定できます。
 

        

        
582,27 510,22
 
|~メソッド|~解説|~対応するPOPコマンド|h
|~メソッド|~解説|~対応するPOPコマンド|h
 
|{{
|{{
 
OpenRead()
OpenRead()
+
OpenReadAsync()
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を読み込むためのStreamを取得します。|RETRまたはTOP|
}}|メッセージ本文を読み込むためのStreamを取得します。|RETRまたはTOP|
 
|{{
|{{
 
OpenText()
OpenText()
+
OpenTextAsync()
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を読み込むためのStreamReaderを取得します。|RETRまたはTOP|
}}|メッセージ本文を読み込むためのStreamReaderを取得します。|RETRまたはTOP|
 
|{{
|{{
 
ReadAllBytes()
ReadAllBytes()
+
ReadAllBytesAsync()
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文をbyte[]で取得します。|RETRまたはTOP|
}}|メッセージ本文をbyte[]で取得します。|RETRまたはTOP|
 
|{{
|{{
 
ReadAllLines()
ReadAllLines()
+
ReadAllLinesAsync()
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文をstring[]で取得します。|RETRまたはTOP|
}}|メッセージ本文をstring[]で取得します。|RETRまたはTOP|
 
|{{
|{{
 
ReadAllText()
ReadAllText()
+
ReadAllTextAsync()
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文をstringで取得します。|RETRまたはTOP|
}}|メッセージ本文をstringで取得します。|RETRまたはTOP|
 
|{{
|{{
610,10 533,9
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文をIEnumerable<string>で取得します。|RETRまたはTOP|
}}|メッセージ本文をIEnumerable<string>で取得します。|RETRまたはTOP|
 
|{{
|{{
~
ReadAs<TResult>(Converter<Stream, TResult>)
ReadAs<TOutput>(Converter<Stream, TOutput>)
+
ReadAsAsync<TResult>(Converter<Stream, TResult>)
 
およびオーバーロード
およびオーバーロード
~
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TResult>で変換された結果を取得します。|RETRまたはTOP|
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TOutput>で変換された結果を取得します。|RETRまたはTOP|
 
|{{
|{{
 
ReadAs<T, TResult>
ReadAs<T, TResult>
 
(Func<Stream, T, TResult>, T)
(Func<Stream, T, TResult>, T)
626,23 548,19
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたFunc<Stream, T, TResult>~Func<Stream, T1, T2, T3, T4, TResult>で変換された結果を取得します。|RETRまたはTOP|
}}|メッセージ本文を読み込むためのStreamを取得し、指定されたFunc<Stream, T, TResult>~Func<Stream, T1, T2, T3, T4, TResult>で変換された結果を取得します。|RETRまたはTOP|
 
|{{
|{{
~
ReadAs<TResult>(Converter<StreamReader, TResult>)
ReadAs<TOutput>(Converter<StreamReader, TOutput>)
+
ReadAsAsync<TResult>(Converter<StreamReader, TResult>)
 
およびオーバーロード
およびオーバーロード
~
}}|メッセージ本文を読み込むためのStreamReaderを取得し、指定されたConverter<StreamReader, TResult>で変換された結果を取得します。|RETRまたはTOP|
}}|メッセージ本文を読み込むためのStreamReaderを取得し、指定されたConverter<StreamReader, TOutput>で変換された結果を取得します。|RETRまたはTOP|
 
|{{
|{{
 
Save(string)
Save(string)
+
SaveAsync(string)
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を指定されたファイルに保存します。|RETRまたはTOP|
}}|メッセージ本文を指定されたファイルに保存します。|RETRまたはTOP|
 
|{{
|{{
 
WriteTo(Stream)
WriteTo(Stream)
+
WriteToAsync(Stream)
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を指定されたStreamに書き込みます。|RETRまたはTOP|
}}|メッセージ本文を指定されたStreamに書き込みます。|RETRまたはTOP|
 
|{{
|{{
 
WriteTo(BinaryWriter)
WriteTo(BinaryWriter)
+
WriteToAsync(BinaryWriter)
 
およびオーバーロード
およびオーバーロード
 
}}|メッセージ本文を指定されたBinaryWriterに書き込みます。|RETRまたはTOP|
}}|メッセージ本文を指定されたBinaryWriterに書き込みます。|RETRまたはTOP|
 

        

        
665,11 583,11
 
DownloadLastMessageAsStream()
DownloadLastMessageAsStream()
 
}}|(指定された番号の/最初の/最後の)メッセージの本文を読み込むためのStreamを取得します。&br;PopClient.GetMessage()等とPopMessageInfo.OpenRead()の呼び出しの組み合わせと同等です。|RETR|
}}|(指定された番号の/最初の/最後の)メッセージの本文を読み込むためのStreamを取得します。&br;PopClient.GetMessage()等とPopMessageInfo.OpenRead()の呼び出しの組み合わせと同等です。|RETR|
 
|{{
|{{
~
DownloadMessageAs<TResult>(long, Converter<Stream, TResult>)
DownloadMessageAs<TOutput>(long, Converter<Stream, TOutput>)
~
DownloadFirstMessageAs<TResult>(Converter<Stream, TResult>)
DownloadFirstMessageAs<TOutput>(Converter<Stream, TOutput>)
~
DownloadLastMessageAs<TResult>(Converter<Stream, TResult>)
DownloadLastMessageAs<TOutput>(Converter<Stream, TOutput>)
~
DownloadAllMessageAs<TResult>(Converter<Stream, TResult>)
DownloadAllMessageAs<TOutput>(Converter<Stream, TOutput>)
~
}}|(指定された番号の/最初の/最後の/すべての)メッセージの本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TResult>で変換された結果を取得します。&br;PopClient.GetMessage()等とPopMessageInfo.ReadAs<TResult>(Converter<Stream, TResult>)の呼び出しの組み合わせと同等です。|RETR|
}}|(指定された番号の/最初の/最後の/すべての)メッセージの本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TOutput>で変換された結果を取得します。&br;PopClient.GetMessage()等とPopMessageInfo.ReadAs<TOutput>(Converter<Stream, TOutput>)の呼び出しの組み合わせと同等です。|RETR|
 
|{{
|{{
 
DownloadMessageAs<T, TResult>(long, Func<Stream, T, TResult>, T)
DownloadMessageAs<T, TResult>(long, Func<Stream, T, TResult>, T)
 
DownloadFirstMessageAs<T, TResult>(Func<Stream, T, TResult>, T)
DownloadFirstMessageAs<T, TResult>(Func<Stream, T, TResult>, T)
695,8 613,7
 
-PopClient.DeleteAfterRetrieveプロパティにtrueが指定されている場合、メッセージの取得に成功した時点で自動的にMarkAsDeleted()メソッドが呼び出され、メッセージは削除マーク済みにされます。
-PopClient.DeleteAfterRetrieveプロパティにtrueが指定されている場合、メッセージの取得に成功した時点で自動的にMarkAsDeleted()メソッドが呼び出され、メッセージは削除マーク済みにされます。
 
-すべてのメソッドは、既定ではRETRコマンドを用いてメッセージ本文全体を取得します。
-すべてのメソッドは、既定ではRETRコマンドを用いてメッセージ本文全体を取得します。
 
maxLinesを引数に取るバージョンのオーバーロードを使用することで、TOPコマンドを用いてメッセージ本文のうちヘッダ部分とボディ部分の指定した行数のみを取得することもできます。
maxLinesを引数に取るバージョンのオーバーロードを使用することで、TOPコマンドを用いてメッセージ本文のうちヘッダ部分とボディ部分の指定した行数のみを取得することもできます。
~
-すべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、OpenRead()メソッドで取得したStreamを先頭にシークしなおして使用するか、Save()メソッドでファイルに保存するなどしてください。
-すべてのメソッドは、取得したメッセージ本文をキャッシュしません。 ''メソッド呼び出しの度にメッセージ本文のダウンロードを行います。'' 同じメッセージを何度も処理する必要がある場合は、WriteTo()メソッドでMemoryStream等に書き出すか、Save()メソッドでファイルに保存するなどしてください。
+
-OpenReadAsync()など名前がAsyncで終わるメソッドは非同期バージョンのメソッドです。 基本的な動作は同期バージョンと同じです。 非同期バージョンのメソッドを使う際の注意点は[[#async_operations]]を参照してください。
 
-インスタンスを作成したPopClientを切断した後にこれらのメソッド・プロパティを呼び出そうとした場合、PopProtocolViolationExceptionをスローします。
-インスタンスを作成したPopClientを切断した後にこれらのメソッド・プロパティを呼び出そうとした場合、PopProtocolViolationExceptionをスローします。
 
-OpenText(), ReadAllLines()などのメソッドは、既定ではstringへのデコードにISO-8859-1を使用します。
-OpenText(), ReadAllLines()などのメソッドは、既定ではstringへのデコードにISO-8859-1を使用します。
 
Encodingを引数に取るバージョンのオーバーロードを使用することで、指定したエンコーディングでデコードすることもできます。
Encodingを引数に取るバージョンのオーバーロードを使用することで、指定したエンコーディングでデコードすることもできます。
704,7 621,6
 
-DownloadAllMessagesToFiles()メソッドは保存先のディレクトリを作成しません。 指定されたパスのディレクトリが存在しない場合例外をスローするので、あらかじめディレクトリを作成するか、既存のディレクトリを指定してください。
-DownloadAllMessagesToFiles()メソッドは保存先のディレクトリを作成しません。 指定されたパスのディレクトリが存在しない場合例外をスローするので、あらかじめディレクトリを作成するか、既存のディレクトリを指定してください。
 
-DownloadAllMessagesToDirectory()メソッドは、保存先のディレクトリが存在しない場合、ディレクトリを作成してから保存を行います。
-DownloadAllMessagesToDirectory()メソッドは、保存先のディレクトリが存在しない場合、ディレクトリを作成してから保存を行います。
 

        

        
+

          
 
**メールボックスに対する操作
**メールボックスに対する操作
 
以下はメールボックス操作に関するメソッドです。
以下はメールボックス操作に関するメソッドです。
 

        

        
795,13 711,13
 
PopClient.DownloadLastMessageAsStream()
PopClient.DownloadLastMessageAsStream()
 
}}|
}}|
 
|{{
|{{
~
DownloadFirstMessageAs<TResult>
DownloadFirstMessageAs<TOutput>
~
DownloadLastMessageAs<TResult>
DownloadLastMessageAs<TOutput>
~
DownloadAllMessagesAs<TResult>
DownloadAllMessagesAs<TOutput>
~
}}|(最初の/最後の/すべての)メッセージの本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TResult>で変換された結果を取得します。|{{
}}|(最初の/最後の/すべての)メッセージの本文を読み込むためのStreamを取得し、指定されたConverter<Stream, TOutput>で変換された結果を取得します。|{{
~
PopClient.DownloadFirstMessageAs<TResult>()
PopClient.DownloadFirstMessageAs<TOutput>()
~
PopClient.DownloadLastMessageAs<TResult>()
PopClient.DownloadLastMessageAs<TOutput>()
~
PopClient.DownloadAllMessagesAs<TResult>()
PopClient.DownloadAllMessagesAs<TOutput>()
 
}}|
}}|
 
|{{
|{{
 
DownloadFirstMessageAs<T, TResult>
DownloadFirstMessageAs<T, TResult>
828,89 744,6
 
}}|
}}|
 

        

        
 

        

        
+
*非同期操作 [#async_operations]
+
本ライブラリではPopClient.BeginConnect()/EndConnect()、PopClient.ConnectAsync()や、PopMessageInfo.OpenReadAsync()、SaveAsync()など非同期バージョンのメソッドを用意しています。
+

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

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

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

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

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

          
+
#code(cs,メッセージの取得を並列して行う){{
+
var client = new PopClient(...);
+

          
+
var m1 = client.GetMessage(1);
+
var m2 = client.GetMessage(2);
+

          
+
// 2つのメッセージの本文の取得を並列して開始する
+
var t1 = m1.ReadAllBytesAsync();
+
var t2 = m2.ReadAllBytesAsync(); // タスクが進行中の場合は他の処理を開始できず、例外をスローする場合がある
+

          
+
Task.WaitAll(t1, t2);
+
}}
+

          
+
#code(cs,メッセージの取得中に他の処理を行う){{
+
var client = new PopClient(...);
+

          
+
var m1 = client.GetMessage(1);
+
var t1 = m1.ReadAllBytesAsync();
+

          
+
// 本文の取得が開始している状態で別の処理(メッセージの取得)を行う
+
var m2 = client.GetMessage(2); // タスクが進行中の場合は他の処理を開始できず、例外をスローする場合がある
+

          
+
t1.Wait();
+
}}
+

          
+
並列操作を行いたい場合は、PopClientのインスタンスを並列数分だけ用意してください。 例えば、次のような操作は正しく動作します。
+

          
+
#code(cs,別々のクライアントを用意してメッセージ本文の取得を並列して行う){{
+
var client1 = new PopClient(...);
+
var client2 = new PopClient(...);
+

          
+
// 別々のクライアントからメッセージを取得し、そのそれぞれで並列して本文を取得する
+
var m1 = client1.GetMessage(1);
+
var m2 = client2.GetMessage(2);
+

          
+
var t1 = m1.ReadAllBytesAsync();
+
var t2 = m2.ReadAllBytesAsync();
+

          
+
Task.WaitAll(t1, t2);
+
}}
+

          
+

          
+
**非同期操作の中断とタイムアウト [#async_operations_cancellation]
+
非同期バージョンのメソッドでは、&msdn(netfx,type,System.Threading.CancellationToken){CancellationToken};を指定することにより非同期操作を中断することができるものもあります。 ただしCancellationTokenで中断要求を行なった場合でもプロトコル上の制限などにより即座には中断しない場合もあります。 特にメッセージ本文の取得では、一度取得が開始された場合は本文すべての取得が完了するまで中断することができません。
+

          
+
Timeoutプロパティなどの設定によって強制的にタイムアウトさせることでも操作を中断させることができます。 非同期操作の場合も同期操作と同様にTimeoutプロパティなどの設定に従って操作がタイムアウトします。
+

          
+
なお、操作がタイムアウトしてTimeoutExceptionをスローする場合、PopClientは''内部的に接続を切断し''PopClient.IsConnectedプロパティはfalseとなります。 ''タイムアウトした場合は処理を継続できない''ため、再接続する必要があります。 一方CancellationTokenによって中断を行った場合は接続は維持され、以後も処理を継続することができます。
+

          
+

          
+
**非同期操作の進捗通知 [#async_operations_progress]
+
一部の非同期操作メソッドは進捗通知を行わせることができます。 進捗通知は.NET Framework 4.5以降でサポートしていて、&msdn(netfx,type,System.IProgress`1){IProgress<T>};を指定することにより非同期操作の進捗を通知させることができます。 進捗の具体的な取得方法に関しては&msdn(netfx,type,System.Progress`1){Progress<T>クラス};を参照してください。
+

          
+
PopMessageInfoクラスの非同期メソッドでは、IProgress<PopMessageRetrieveProgressInfo>で進捗の通知を行います。 PopMessageRetrieveProgressInfo構造体からは以下の情報を取得できます。
+

          
+
|*PopMessageRetrieveProgressInfo構造体のプロパティ
+
|~プロパティ|~解説|h
+
|RetrievedOctetCount|現在までに取得が完了したメッセージのオクテット数|
+
|RetrievedLineCount|現在までに取得が完了したメッセージの行数|
+
|TotalOctetCount|取得されるメッセージの総オクテット数|
+
|ProgressPercentage|現在までに取得が完了した割合(%)&br;百分率に100を掛けて0〜100までの整数で表した値|
+

          
+

          
+
**スレッドセーフティ
+
現時点では、PopClientクラスおよびPopMessageInfoクラスは完全なスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 非同期操作のメソッドを除いて、同一クライアントから取得した個々のインスタンスは同一スレッド内で使用することを推奨します。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
+

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

          
+

          
 
#hr
#hr
 

        

        
 

        

        
922,14 755,13
 
|~名前空間|~例外クラス|~状況|~スローする可能性のあるメソッド|h
|~名前空間|~例外クラス|~状況|~スローする可能性のあるメソッド|h
 
|Smdn.Net.Pop3.Protocol|PopConnectionException|接続に失敗した場合、送受信中にソケットエラーが発生した場合など|PopClient.Connect()|
|Smdn.Net.Pop3.Protocol|PopConnectionException|接続に失敗した場合、送受信中にソケットエラーが発生した場合など|PopClient.Connect()|
 
|Smdn.Net.Pop3.Protocol|PopUpgradeConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|PopClient.Connect()|
|Smdn.Net.Pop3.Protocol|PopUpgradeConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|PopClient.Connect()|
~
|Smdn.Net.Pop3|PopAuthenticationException|認証に失敗した|PopClient.Connect()|
|Smdn.Net.Pop3|PopAuthenticationException|認証に失敗した&br;試行できる認証メカニズムが無い|PopClient.Connect()|
+
|Smdn.Net.Pop3|PopNoAppropriateAuthMechanismException|現在の設定で試行できる認証メカニズムが無い|PopClient.Connect()|
 
|Smdn.Net.Pop3|PopErrorResponseException|サーバがエラー応答を返した|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
|Smdn.Net.Pop3|PopErrorResponseException|サーバがエラー応答を返した|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
 
|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を持つメッセージが存在しない|PopClient.GetMessage()&br;PopClient.GetMessages()|
|Smdn.Net.Pop3.Client|PopMessageNotFoundException|指定された番号もしくはIDを持つメッセージが存在しない|PopClient.GetMessage()&br;PopClient.GetMessages()|
~
|System|InvalidOperationException|切断された状態(PopClient.IsConnectedがfalse)で操作を行おうとした&br;操作が進行している状態で別の操作を開始しようとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_restrictions]]|
|System|InvalidOperationException|切断された状態(PopClient.IsConnectedがfalse)で操作を行おうとした&br;非同期接続中に新たに接続を開始しようとした|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
~
|System|TimeoutException|PopClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|PopClientおよびPopMessageInfoの各メソッド・プロパティ&br;[[#async_operations_cancellation]]|
|System|TimeoutException|PopClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
 
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|PopClientおよびPopMessageInfoの各メソッド・プロパティ|
 

        

        
 
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
944,7 776,6
 
-----Smdn.Net.Pop3.PopAuthenticationException
-----Smdn.Net.Pop3.PopAuthenticationException
 
----Smdn.Net.Pop3.PopProtocolViolationException
----Smdn.Net.Pop3.PopProtocolViolationException
 
-----Smdn.Net.Pop3.Client.PopMessageDeletedException
-----Smdn.Net.Pop3.Client.PopMessageDeletedException
+
---Smdn.Net.Pop3.PopNoAppropriateAuthMechanismException
 
---Smdn.Net.Pop3.Client.PopMessageNotFoundException
---Smdn.Net.Pop3.Client.PopMessageNotFoundException
 

        

        
 
**ログ [#logging]
**ログ [#logging]
1051,6 882,13
 
}
}
 
}}
}}
 

        

        
-
*非同期操作・スレッドセーフティ
-
現時点で非同期操作をサポートするメソッドは、PopClient.BeginConnect()/EndConnect()のみです。 PopMessageInfo.OpenRead()については、今後のバージョンで非同期操作をサポートする予定ですが、それ以外については予定はありません。
-

          
-
また現時点では、上記の非同期操作用のメソッドを除き、PopClientクラスおよびPopMessageInfoクラスはスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 個々のインスタンスは同一スレッド内で使用してください。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
-

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

          
 

        

        
 
#hr
#hr
 

        

        

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

current previous
20,13 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.03.tar.bz2}
+
---下記ライブラリのソースを同梱しています
+
----[[works/libs/Smdn.Net.Imap4.Client]] 1.03
+
----[[works/libs/Smdn.Net.Pop3.Client]] 1.21
+
----[[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.02.tar.bz2}
--${smdncms:distfilelink,SimpleMailer-1.02.tar.bz2}
 
---下記ライブラリのソースを同梱しています
---下記ライブラリのソースを同梱しています
 
----[[works/libs/Smdn.Net.Imap4.Client]] 1.02
----[[works/libs/Smdn.Net.Imap4.Client]] 1.02
115,11 108,6
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

        

        
 
*変更履歴
*変更履歴
+
**1.03 (2014-05-24)
+
-修正・改善
+
--ビルドターゲットを.NET Framework 4.0から.NET Framework 4.5に変更
+
--メッセージの読み込み処理を非同期化 (現時点では動作に安定しない部分あり)
+

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

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

current previous
21,15 21,8
 
--[[http://svn.smdn.jp/anonsvn/tools/MRAConnector/trunk/]]よりチェックアウトできます
--[[http://svn.smdn.jp/anonsvn/tools/MRAConnector/trunk/]]よりチェックアウトできます
 
-1.0x
-1.0x
 
--パッケージ
--パッケージ
+
---${smdncms:distfilelink,MRAConnector-1.03.zip}
 
---${smdncms:distfilelink,MRAConnector-1.00.zip}
---${smdncms:distfilelink,MRAConnector-1.00.zip}
 
--ソースコード
--ソースコード
+
---${smdncms:distfilelink,MRAConnector-1.03.tar.bz2}
+
----下記ライブラリのソースを同梱しています
+
-----[[works/libs/Smdn.Net.Imap4.Client]] 1.03
+
-----[[works/libs/Smdn.Net.Pop3.Client]] 1.21
+
-----[[works/libs/Smdn.Security.Authentication.Sasl]] 1.00
+
-----[[works/libs/Smdn.Formats.Ini]] 0.22
 
---${smdncms:distfilelink,MRAConnector-1.00.tar.bz2}
---${smdncms:distfilelink,MRAConnector-1.00.tar.bz2}
 
----下記ライブラリのソースを同梱しています
----下記ライブラリのソースを同梱しています
 
-----[[works/libs/Smdn.Net.Imap4.Client]] 1.00
-----[[works/libs/Smdn.Net.Imap4.Client]] 1.00
134,12 127,6
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

        

        
 
*変更履歴
*変更履歴
+
**1.03 (2014-05-24)
+
-機能追加
+
--APOPおよびPOP標準ログインを個別に無効化するためのチェックボックスを追加
+
-修正・改善
+
--設定ファイルの保存・読み込みが正しく動作していなかった不具合を修正
+

          
 
**1.00 (2014-04-23)
**1.00 (2014-04-23)
 
-ライブラリの更新のみ、本体部分は変更なし
-ライブラリの更新のみ、本体部分は変更なし