2011-02-18T01:08:45の更新内容

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

current previous
1,42 0,0
+
${smdncms:title,SimpleMailer}
+
${pragma,parser-options,non-limited-list}
+
*概要
+
IMAP4・POP3対応のメールクライアントです。 実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。
+
-[[works/libs/Smdn.Net.Imap4]]
+
-[[works/libs/Smdn.Net.Pop3]]
+
-[[works/libs/Smdn.Security.Authentication.Sasl]]
+
-[[works/libs/Smdn.Formats.Mime]]
+
-[[works/libs/Smdn.Formats.Ini]]
+

                  
+
姉妹品: [[works/tools/junk/TundereBird]]
+

                  
+
*スクリーンショット
+
&ref(SimpleMailer-win.png);
+

                  
+
*ダウンロード
+
#googleadunit
+
-開発版
+
--[[http://svn.smdn.jp/anonsvn/tools/SimpleMailer/trunk/]]よりチェックアウトできます
+
-0.8x
+
--${smdncms:distfilelink,SimpleMailer-0.80.tar.bz2}
+
---下記ライブラリのソースを同梱しています
+
----[[works/libs/Smdn.Net.Imap4]] 0.80
+
----[[works/libs/Smdn.Net.Pop3]] 1.10
+
----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.32
+
----[[works/libs/Smdn.Formats.Mime]] 0.22
+
----[[works/libs/Smdn.Formats.Ini]] 0.19
+

                  
+
*使い方
+
+SimpleMailer.iniを開いてアカウント情報を記入してから起動してください。
+
+Visual Studioではログ出力により動作が遅くなる場合があります。 遅くなる場合は、SimpleMailer.exe.configを編集してログを出力しないようにしてください。
+

                  
+
*不具合・要望・質問等
+
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
+

                  
+
*変更履歴
+
**0.80 (2011-02-18)
+
-[[works/tools/junk/TundereBird]]よりパッケージを分離
+
-修正・改善
+
--POP
+
---Unique-IDが取得できなかった場合の対処を追加
+

                  

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

current previous
16,16 16,6
 
#googleadunit
#googleadunit
 
-開発版
-開発版
 
--[[http://svn.smdn.jp/anonsvn/tools/MRAConnector/trunk/]]よりチェックアウトできます
--[[http://svn.smdn.jp/anonsvn/tools/MRAConnector/trunk/]]よりチェックアウトできます
+
-0.8x
+
--パッケージ
+
---${smdncms:distfilelink,MRAConnector-0.80.zip}
+
--ソースコード
+
---${smdncms:distfilelink,MRAConnector-0.80.tar.bz2}
+
----下記ライブラリのソースを同梱しています
+
-----[[works/libs/Smdn.Net.Imap4]] 0.80
+
-----[[works/libs/Smdn.Net.Pop3]] 1.10
+
-----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.32
+
-----[[works/libs/Smdn.Formats.Ini]] 0.19
 
-0.3x
-0.3x
 
--パッケージ
--パッケージ
 
---${smdncms:distfilelink,MRAConnector-0.36.zip}
---${smdncms:distfilelink,MRAConnector-0.36.zip}
69,9 59,6
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

                

                
 
*変更履歴
*変更履歴
+
**0.80 (2011-02-18)
+
-ライブラリの更新のみ、本体部分は変更なし
+

                  
 
**0.36 (2011-02-03)
**0.36 (2011-02-03)
 
-ライブラリのインターフェイス変更にあわせて実装を修正
-ライブラリのインターフェイス変更にあわせて実装を修正
 

                

                

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

current previous
2,13 2,15
 
${pragma,parser-options,non-limited-list}
${pragma,parser-options,non-limited-list}
 
*概要
*概要
 
IMAP4・POP3対応のメールクライアントです。 実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。
IMAP4・POP3対応のメールクライアントです。 実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。
~
-[[works/libs/Smdn.Net.Imap4.WebClients]]
-[[works/libs/Smdn.Net.Imap4]]
~
-[[works/libs/Smdn.Net.Pop3.WebClients]]
-[[works/libs/Smdn.Net.Pop3]]
 
-[[works/libs/Smdn.Security.Authentication.Sasl]]
-[[works/libs/Smdn.Security.Authentication.Sasl]]
 
-[[works/libs/Smdn.Formats.Mime]]
-[[works/libs/Smdn.Formats.Mime]]
 
-[[works/libs/Smdn.Formats.Ini]]
-[[works/libs/Smdn.Formats.Ini]]
 

                

                
~
姉妹品: [[works/tools/junk/SimpleMailer]]
以下の2つのサンプルアプリケーションを含んでいます。 機能はほぼ同等です。
-
:TundereBird|Smdn.Net.Imap4.WebClients名前空間およびSmdn.Net.Pop3.WebClients名前空間のクラスを使って実装したサンプル
-
:TungireBird|Smdn.Net.Imap4.Client名前空間およびSmdn.Net.Pop3.Client名前空間のクラスを使って実装したサンプル
 

                

                
 
*スクリーンショット
*スクリーンショット
 
//&ref(tunderebird.png);
//&ref(tunderebird.png);
18,14 20,6
 
#googleadunit
#googleadunit
 
-開発版
-開発版
 
--[[http://svn.smdn.jp/anonsvn/tools/TundereBird/trunk/]]よりチェックアウトできます
--[[http://svn.smdn.jp/anonsvn/tools/TundereBird/trunk/]]よりチェックアウトできます
+
-0.8x
+
--${smdncms:distfilelink,TundereBird-0.80.tar.bz2}
+
---下記ライブラリのソースを同梱しています
+
----[[works/libs/Smdn.Net.Imap4.WebClients]] 0.80
+
----[[works/libs/Smdn.Net.Pop3.WebClients]] 1.10
+
----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.32
+
----[[works/libs/Smdn.Formats.Mime]] 0.22
+
----[[works/libs/Smdn.Formats.Ini]] 0.19
 
-0.3x
-0.3x
 
--${smdncms:distfilelink,TundereBird-0.36.tar.bz2}
--${smdncms:distfilelink,TundereBird-0.36.tar.bz2}
 
---下記ライブラリのソースを同梱しています
---下記ライブラリのソースを同梱しています
170,16 164,13
 
----[[works/libs/Smdn.Formats.Ini]] 0.10
----[[works/libs/Smdn.Formats.Ini]] 0.10
 

                

                
 
*使い方
*使い方
~
+tunderebird.iniを開いてアカウント情報を記入してから起動してください。
+tunderebird.ini/tungirebird.iniを開いてアカウント情報を記入してから起動してください。
~
+Visual Studioではログ出力により動作が遅くなる場合があります。 遅くなる場合は、tunderebird.exe.configを編集してログを出力しないようにしてください。
+Visual Studioではログ出力により動作が遅くなる場合があります。 遅くなる場合は、tunderebird.exe.config/tungirebird.exe.configを編集してログを出力しないようにしてください。
 

                

                
 
*不具合・要望・質問等
*不具合・要望・質問等
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

                

                
 
*変更履歴
*変更履歴
+
**0.80 (2011-02-18)
+
-TungireBirdを[[works/tools/junk/SimpleMailer]]としてパッケージを分離
+

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

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

current previous
7,8 7,6
 
0.20以降はMIT X11ライセンスでのリリースとなります。 0.20より前のバージョンについては特に使用条件を定めていません。
0.20以降はMIT X11ライセンスでのリリースとなります。 0.20より前のバージョンについては特に使用条件を定めていません。
 

                

                
 
**ソースコード
**ソースコード
+
-0.8x
+
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80.tar.bz2}
 
-0.3x
-0.3x
 
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36.tar.bz2}
 
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35.tar.bz2}
31,96 29,105
 
-0.1x
-0.1x
 
--[[works/tools/junk/TundereBird]]に含まれているものを使ってください
--[[works/tools/junk/TundereBird]]に含まれているものを使ってください
 

                

                
+
0.36までは[[works/libs/Smdn.Net.Imap4.WebClients]]のソースコードも含まれています。
+

                  
 
**ビルド済みパッケージ
**ビルド済みパッケージ
+
|*0.80 (2011-02-18)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx2.0.zip,.NET 2.1}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.80-netfx2.0-combined.zip,.NET 2.1}
+
}}|
+

                  
 
|*0.36 (2011-02-03)
|*0.36 (2011-02-03)
 
|~種類|~パッケージ|h
|~種類|~パッケージ|h
~
|~通常版|{{
|~通常版&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx4.0.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx4.0.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx3.5.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx3.5.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx2.0.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx2.0.zip,.NET 2.1}
 
}}|
}}|
~
|~単一アセンブリ版&sub{*1};|{{
|~通常版&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx4.0.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx3.5.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx2.0.zip,.NET 2.1}
-
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx4.0-combined.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx4.0-combined.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx3.5-combined.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx3.5-combined.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx2.0-combined.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.36-netfx2.0-combined.zip,.NET 2.1}
 
}}|
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx4.0-combined.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx3.5-combined.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.36-netfx2.0-combined.zip,.NET 2.1}
-
}}|
 

                

                
 
|*0.35 (2011-01-08)
|*0.35 (2011-01-08)
 
|~種類|~パッケージ|h
|~種類|~パッケージ|h
~
|~通常版|{{
|~通常版&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx4.0.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx4.0.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx3.5.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx3.5.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx2.0.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx2.0.zip,.NET 2.1}
 
}}|
}}|
~
|~単一アセンブリ版&sub{*1};|{{
|~通常版&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx4.0.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx3.5.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx2.0.zip,.NET 2.1}
-
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx4.0-combined.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx4.0-combined.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx3.5-combined.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx3.5-combined.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx2.0-combined.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.35-netfx2.0-combined.zip,.NET 2.1}
 
}}|
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx4.0-combined.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx3.5-combined.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.35-netfx2.0-combined.zip,.NET 2.1}
-
}}|
 

                

                
 
|*0.34 (2010-12-11)
|*0.34 (2010-12-11)
 
|~種類|~パッケージ|h
|~種類|~パッケージ|h
~
|~通常版|{{
|~通常版&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx4.0.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx4.0.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx3.5.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx3.5.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx2.0.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx2.0.zip,.NET 2.1}
 
}}|
}}|
~
|~単一アセンブリ版&sub{*1};|{{
|~通常版&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx4.0.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx3.5.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx2.0.zip,.NET 2.1}
-
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx4.0-combined.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx4.0-combined.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx3.5-combined.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx3.5-combined.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx2.0-combined.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.34-netfx2.0-combined.zip,.NET 2.1}
 
}}|
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx4.0-combined.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx3.5-combined.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.34-netfx2.0-combined.zip,.NET 2.1}
-
}}|
 

                

                
 
|*0.33 (2010-05-15)
|*0.33 (2010-05-15)
 
|~種類|~パッケージ|h
|~種類|~パッケージ|h
~
|~通常版|{{
|~通常版&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx4.0.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx4.0.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx3.5.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx3.5.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx2.0.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx2.0.zip,.NET 2.1}
 
}}|
}}|
~
|~単一アセンブリ版&sub{*1};|{{
|~通常版&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx4.0.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx3.5.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx2.0.zip,.NET 2.1}
-
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClientsなし|{{
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx4.0-combined.zip,.NET 4}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx4.0-combined.zip,.NET 4}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx3.5-combined.zip,.NET 3.5}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx3.5-combined.zip,.NET 3.5}
 
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx2.0-combined.zip,.NET 2.1}
${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.33-netfx2.0-combined.zip,.NET 2.1}
 
}}|
}}|
-
|~単一アセンブリ版&sub{*2};&br;WebClients同梱&sub{*1};|{{
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx4.0-combined.zip,.NET 4}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx3.5-combined.zip,.NET 3.5}
-
${smdncms:distfilelink,../Smdn.Net.Imap4.WebClients-0.33-netfx2.0-combined.zip,.NET 2.1}
-
}}|
-
|>|(2010-12-11: ファイル形式をLZHからZIPに変更しました。 内容に変更はありません。)|
 

                

                
~
:単一アセンブリ版&sup{*1};|すべてのファイルを一つのアセンブリにまとめたものです。 [[works/libs/Smdn.Net.Pop3]]や[[works/libs/Smdn.Formats.Mime]]と組み合わせて使用する場合は、型名が衝突するため通常版を使用してください。 詳しくは[[ドキュメントのアセンブリ構成に関する解説>works/libs/Smdn.Net.Imap4/doc#assemblies]]を参照してください。
:WebClients同梱&sup{*1};|Smdn.Net.Imap4.WebClientsを含むパッケージです。 詳しくは[[ドキュメントのクライアント実装についての解説>works/libs/Smdn.Net.Imap4/doc#clients]]を参照してください。
-
:単一アセンブリ版&sup{*2};|すべてのファイルを一つのアセンブリにまとめたものです。 [[works/libs/Smdn.Net.Pop3]]や[[works/libs/Smdn.Formats.Mime]]と組み合わせて使用する場合は、通常版を使用してください。 詳しくは[[ドキュメントのアセンブリ構成に関する解説>works/libs/Smdn.Net.Imap4/doc#assemblies]]を参照してください。
 
:ビルド設定等|コンパイラにMono gmcs/dmcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
:ビルド設定等|コンパイラにMono gmcs/dmcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
 

                

                
 
*変更履歴
*変更履歴
+
**0.80 (2011-02-18)
+
主にIDLE関連の機能追加と実装の細かい修正等。
+

                  
+
-機能追加
+
--ImapClient
+
---IDLE/NOOPを使って特定メールボックスでの待機を行うメソッドImapOpenedMailboxInfo.Idle(), StartIdle(), StopIdle()を追加
+
---IDLEを使って特定メールボックスでの新着メッセージの待機を行うメソッドImapOpenedMailboxInfo.WaitForMessageArrival(), StartWaitForMessageArrival(), StopWaitForMessageArrival()を追加
+
-修正・改善
+
--IDLE中にMono.Security.Protocol.Tls.TlsExceptionがスローされた場合、無視して処理を継続するように修正 (暫定処置)
+
--コマンドの非同期実行開始時にヌル参照が発生する可能性があったのを修正
+
--Mono 2.6.xでコマンドの非同期実行が不完全に停止する場合がある不具合に対する暫定対処を追加
+
--ソケットエラーによりImapConnectionExceptionをスローする場合、例外メッセージに原因となったSocketErrorを含めるように修正
+
--ImapClient
+
---既に切断された状態でImapOpenedMailboxInfo.IDisposable.Disposeを呼び出しても例外をスローしないように修正
+
---コマンドを送信した結果BYEが返された場合、ImapErrorResponseExceptionではなくImapConnectionExceptionをスローするように変更
+
--WebClients
+
---ソースパッケージを分離、[[works/libs/Smdn.Net.Imap4.WebClients]]として個別にリリース
+

                  
 
**0.36 (2011-02-03)
**0.36 (2011-02-03)
 
主にメールボックス関連の機能の強化、その他実装の細かい修正等。
主にメールボックス関連の機能の強化、その他実装の細かい修正等。
 

                

                

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

current previous
1,7 1,7
 
${smdncms:title,ドキュメント・サンプル}
${smdncms:title,ドキュメント・サンプル}
 
${smdncms:keywords,}
${smdncms:keywords,}
 
${pragma,parser-options,non-limited-list}
${pragma,parser-options,non-limited-list}
~
[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。 ここに記載されているものはversion 0.80時点のもので、記載不備などがあるかもしれません。
[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。 ここに記載されているものはversion 0.36時点のもので、記載不備などがあるかもしれません。
 

                

                
 
サンプルコードは[[このページの最後>#samples]]にあります。 ご質問などありましたら[[掲示板>misc/forum/libs]]へどうぞ。
サンプルコードは[[このページの最後>#samples]]にあります。 ご質問などありましたら[[掲示板>misc/forum/libs]]へどうぞ。
 

                

                
29,141 29,57
 
|Smdn.Net.MessageAccessProtocols.dll|[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]で共通して使用されるクラス群|
|Smdn.Net.MessageAccessProtocols.dll|[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]で共通して使用されるクラス群|
 
|Smdn.Security.Authentication.Sasl.dll|[[works/libs/Smdn.Security.Authentication.Sasl]](SASLクライアントの実装)|
|Smdn.Security.Authentication.Sasl.dll|[[works/libs/Smdn.Security.Authentication.Sasl]](SASLクライアントの実装)|
 
|Smdn.Net.Imap4.dll|IMAP4で使用される基本型等の定義|
|Smdn.Net.Imap4.dll|IMAP4で使用される基本型等の定義|
~
|Smdn.Net.Imap4.Client.dll|ImapClient, ImapSessionを含むIMAP4クライアント実装|
|Smdn.Net.Imap4.Client.dll|[[ImapClient>#ImapClient]], [[ImapSession>#ImapSession]]を含むIMAP4クライアント実装|
-
|Smdn.Net.Imap4.WebClients.dll|[[ImapWebRequest/ImapWebResponse>#ImapWebRequest]]を含むIMAP4クライアント実装|
 

                

                
~
本ライブラリを使用する場合は、上記アセンブリへの参照を追加してください。
本ライブラリを使用する場合は、上記アセンブリへの参照を追加してください(ImapWebRequest/ImapWebResponseを使用しない場合は、Smdn.Net.Imap4.WebClients.dllへの参照は不要です)。
 

                

                
 
**&aname(clients){クライアント実装};
**&aname(clients){クライアント実装};
~
クライアントの実装は次の2種類があります。
クライアントの実装は次の3種類があります。
 
|*クライアント実装の種類と概要
|*クライアント実装の種類と概要
~
|~名前空間|~クラス|~概要|h
|~名前空間|~クラス|~概要|~解説|h
~
|Smdn.Net.Imap4.Client|ImapClient&br;ImapMailboxInfo&br;ImapMessageInfoなど|IMAPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfo, DirectoryInfoクラスに似たインターフェイスで行えるようにしてあります。|
|Smdn.Net.Imap4.Client&br;(Smdn.Net.Imap4.Client.dll)|ImapClient&br;ImapMailboxInfo&br;ImapOpenedMailboxInfo&br;ImapMessageInfo&br;ImapMessageInfoList|IMAPの操作を抽象化したクラスです。 メッセージに対する操作をSystem.IO.FileInfo, DirectoryInfoクラスに似たインターフェイスで行えるようにしてあります。|[[ImapClient>#ImapClient]]|
~
|Smdn.Net.Imap4.Client.Session|ImapSession|IMAPコマンドと1対1に対応するメソッドを持つクラスです。 IMAPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|
|Smdn.Net.Imap4.WebClients&br;(Smdn.Net.Imap4.WebClients.dll)|ImapWebRequest&br;ImapWebResponse|IMAP URL(&urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。 &msdn(netfx,type,System.Net.WebRequest);/&msdn(netfx,type,System.Net.WebResponse);を継承しているので、メッセージのダウンロードにWebClientクラスのメソッドを使うこともできます。&br;&msdn(netfx,type,System.Net.FtpWebRequest);等と同様、WebRequest.Methodプロパティで送信するコマンドを制御できます。|[[ImapWebRequest/ImapWebResponse>#ImapWebRequest]]|
~

                  
|Smdn.Net.Imap4.Client.Session&br;(Smdn.Net.Imap4.Client.dll)|ImapSession|IMAPコマンドと1対1に対応するメソッドを持つクラスです。 IMAPの操作は抽象化していません。 仕様と1対1で対応するような実装にしてあります。 このクラスは上記2種類のクライアント実装で内部的に使用しています。&br;直接使用することもできますが、インターフェイスを変更することがあるので推奨はできません。|-|
+
この他にも、WebRequest/WebResponseの形式でIMAPの操作を行うことができるクライアントを別に用意しています。 詳しくは[[works/libs/Smdn.Net.Imap4.WebClients]]をご覧ください。
 

                

                
 
#hr
#hr
 

                

                
~
*概略
*共通事項
~
ImapClientクラスはIMAPサーバに接続してIMAPの操作を行うためのクラスです。 以下の例はImapClientクラスの基本的な機能を使ってIMAPの操作を行う例です。 ImapClientクラスの詳細については以下で個別に解説していきます。
ここでは各クライアント実装に共通する部分について解説します。 各クライアント実装の詳細については個別の解説を参照してください。
 

                

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

                  
+
using Smdn.Net.Imap4;
+
using Smdn.Net.Imap4.Client;
+

                  
+
class Sample {
+
  public static void Main(string[] args)
+
  {
+
    // ユーザ名'user'、CRAM-MD5による認証でimap.example.netに接続するクライアントを作成
+
    using (ImapClient client = new ImapClient(new Uri("imap://user;AUTH=CRAM-MD5@imap.example.net/"))) {
+
      // パスワード'pass'で接続
+
      client.Connect("pass");
+

                  
+
      // INBOXを開く
+
      using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
        // UIDが1のメッセージを取得
+
        ImapMessageInfo message = inbox.GetMessageByUid(1);
+

                  
+
        // ダウンロードしてファイルsample.emlに保存
+
        message.Save("sample.eml");
+
      }
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

                  
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+

                  
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    ' ユーザ名'user'、CRAM-MD5による認証でimap.example.netに接続クライアントを作成
+
    Using client As New ImapClient(New Uri("imap://user;AUTH=CRAM-MD5@imap.example.net/"))
+
      ' パスワード'pass'で接続
+
      client.Connect("pass")
+

                  
+
      ' INBOXを開く
+
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
+
        ' UIDが1のメッセージを取得
+
        Dim message As ImapMessageInfo = inbox.GetMessageByUid(1)
+

                  
+
        ' ダウンロードしてファイルsample.emlに保存
+
        message.Save("sample.eml")
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

                

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

                  
+
**&aname(login){接続と認証};
 
ここでは接続時と認証時の動作について解説します。
ここでは接続時と認証時の動作について解説します。
 

                

                
~
***接続・切断・サーバ情報に関するメンバ
***&aname(connect){接続};
+
以下は接続・切断・サーバ情報に関するメソッドとプロパティです。
+

                  
+
|*ImapClientクラスのメソッド
+
|~メソッド|~解説|~対応するIMAPコマンド|h
+
|Connect(string)&br;Connect(ICredentialsByHost)|ImapClient.Profileプロパティで指定された内容、および引数で指定されたパスワード(もしくはICredentialsByHost)を使って接続・認証を試みます。&br;接続・認証できた場合は、サーバの能力(サポートしている場合はID・名前空間も)を取得します。|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()で操作を完了する必要があります。|-|
+
|Logout()|ログアウトします。 選択済みメールボックスの削除フラグが設定されているメッセージは削除されます。|CLOSE, LOGOUT|
+
|Disconnect()&br;IDisposable.Dispose()|ログアウトせずに切断します。 削除フラグが設定されているメッセージがあっても削除されません。|-|
+
|Refresh()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。 メールボックスを選択している場合は、メールボックスの状態も更新します。 サーバからメールボックスの状態に関する通知があった場合はイベントを発生させます。|NOOP|
+

                  
+
|*ImapClientクラスのプロパティ
+
|~プロパティ|~解説|h
+
|Profile|接続先のホスト・ポート・ユーザ名などを取得/設定します。 コンストラクタで指定した内容はこのプロパティに反映されます。|
+
|Timeout|コマンド処理のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
+
|SendTimeout|ソケット送信時のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
+
|ReceiveTimeout|ソケット受信時のタイムアウト時間をミリ秒単位で取得/設定します。 Timeout.Infinite(-1)を指定した場合はタイムアウトしません。|
+
|IsConnected|接続中かどうかを表す値を取得します。|
+
|ServerCapabilities|サーバがサポートする機能の一覧(CAPABILITYコマンドの結果)を取得します。|
+
|ServerID|サーバがサポートしている場合、サーバのID(IDコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
+
|ServerNamespace|サーバがサポートしている場合、サーバの名前空間(NAMESPACEコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
+

                  
+
:IDisposable.Dispose()|ImapClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
+
: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プロパティを設定してください。
+
:ServerCapabilities, ServerID, ServerNamespace|切断されている状態で取得しようとした場合(ImapClient.IsConnectedがfalseの場合)、例外をスローします。
+

                  
+
***&aname(connect){接続に関するパラメータと動作};
 
接続時の動作は、接続時のパラメータにより次のように変わります。
接続時の動作は、接続時のパラメータにより次のように変わります。
 

                

                
 
:SSL/TLSを使用する (IMAP over SSL)|常にSSL/TLSを使用して接続を試みます。 デフォルトのポート番号は993です。
:SSL/TLSを使用する (IMAP over SSL)|常にSSL/TLSを使用して接続を試みます。 デフォルトのポート番号は993です。
~
接続先URL&sub{*1};のスキームに''"imaps"''を指定した場合、SecurePortプロパティ&sub{*2};に''true''を指定した場合はこの動作になります。
URLのスキーム&sub{*1};に''"imaps"''を指定した場合、SecurePortプロパティ&sub{*2};に''true''を指定した場合はこの動作になります。
 
:可能ならSSL/TLSを使用する (STARTTLS)|SSL/TLSを使用せず接続を試み、サーバが&urn2url(urn:ietf:rfc:2595){STARTTLS};をサポートしていれば認証を開始する前にSSL/TLSへのアップグレードを試みます。 デフォルトのポート番号は143です。
:可能ならSSL/TLSを使用する (STARTTLS)|SSL/TLSを使用せず接続を試み、サーバが&urn2url(urn:ietf:rfc:2595){STARTTLS};をサポートしていれば認証を開始する前にSSL/TLSへのアップグレードを試みます。 デフォルトのポート番号は143です。
~
接続先URL&sub{*1};のスキームに''"imap"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''true''を指定した場合はこの動作になります。
URLのスキーム&sub{*1};に''"imap"''を指定した場合、SecurePortプロパティ&sub{*2};に''false''を指定した場合で、UseTlsIfAvailableプロパティ&sub{*3};に''true''を指定した場合はこの動作になります。
 
: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''を指定した場合はこの動作になります。
+

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

                

                
~
接続先URLもしくはパラメータでポート番号を明示的に指定しない限り、デフォルトポートへの接続を試みます。 なお、ポート番号の指定ではSSL/TLSを使用するかどうかの動作は変わりません((ポート番号に993を指定してもURLのスキームが"imap"なら、接続時にSSL/TLSは使用しません))。
URLもしくはパラメータでポート番号を明示的に指定しない限り、デフォルトポートへの接続を試みます。 なお、ポート番号の指定ではSSL/TLSを使用するかどうかの動作は変わりません((ポート番号に993を指定してもURLのスキームが"imap"なら、接続時にSSL/TLSは使用しません))。
 

                

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

                

                
 
|*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|SSL/TLSを使用|
|imaps://user@imap.example.net:10143/|10143|SSL/TLSを使用|
 
|imap://user@imap.example.net/|143|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
|imap://user@imap.example.net/|143|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 
|imap://user@imap.example.net:993/|993|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
|imap://user@imap.example.net:993/|993|SSL/TLSを使用しない&br;もしくは可能ならSSL/TLSへアップグレード|
 

                

                
~
***&aname(auth){認証に関するパラメータと動作};
これら接続時のパラメータは次の箇所で指定します。
~
接続にIMAP URLを用いる場合、認証に用いるユーザ名と認証方式はURLから取得します。 パスワードはImapClient.Connect()メソッドに指定する引数credentials(ICredentialsByHostインターフェイス)を参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。 IMAP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、URLからはパスワードを取得しません(指定されていてもパスワードとしては解釈しません)。
:URLのスキーム&sup{*1};|[[ImapClientクラス>#ImapClient.login]]のコンストラクタに指定するURLのスキーム、もしくは[[ImapWebRequestクラス>#ImapWebRequest.login]]に指定するリクエストURL
-
:SecurePortプロパティ&sup{*2};|[[ImapClientクラス>#ImapClient.login]]のコンストラクタで指定する引数securePort、もしくはImapClient.Profile.SecurePortプロパティ
-
:UseTlsIfAvailableプロパティ&sup{*3};|[[ImapClient.Profile.UseTlsIfAvailableプロパティ>#ImapClient.login]]、もしくは[[ImapWebRequest.UseTlsIfAvailableプロパティ>#ImapWebRequest.login]]
-

                  
-
***&aname(auth){認証};
-
接続にIMAP URLを用いる場合、認証に用いるユーザ名と認証方式はURLから取得します。 パスワードはICredentialsByHostインターフェイス&sub{*1};を参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。 IMAP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、URLからはパスワードを取得しません(指定されていてもパスワードとしては解釈しません)。
 

                

                
 
認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
認証方式を指定しない場合、もしくは"*"が指定されている場合は次の順で認証を試行します。
 
+AUTHENTICATEコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
+AUTHENTICATEコマンド (サーバ・クライアントが対応している認証メカニズムを順に試行)
176,7 92,7
 
例として接続先の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|サーバ・クライアントが対応しているものを順に試行|
185,7 101,7
 
|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です)。
試行する認証メカニズムを制御するには、UsingSaslMechanismsプロパティ&sub{*2};の値を変更してください。 UsingSaslMechanismsプロパティにANONYMOUSが含まれていても匿名ログインは試行しません。 AllowInsecureLogin&sub{*3};プロパティにfalseを指定した場合で、かつ現在の接続がSSL/TLSで保護されていない場合、平文による認証は試行されません(デフォルトはfalseです)。
 

                

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

                

                
~
***&aname(creds){認証時に参照する資格情報};
これら認証時のパラメータは次の箇所で指定します。
-
:ICredentialsByHostインターフェイス&sup{*1};|[[ImapClient.Connect()メソッド>#ImapClient.login]]に指定する引数credentials、もしくは[[ImapWebRequest.Credentialsプロパティ>#ImapWebRequest.login]]
-
:UsingSaslMechanismsプロパティ&sup{*2};|[[ImapClient.Profile.UsingSaslMechanismsプロパティ>#ImapClient.login]]、もしくは[[ImapWebRequest.UsingSaslMechanismsプロパティ>#ImapWebRequest.login]]
-
:AllowInsecureLoginプロパティ&sup{*3};|[[ImapClient.Profile.AllowInsecureLoginプロパティ>#ImapClient.login]]、もしくは[[ImapWebRequest.AllowInsecureLoginプロパティ>#ImapWebRequest.login]]
-

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

                

                
~
//現時点ではSecureStringに格納されたパスワードには対応していません。 &msdn(netfx,member,System.Net.NetworkCredential.SecurePassword){NetworkCredential.SecurePasswordプロパティ};にパスワードが設定されていても無視します。
ImapWebRequest.CredentialsプロパティはWebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、設定されるインスタンスはICredentialsByHostも実装している必要があります。
-

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

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

                  
-
具体的な記述例は[[ImapClientでの例>#ImapClient.certs]]および[[ImapWebRequestでの例>#ImapWebRequest.certs]]を参照してください。
-

                  
-
***&aname(sslcallback){SSL/TLS接続のカスタマイズ};
-
(このドキュメントは作成中です)
-
SslStream以外の実装を使いたい場合や、より高度な検証が必要な場合など、SSL/TLS接続時にデフォルトの動作を変更してカスタマイズする場合は、UpgradeConnectionStreamCallbackデリゲートを使用してコールバックメソッドを指定してください。
-
コールバックメソッドはImapClient.Connect()メソッドの引数、またはImapSessionManager.CreateSslStreamCallbackプロパティに指定してください。 実装例はImapConnection.CreateSslStreamメソッドを参照してください。
-

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

                  
-
**&aname(exception){例外};
-
ライブラリからは主に以下の例外をスローします。 InnerExceptionプロパティに原因となった例外を設定した状態でスローする場合もあります。
-
|*ライブラリがスローする例外
-
|~例外クラス|~スローされる状況|h
-
|ImapInvalidOperationException&br;および派生クラス (Smdn.Net.Imap4)|プロトコル上不正な操作を行おうとした場合&br;認証に失敗した場合はImapAuthenticationException&br;サーバに不正な要求を行おうとした場合はImapProtocolViolationException&br;サーバがエラー応答を返した場合はImapErrorResponseException|
-
|ImapConnectionException&br;および派生クラス (Smdn.Net.Imap4.Protocol)|接続に失敗した場合、ソケットエラーが発生した場合など&br;SSL/TLSに起因するエラーの場合はImapSecureConnectionException|
-
|TimeoutException (System)|ソケット送受信中やコマンド処理中にタイムアウトした場合|
-
|InvalidOperationException (System)|現在のクライアントの状態に対して無効な操作を行おうとした場合|
-
|ArgumentException&br;および派生クラス (System)|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|
-
|WebException&br;またはProtocolViolationException (System.Net)|Smdn.Net.Imap4.WebClients名前空間で発生した例外は、これらの例外に変換した上でスローされます|
-

                  
-
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
-

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

                  
-
|*ログ出力に使用するTraceSourceの名前と出力内容
-
|~TraceSourceの名前|~出力内容|h
-
|"Smdn.Net.Imap4.Client"|コマンドの送受信結果とセッション毎の動作ログ|
-
|"IMAP"|送信するコマンドと受信したレスポンスの内容|
-

                  
-
ログ出力先などの設定を行う場合は、以下の例のような&msdn(netfx,id,ms229689){アプリケーション構成ファイル};を作成してください。
-

                  
-
#code(xml,アプリケーション構成ファイルの例){{
-
<?xml version="1.0" encoding="utf-8" ?>
-
<configuration>
-
  <system.diagnostics>
-
    <sources>
-
      <source name="Smdn.Net.Imap4.Client" switchValue="Verbose">
-
        <listeners>
-
          <add name="console" type="System.Diagnostics.ConsoleTraceListener"/>
-
          <remove name="Default"/>
-
        </listeners>
-
      </source>
-
      <source name="IMAP" switchValue="Verbose">
-
        <listeners>
-
          <add name="log" type="System.Diagnostics.TextWriterTraceListener" initializeData="imap.log"/>
-
          <remove name="Default"/>
-
        </listeners>
-
      </source>
-
    </sources>
-
    <switches>
-
      <add name="switch" value="All"/>
-
    </switches>
-
  </system.diagnostics>
-
</configuration>
-
}}
-

                  
-
なお、SSL/TLSを使用しているかどうかに関わらず、ログには''パスワードを含む内容を平文で''出力します。 ログの出力が不要な場合はTRACEを無効にしてリビルドするか、Trace.csなどを削除してください。
-

                  
-
***トレース内容のカスタマイズ
-
トレースにログを出力する際、出力内容はSmdn.Net.MessageAccessProtocols.Diagnosticsの各クラスのインスタンスとしてTraceSource.TraceData()メソッドに渡します。 トレース内容をカスタマイズする場合は、これらのクラスを使うことができます。
-

                  
-
#code(cs,カスタマイズしたトレースリスナを使う例){{
-
using System;
-
using System.Diagnostics;
-
using System.Text;
-

                  
-
using Smdn.Net;
-
using Smdn.Net.MessageAccessProtocols.Diagnostics;
-
using Smdn.Net.Imap4.Protocol.Client;
-

                  
-
public class CustomTraceListener : TraceListener {
-
  public CustomTraceListener(string name)
-
    : base(name)
-
  {
-
  }
-

                  
-
  public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
-
  {
-
    if (data is ReceiveTraceData) {
-
      var received = data as ReceiveTraceData;
-
      var recv = Encoding.ASCII.GetString(received.Data.Array, received.Data.Offset, received.Data.Count);
-

                  
-
      Write("受信内容:\t");
-
      WriteLine(recv);
-
    }
-
    else if (data is SendTraceData) {
-
      var sent = data as SendTraceData;
-
      var snt = Encoding.ASCII.GetString(sent.Data.Array, sent.Data.Offset, sent.Data.Count);
-

                  
-
      Write("送信内容:\t");
-
      WriteLine(snt);
-
    }
-
    else if (data is MessageTraceData) {
-
      WriteLine((data as MessageTraceData).Message);
-
    }
-
    else if (data is ExceptionTraceData) {
-
      WriteLine((data as ExceptionTraceData).Exception);
-
    }
-
    else {
-
      base.TraceData(eventCache, source, eventType, id, data);
-
    }
-
  }
-

                  
-
  public override void Write(string message)
-
  {
-
    // TODO
-
  }
-

                  
-
  public override void WriteLine(string message)
-
  {
-
    // TODO
-
  }
-
}
-

                  
-
public static class Test {
-
  [STAThread]
-
  public static void Main(string[] args) {
-
    // カスタマイズしたトレースリスナを追加
-
    ImapConnection.TraceSource.Listeners.Add(new CustomTraceListener("log"));
-
      :
-
      :
-
  }
-
}
-
}}
-

                  
-
#hr
-

                  
-
*&aname(ImapClient){ImapClientクラス (Smdn.Net.Imap4.Client.dll)};
-
ImapClientクラスおよびSmdn.Net.Imap4.Client名前空間のクラスの使い方。
 

                

                
~
***接続・認証のコードと動作の例
**概説
~
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ssl]]が必要になります。
基本的には、
-
+ImapClientクラスのインスタンスを作成
-
+ImapClient.Connect()メソッドでサーバに接続
-
+ImapClient.GetInbox(), GetMailbox(), CreateMailbox()などのメソッドでImapMailboxクラスのインスタンスを取得
-
+ImapClient.OpenInbox(), OpenMailbox()もしくはImapMailbox.Open()などのメソッドでImapOpenedMailboxInfoクラスのインスタンスを取得
-
+ImapOpenedMailboxInfo.GetMessage(), GetMessages()などのメソッドでImapMessageInfoクラスのインスタンスを取得
-
+ImapMessageInfo.Open*(), Read*(), Save()などのメソッドでメッセージ本文を取得
-

                  
-
の順でサーバ上のメールボックス・メッセージの取得と操作を行います。 以下でImapClientと関連するクラスの使い方について解説します。
-

                  
-
**接続・認証とSSL/TLS
-
***&aname(ImapClient.login){接続と認証};
-
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりIMAP URLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。 ImapClientクラスではIMAP URLは用いず、ホスト・ポート・認証方式・ユーザ名等を個々に指定することもできます。
 

                

                
-
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ImapClient.certs]]が必要になります。
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs,ImapClient){{
#code(cs,ImapClient){{
 
/*
/*
319,14 397,11
 
}}
}}
 
#tabpage-end
#tabpage-end
 

                

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

                  
 
デフォルトでは、接続・認証時にImapConnectionクラス(Smdn.Net.Imap4.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にImapConnectionクラス(Smdn.Net.Imap4.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
 

                

                
 
|*SSL/TLS接続時に参照するメンバ(いずれもクラスプロパティ)
|*SSL/TLS接続時に参照するメンバ(いずれもクラスプロパティ)
~
|~型|~ImapClientクラスが参照するメンバ|h
|~型|~PopClientクラスが参照するメンバ|h
 
|X509Certificate2Collection|ImapConnection.ClientCertificates|
|X509Certificate2Collection|ImapConnection.ClientCertificates|
 
|RemoteCertificateValidationCallback|ImapConnection.ServerCertificateValidationCallback|
|RemoteCertificateValidationCallback|ImapConnection.ServerCertificateValidationCallback|
 
|RemoteCertificateValidationCallback|ImapConnection.ClientCertificateSelectionCallback|
|RemoteCertificateValidationCallback|ImapConnection.ClientCertificateSelectionCallback|
422,137 497,120
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
 

                

                
~
***&aname(sslcallback){SSL/TLS接続のカスタマイズ};
**操作
-
Smdn.Net.Imap4.Client名前空間のクラスを使ったIMAPの操作は、それぞれ以下のクラスのインスタンスを用いて行います。
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
+
SslStream以外の実装を使いたい場合や、より高度な検証が必要な場合など、SSL/TLS接続時にデフォルトの動作を変更してカスタマイズする場合は、UpgradeConnectionStreamCallbackデリゲートを使用してコールバックメソッドを指定してください。
+
コールバックメソッドはImapClient.Connect()メソッドの引数に指定してください。 実装例はImapConnection.CreateSslStreamメソッドを参照してください。
 

                

                
-
:ImapClient|クライアント本体のクラス。
-
:ImapMailboxInfo|単一のメールボックスを表すクラス。
-
:ImapOpenedMailboxInfo|選択済みメールボックスを表すクラス。 ImapMailboxInfoから派生。
-
:ImapMessageInfoBase|単一もしくは複数のメッセージに対する操作を定義したクラス。
-
:ImapMessageInfo|単一のメッセージを表すクラス。 ImapMessageInfoBaseから派生。
-
:ImapMessageInfoList|複数のメッセージを表すクラス。 ImapMessageInfoBaseから派生。 IEnumerable<ImapMessageInfo>を実装。
 

                

                
~
#hr
ImapClient以外のクラスのインスタンスは直接作成することはできません。 ImapClientクラスのメソッドを呼び出すことで取得できます。
 

                

                
-
***接続・切断
-
以下は接続・切断に関するメソッドとプロパティです。
-
(このドキュメントは作成中です)
 

                

                
~
*IMAPの操作
|*ImapClientクラスのメソッド
-
|~メソッド|~解説|~対応するIMAPコマンド|h
-
|Connect(string)&br;Connect(ICredentialsByHost)|ImapClient.Profileプロパティで指定された内容、および引数で指定されたパスワード(もしくはICredentialsByHost)を使って接続・認証を試みます。&br;接続・認証できた場合は、サーバの能力(サポートしている場合はID・名前空間も)を取得します。|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)|BeginConnecto()で開始した非同期接続を完了します。 BeginConnect()を呼び出した場合、EndConnect()で操作を完了する必要があります。|-|
-
|Logout()|ログアウトします。 選択済みメールボックスの削除フラグが設定されているメッセージは削除されます。|CLOSE, LOGOUT|
-
|Disconnect()&br;IDisposable.Dispose()|ログアウトせずに切断します。 削除フラグが設定されているメッセージがあっても削除されません。|-|
-
|Refresh()|自動ログアウトタイマの更新、セッションの接続性確認などに使います。 メールボックスを選択している場合は、メールボックスの状態も更新します。 サーバからメールボックスの状態に関する通知があった場合はイベントを発生させます。|NOOP|
 

                

                
~
**クラスと機能
|*ImapClientクラスのプロパティ
~
Smdn.Net.Imap4.Client名前空間のクラスを使ったIMAPの操作は、それぞれ以下のクラスのインスタンスを用いて行います。
|~プロパティ|~解説|h
-
|Profile|接続先のホスト・ポート・ユーザ名などを取得/設定します。 コンストラクタで指定した内容はこのプロパティに反映されます。|
-
|Timeout|コマンド処理のタイムアウト時間をミリ秒単位で取得/設定します。|
-
|SendTimeout|ソケット送信時のタイムアウト時間をミリ秒単位で取得/設定します。|
-
|ReceiveTimeout|ソケット受信時のタイムアウト時間をミリ秒単位で取得/設定します。|
-
|IsConnected|接続中かどうかを表す値を取得します。|
-
|ServerCapabilities|サーバがサポートする機能の一覧(CAPABILITYコマンドの結果)を取得します。|
-
|ServerID|サーバがサポートしている場合、サーバのID(IDコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
-
|ServerNamespace|サーバがサポートしている場合、サーバの名前空間(NAMESPACEコマンドの結果)を返します。 サポートしていない場合は、空のインスタンスを返します。|
 

                

                
~
|*クラスと機能
:IDisposable.Dispose()|ImapClientクラスはIDisposableインターフェイスを実装しています。 IDisposable.Dispose()を呼び出した場合、削除マークが付けられているメッセージを削除せずに切断します。 usingステートメントを使って記述する場合でメッセージを削除したい場合は、切断する前にLogout()メソッド呼び出すようにしてください。
~
|~クラス|~機能|h
:Logout(), Disconnect(), IDisposable.Dispose()|これらのメソッドのいずれかを呼び出した後でも、再度ImapClient.Connect()を呼び出すことで同じインスタンスを使って再度接続することはできます。
~
|ImapClient|クライアント本体のクラス。|
:Timeout, SendTimeout, ReceiveTimeout|これらのプロパティはそれぞれImapClient.Profile.Timeout, ImapClient.Profile.SendTimeout, ImapClient.Profile.RecieveTimeoutを設定することと同じですが、接続後はImapClient.Profileの値を変更してもImapClientの動作には反映されません。 接続後はImapClient.Timeout, ImapClient.SendTimeout, ImapClient.ReceiveTimeoutプロパティを設定してください。
~
|ImapMailboxInfo|単一のメールボックスを表すクラス。|
:ServerCapabilities, ServerID, ServerNamespace|切断されている状態で取得しようとした場合(ImapClient.IsConnectedがfalseの場合)、例外をスローします。
+
|ImapOpenedMailboxInfo|選択済みメールボックスを表すクラス。 ImapMailboxInfoから派生。|
+
|ImapMessageInfoBase|単一もしくは複数のメッセージに対する共通の操作を定義したクラス。|
+
|ImapMessageInfo|単一のメッセージを表すクラス。 ImapMessageInfoBaseから派生。|
+
|ImapMessageInfoList|複数のメッセージを表すクラス。 ImapMessageInfoBaseから派生。 IEnumerable<ImapMessageInfo>を実装。|
 

                

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

                

                
~
次の例は上記のクラスを使ってメールボックス、メッセージの操作を行う一例です。
|*ImapClientクラスのメソッド
-
|~メソッド|~解説|~対応するIMAPコマンド|h
-
|GetInbox()&br;GetInbox(ImapMailboxListOptions)|INBOXを取得します。|LIST/LSUB|
-
|GetMailbox(string)&br;GetMailbox(string, 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|
-
|CreateMailbox(string)&br;CreateMailbox(string, bool)|指定した名前のメールボックスを作成します。|CREATE, SUBSCRIBE|
-
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

                
~
#tabpage(C#)
|*ImapMailboxInfoクラスのメソッド
~
#code(cs){{
|~メソッド|~解説|~対応するIMAPコマンド|h
~
using System;
|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|現在のメールボックスの下位にあるすべてのメールボックスを取得します。|LIST/LSUB|
-
|GetParent()&br;GetParent(ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。|LIST/LSUB|
-
|GetOrCreateParent()&br;GetOrCreateParent(ImapMailboxListOptions)&br;GetOrCreateParent(bool)&br;GetOrCreateParent(bool, ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。 存在しない場合は作成します。|LIST/LSUB, CREATE, SUBSCRIBE|
-
|GetOrCreateChild(string)&br;GetOrCreateChild(string, ImapMailboxListOptions)&br;GetOrCreateChild(string, bool)&br;GetOrCreateChild(string, bool, ImapMailboxListOptions)|現在のメールボックスの下位にある指定した名前のメールボックスを取得します。 存在しない場合は作成します。 オプションで、メールボックスを作成した場合に購読するかどうか指定できます。|LIST/LSUB, CREATE, SUBSCRIBE|
-
|CreateChild(string)&br;CreateChild(string, bool)|現在のメールボックスの下位に指定した名前でメールボックスを作成します。|CREATE, SUBSCRIBE|
-
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

                
~
using Smdn.Net.Imap4;
:すべてのメソッド|これらのメソッドは、メールボックスを表すImapMailboxInfoクラスのインスタンス、もしくはIEnumerable<ImapMailboxInfo>を返します。
~
using Smdn.Net.Imap4.Client;
:ImapClient.GetMailboxes(), ImapMailboxInfo.GetMailboxes()|これらのメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
-
:メールボックスの取得オプション(ImapMailboxListOptions)|これらのメソッドには、ImapMailboxListOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMailboxListOptionsを指定することで、メールボックスの取得時の動作を変更することができます。 以下の値を組み合わせて指定できます。
-
::SubscribedOnly|存在するメールボックスのうち、購読中のメールボックスのみを取得します。 このオプションを指定しない場合は、購読中かどうかを区別せずに取得します。
-
::TopLevelOnly|存在するメールボックスのうち、直下の階層にあるメールボックスのみを取得します。 このオプションを指定しない場合は、すべての階層にあるメールボックスを取得します。
-
::Remote|存在するメールボックスのうち、リモートサーバ上にあるメールボックスのみを取得します。 このオプションを指定しない場合は、リモートサーバ上のメールボックスかどうか区別せずに取得します。 サーバがMAILBOX REFERRALSに対応している場合のみ有効です。
-
::RequestStatus|メールボックスの取得と同時に、メールボックスのメッセージ数などのステータスも取得します。 このオプションを指定しない場合は、ステータスは取得しません。
-
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 

                

                
~
class Sample {
***メールボックスの選択
~
  public static void Main(string[] args)
以下はメールボックスの選択に関するメソッドです。
~
  {
(このドキュメントは作成中です)
+
    using (ImapClient client = new ImapClient(new Uri("imap://user@localhost/"))) {
+
      client.Connect("pass");
+

                  
+
      // INBOXを開く
+
      using (ImapOpenedMailboxInfo inbox = client.OpenInbox()) {
+
        // Thunderbirdの「後で」フラグ($label5)が付けられているメッセージを取得 (件名を含む静的属性も同時に取得する)
+
        ImapMessageInfoList messages = inbox.GetMessages(ImapSearchCriteria.Keyword("$label5"),
+
                                                         ImapMessageFetchAttributeOptions.StaticAttributes);
+

                  
+
        foreach (ImapMessageInfo message in messages) {
+
          // 取得したメッセージの件名を表示
+
          Console.WriteLine(message.EnvelopeSubject);
+
        }
+

                  
+
        // INBOXの下にあるメールボックス「後で」を取得または作成する
+
        ImapMailboxInfo pendingBox = client.GetOrCreateMailbox("INBOX.後で");
+

                  
+
        // 「後で」フラグが付けられているメッセージを取得したメールボックスに移動する
+
        messages.MoveTo(pendingBox);
+
      }
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

                  
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+

                  
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    Using client As New ImapClient(New Uri("imap://user@localhost/"))
+
      client.Connect("pass")
+

                  
+
      ' INBOXを開く
+
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
+
        ' Thunderbirdの「後で」フラグ($label5)が付けられているメッセージを取得 (件名を含む静的属性も同時に取得する)
+
        Dim messages As ImapMessageInfoList = inbox.GetMessages(ImapSearchCriteria.Keyword("$label5"), _
+
                                                                ImapMessageFetchAttributeOptions.StaticAttributes)
+

                  
+
        For Each message As ImapMessageInfo In messages
+
          ' 取得したメッセージの件名を表示
+
          Console.WriteLine(message.EnvelopeSubject)
+
        Next
+

                  
+
        ' INBOXの下にあるメールボックス「後で」を取得または作成する
+
        Dim pendingBox As ImapMailboxInfo = client.GetOrCreateMailbox("INBOX.後で")
+

                  
+
        ' 「後で」フラグが付けられているメッセージを取得したメールボックスに移動する
+
        messages.MoveTo(pendingBox)
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

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

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

                

                
 
|*ImapClientクラスのメソッド
|*ImapClientクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド|h
|~メソッド|~解説|~対応するIMAPコマンド|h
~
|GetInbox()&br;GetInbox(ImapMailboxListOptions)|INBOXを取得します。|LIST/LSUB|
|{{
~
|GetMailbox(string)&br;GetMailbox(string, ImapMailboxListOptions)|指定した名前のメールボックスを取得します。|LIST/LSUB|
OpenInbox()
~
|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|すべてのメールボックスを取得します。|LIST/LSUB|
OpenInbox(bool)
~
|GetOrCreateMailbox(string)&br;GetOrCreateMailbox(string, ImapMailboxListOptions)&br;GetOrCreateMailbox(string, bool)&br;GetOrCreateMailbox(string, bool, ImapMailboxListOptions)|指定した名前のメールボックスを取得します。 存在しない場合は作成します。 オプションで、メールボックスを作成した場合に購読するかどうか指定できます。|LIST/LSUB, CREATE, SUBSCRIBE|
}}|INBOXを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
~
|CreateMailbox(string)&br;CreateMailbox(string, bool)|指定した名前のメールボックスを作成します。|CREATE, SUBSCRIBE|
|{{
~
|~メソッド|~解説|~対応するIMAPコマンド|f
OpenMailbox(ImapMailboxInfo)
-
OpenMailbox(ImapMailboxInfo, bool)
-
}}|指定したインスタンスが表すメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。&br;別のクライアントから取得したImapMailboxInfoを指定した場合は、ArgumentExceptionをスローします。|SELECT/EXAMINE|
-
|{{
-
OpenMailbox(string)
-
OpenMailbox(string, bool)
-
OpenMailbox(string, ImapMailboxListOptions)
-
OpenMailbox(string, ImapMailboxListOptions, bool)
-
}}|指定した名前のメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
-
|{{
-
OpenOrCreateMailbox(string)
-
OpenOrCreateMailbox(string, bool)
-
OpenOrCreateMailbox(string, ImapMailboxListOptions)
-
OpenOrCreateMailbox(string, bool, bool, ImapMailboxListOptions)
-
}}|指定した名前のメールボックスを開きます。 存在しない場合は作成してから開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE, CREATE, SUBSCRIBE|
 

                

                
 
|*ImapMailboxInfoクラスのメソッド
|*ImapMailboxInfoクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド|h
|~メソッド|~解説|~対応するIMAPコマンド|h
~
|GetMailboxes()&br;GetMailboxes(ImapMailboxListOptions)|現在のメールボックスの下位にあるすべてのメールボックスを取得します。|LIST/LSUB|
|Open()&br;Open(bool)|インスタンスが表すメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
+
|GetParent()&br;GetParent(ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。|LIST/LSUB|
+
|GetOrCreateParent()&br;GetOrCreateParent(ImapMailboxListOptions)&br;GetOrCreateParent(bool)&br;GetOrCreateParent(bool, ImapMailboxListOptions)|現在のメールボックスの上位のメールボックスを取得します。 存在しない場合は作成します。|LIST/LSUB, CREATE, SUBSCRIBE|
+
|GetOrCreateChild(string)&br;GetOrCreateChild(string, ImapMailboxListOptions)&br;GetOrCreateChild(string, bool)&br;GetOrCreateChild(string, bool, ImapMailboxListOptions)|現在のメールボックスの下位にある指定した名前のメールボックスを取得します。 存在しない場合は作成します。 オプションで、メールボックスを作成した場合に購読するかどうか指定できます。|LIST/LSUB, CREATE, SUBSCRIBE|
+
|CreateChild(string)&br;CreateChild(string, bool)|現在のメールボックスの下位に指定した名前でメールボックスを作成します。|CREATE, SUBSCRIBE|
 
|~メソッド|~解説|~対応するIMAPコマンド|f
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

                
~
:すべてのメソッド|これらのメソッドは、メールボックスを表すImapMailboxInfoクラスのインスタンス、もしくはIEnumerable<ImapMailboxInfo>を返します。
|*ImapClientクラスのプロパティ
~
:ImapClient.GetMailboxes(), ImapMailboxInfo.GetMailboxes()|これらのメソッドは、このメソッドは遅延実行を使用して実装されます。 実際に列挙を開始するまで、コマンドの送受信は行われません。
|~プロパティ|~解説|h
~
:メールボックスの取得オプション(ImapMailboxListOptions)|これらのメソッドには、ImapMailboxListOptionsを引数にとるバージョンのオーバーロードを用意してあります。 ImapMailboxListOptionsを指定することで、メールボックスの取得時の動作を変更することができます。 以下の値を組み合わせて指定できます。
|OpenedMailbox|現在開いているメールボックスのインスタンスを取得します。 開いていない場合はnullを返します。|
~
::SubscribedOnly|存在するメールボックスのうち、購読中のメールボックスのみを取得します。 このオプションを指定しない場合は、購読中かどうかを区別せずに取得します。

                  
~
::TopLevelOnly|存在するメールボックスのうち、直下の階層にあるメールボックスのみを取得します。 このオプションを指定しない場合は、すべての階層にあるメールボックスを取得します。
:すべてのメソッド|これらのメソッドは、選択済みメールボックスを表すImapOpenedMailboxInfoクラスのインスタンスを返します。
+
::Remote|存在するメールボックスのうち、リモートサーバ上にあるメールボックスのみを取得します。 このオプションを指定しない場合は、リモートサーバ上のメールボックスかどうか区別せずに取得します。 サーバがMAILBOX REFERRALSに対応している場合のみ有効です。
+
::RequestStatus|メールボックスの取得と同時に、メールボックスのメッセージ数などのステータスも取得します。 このオプションを指定しない場合は、ステータスは取得しません。
+
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 

                

                
 
***メールボックスの操作
***メールボックスの操作
~
以下はメールボックスの削除・作成・リネーム等の操作に関するメソッドです。
以下はメールボックスの操作に関するメソッドとプロパティです。
-
(このドキュメントは作成中です)
 

                

                
 
|*ImapMailboxInfoクラスのメソッド
|*ImapMailboxInfoクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド|h
|~メソッド|~解説|~対応するIMAPコマンド|h
567,9 625,6
 

                

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

                

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

                  
 
|*ImapMailboxInfoクラスのプロパティ
|*ImapMailboxInfoクラスのプロパティ
 
|~プロパティ|~解説|h
|~プロパティ|~解説|h
 
|FullName|階層を含むメールボックスの完全な名前を返します。|
|FullName|階層を含むメールボックスの完全な名前を返します。|
590,46 645,9
 
|NextUid|メールボックスの次のメッセージに付与されるUIDを返します。 UIDが永続的でない場合などは、0を返します。|
|NextUid|メールボックスの次のメッセージに付与されるUIDを返します。 UIDが永続的でない場合などは、0を返します。|
 
|~プロパティ|~解説|f
|~プロパティ|~解説|f
 

                

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

                  
+
|*ImapClientクラスのメソッド
+
|~メソッド|~解説|~対応するIMAPコマンド|h
+
|{{
+
OpenInbox()
+
OpenInbox(bool)
+
}}|INBOXを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
+
|{{
+
OpenMailbox(ImapMailboxInfo)
+
OpenMailbox(ImapMailboxInfo, bool)
+
}}|指定したインスタンスが表すメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。&br;別のクライアントから取得したImapMailboxInfoを指定した場合は、ArgumentExceptionをスローします。|SELECT/EXAMINE|
+
|{{
+
OpenMailbox(string)
+
OpenMailbox(string, bool)
+
OpenMailbox(string, ImapMailboxListOptions)
+
OpenMailbox(string, ImapMailboxListOptions, bool)
+
}}|指定した名前のメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
+
|{{
+
OpenOrCreateMailbox(string)
+
OpenOrCreateMailbox(string, bool)
+
OpenOrCreateMailbox(string, ImapMailboxListOptions)
+
OpenOrCreateMailbox(string, bool, bool, ImapMailboxListOptions)
+
}}|指定した名前のメールボックスを開きます。 存在しない場合は作成してから開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE, CREATE, SUBSCRIBE|
+

                  
+
|*ImapMailboxInfoクラスのメソッド
+
|~メソッド|~解説|~対応するIMAPコマンド|h
+
|Open()&br;Open(bool)|インスタンスが表すメールボックスを開きます。 オプションで読み取り専用で開くかどうかを指定できます。|SELECT/EXAMINE|
+
|~メソッド|~解説|~対応するIMAPコマンド|f
+

                  
+
|*ImapClientクラスのプロパティ
+
|~プロパティ|~解説|h
+
|OpenedMailbox|現在開いているメールボックスのインスタンスを取得します。 開いていない場合はnullを返します。|
+

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

                  
+
**選択済みメールボックスに対する操作
 
***選択済みメールボックスの操作
***選択済みメールボックスの操作
~
以下は選択済みメールボックスの操作に関するメソッドです。
以下は選択済みメールボックスの操作に関するメソッドとプロパティです。
-
(このドキュメントは作成中です)
 

                

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

                

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

                  
 
|*ImapOpenedMailboxInfoクラスのプロパティ
|*ImapOpenedMailboxInfoクラスのプロパティ
 
|~プロパティ|~解説|h
|~プロパティ|~解説|h
 
|IsReadOnly|メールボックスを読み取り専用で選択したかどうかを表す値を返します。|
|IsReadOnly|メールボックスを読み取り専用で選択したかどうかを表す値を返します。|
656,72 671,9
 
|FirstUnseenMessageNumber|メールボックスを選択した時点で最初の未読メッセージの通番を返します。 未読メッセージがない場合は0を返します。|
|FirstUnseenMessageNumber|メールボックスを選択した時点で最初の未読メッセージの通番を返します。 未読メッセージがない場合は0を返します。|
 
|~プロパティ|~解説|f
|~プロパティ|~解説|f
 

                

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

                  
(このドキュメントは作成中です)
+
|*ImapOpenedMailboxInfoクラスのメソッド
+
|~メソッド|~解説|~対応するIMAPコマンド|h
+
|{{
+
Idle(int)
+
Idle(int, int)
+
Idle(TimeSpan)
+
Idle(TimeSpan, TimeSpan)
+
}}|{{
+
アイドル状態に入り、接続状態を維持します。 このメソッドは処理をブロックします。 引数timeoutで指定した時間が経過すると、メソッド呼び出しが終了します。 タイムアウトにTimeout.Infinite(-1)を指定することはできません。
+

                  
+
オプションでNOOPの送信間隔を指定できます(IDLEをサポートしていない場合のみ有効)。
+
}}|NOOP/IDLE|
+
|{{
+
StartIdle()
+
StartIdle(int)
+
StartIdle(TimeSpan)
+
}}|{{
+
アイドル状態に入り、接続状態を維持します。 このメソッドは処理をブロックせず、すぐにメソッド呼び出しが終了します。 StopIdle()メソッドを呼び出すことでアイドル状態から復帰します。
+

                  
+
オプションでNOOPの送信間隔を指定できます(IDLEをサポートしていない場合のみ有効)。
+
}}|NOOP/IDLE|
+
|{{
+
StopIdle()
+
}}|StartIdleで開始したアイドル状態から復帰します。|-|
+
|{{
+
WaitForMessageArrival(int)
+
WaitForMessageArrival(int, int)
+
WaitForMessageArrival(int, ImapMessageFetchAttributeOptions)
+
WaitForMessageArrival(int, ImapMessageFetchAttributeOptions, int)
+
WaitForMessageArrival(TimeSpan)
+
WaitForMessageArrival(TimeSpan, TimeSpan)
+
WaitForMessageArrival(TimeSpan, ImapMessageFetchAttributeOptions)
+
WaitForMessageArrival(TimeSpan, ImapMessageFetchAttributeOptions, TimeSpan)
+
}}|{{
+
アイドル状態に入り、接続状態を維持しつつ、新着メッセージの受信を待機します。 このメソッドは処理をブロックします。 新着メッセージを受信するか、引数timeoutで指定した時間が経過すると、メソッド呼び出しが終了します。 タイムアウトにTimeout.Infinite(-1)を指定することもできます。 新着メッセージの受信により待機を終了した場合は、戻り値のImapMessageInfoListに新着メッセージが含まれます。
+

                  
+
オプションでNOOPの送信間隔を指定できます(IDLEをサポートしていない場合のみ有効)。
+
}}|NOOP/IDLE|
+
|{{
+
StartWaitForMessageArrival()
+
StartWaitForMessageArrival(ImapMessageFetchAttributeOptions)
+
StartWaitForMessageArrival(int)
+
StartWaitForMessageArrival(TimeSpan)
+
StartWaitForMessageArrival(ImapMessageFetchAttributeOptions, int)
+
StartWaitForMessageArrival(ImapMessageFetchAttributeOptions, TimeSpan)
+
}}|{{
+
アイドル状態に入り、接続状態を維持しつつ、新着メッセージの受信を待機します。 このメソッドは処理をブロックせず、すぐにメソッド呼び出しが終了します。 StopWaitForMessageArrival()メソッドを呼び出すことでアイドル状態から復帰します。
+

                  
+
オプションでNOOPの送信間隔を指定できます(IDLEをサポートしていない場合のみ有効)。
+
}}|NOOP/IDLE|
+
|{{
+
StopWaitForMessageArrival()
+
}}|StartWaitForMessageArrivalで開始したアイドル状態から復帰します。 待機中に新着メッセージを受信していた場合は、戻り値のImapMessageInfoListに新着メッセージが含まれます。|-|
+

                  
+
:NOOPの送信間隔 (pollingInterval)|サーバがIDLEをサポートしていない場合、IDLEでの待機の代わりに、引数pollingIntervalで指定された間隔でNOOPを送信します。 指定しなかった場合はデフォルトの動作として10分おきにNOOPを送信します。 IDLEをサポートしている場合は、引数pollingIntervalの指定は動作に影響しません。
+
:メッセージ属性の取得オプション(ImapMessageFetchAttributeOptions)|ImapMessageFetchAttributeOptionsについては、ImapOpenedMailboxInfo.GetMessages()等のメソッドの解説を参照してください。
+
:待機中の操作とイベント|IDLEを開始してから終了するまでの間は、他のコマンドを実行することはできません。 待機中に他の操作を行おうとした場合、例外をスローします。
+
また、待機中でも受信したレスポンスに応じてImapClient.ExistMessageCountChangedなどのイベントが発生します。
+
このため、これらのイベントハンドラで何らかの操作を行うようにしていると、例外がスローされてしまうため注意してください。
+

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

                

                
 
|*ImapOpenedMailboxInfoクラスのメソッド
|*ImapOpenedMailboxInfoクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド|h
|~メソッド|~解説|~対応するIMAPコマンド|h
729,8 681,6
 
|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|
+
|GetMessages(ImapSearchCriteria)&br;GetMessages(ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetMessages(ImapSearchCriteria, Encoding)&br;GetMessages(ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを取得します。 オプションでエンコーディングを指定できます。|SEARCH|
+
|GetSortedMessages(ImapSortCriteria, ImapSearchCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを、指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、失敗します。|SORT|
 
|~メソッド|~解説|~対応するIMAPコマンド|f
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

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

                

                
~
***メッセージの状態の取得
***メッセージの検索
~
以下はメッセージの状態を表すプロパティです。
以下はメッセージの検索に関するメソッドです。
-
(このドキュメントは作成中です)
 

                

                
~
|*ImapMessageInfoクラスのプロパティ
|*ImapOpenedMailboxInfoクラスのメソッド
~
|~プロパティ|~解説|h
|~メソッド|~解説|~対応するIMAPコマンド|h
~
|Uid|メッセージに割り当てられているUIDを返します。|
|GetMessages(ImapSearchCriteria)&br;GetMessages(ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetMessages(ImapSearchCriteria, Encoding)&br;GetMessages(ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを取得します。 オプションでエンコーディングを指定できます。|SEARCH|
~
|Sequence|メッセージに割り当てられている現在の通番を返します。 削除されている場合(IsDeletedがtrueの場合)は0を返します。|
|GetSortedMessages(ImapSortCriteria, ImapSearchCriteria)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, ImapMessageFetchAttributeOptions)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding)&br;GetSortedMessages(ImapSortCriteria, ImapSearchCriteria, Encoding, ImapMessageFetchAttributeOptions)|指定した検索条件にマッチするメッセージを、指定したソート条件でソート済みの状態で取得します。 オプションでエンコーディングを指定できます。&br;サーバがSORTコマンドをサポートしていない場合は、失敗します。|SORT|
~
|UidValidity|メッセージを取得した時点でのメールボックスのUIDVALIDITY値を返します。 UIDが永続的でない場合(ImapOpenedMailboxInfo.IsUidPersistentがfalseの場合)などは、0を返します。|
|~メソッド|~解説|~対応するIMAPコマンド|f
+
|Url|メッセージをIMAP URLを返します。|
+
|Mailbox|メッセージが属するメールボックスを表すインスタンスを返します。|
+
|IsDeleted|メッセージが完全に削除されているかどうかを表す値を返します。|
+
|IsAnswered|メッセージが返信済みかどうかを表す値を返します。 \Answeredフラグが設定されている場合trueを返します。|
+
|IsDraft|メッセージが下書きかどうかを表す値を返します。 \Draftフラグが設定されている場合trueを返します。|
+
|IsFlagged|メッセージが「フラグ済み」かどうかを表す値を返します。 \Flaggedフラグが設定されている場合trueを返します。|
+
|IsMarkedAsDeleted|メッセージが削除予定かどうかを表す値を返します。 \Deletedフラグが設定されている場合trueを返します。|
+
|IsRecent|メッセージが新着かどうかを表す値を返します。 \Recentフラグが設定されている場合trueを返します。|
+
|IsSeen|メッセージが既読かどうかを表す値を返します。 \Seenフラグが設定されている場合trueを返します。|
+
|Flags|メッセージに設定されているフラグ・キーワードの一覧を返します。|
+
|IsMultiPart|メッセージがマルチパート形式のメッセージかどうかを表す値を返します。|
+
|MediaType|メッセージのメディアタイプを返します。|
+
|Length|メッセージのサイズをバイト単位で返します。|
+
|Envelope|メッセージのエンベロープを表すImapEnvelopeのインスタンスを返します。|
+
|EnvelopeDate|メッセージのDateヘッダをパースした値をNullable<DateTimeOffset>で返します。 パースに失敗した場合は、DateTimeOffsetのデフォルト値を返します。 Dateヘッダがない場合などは、nullを返します。|
+
|EnvelopeSubject|メッセージのSubjectヘッダをデコードした値をstringで返します。 デコードに失敗した場合は、デコードされていない状態で返します。 Subjectヘッダがない場合などは、nullを返します。|
+
|InternalDate|メッセージがメールボックスに追加された(受信もしくはアップロードした)日時をDateTimeOffsetで返します。|
+
|BodyStructure|メッセージのBODYSTRUCTUREを表すIImapBodyStructureのインスタンスを返します。|
+
|~プロパティ|~解説|f
+
//|ModSeq||
+

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

                

                
 
***メッセージ本文の取得
***メッセージ本文の取得
 
以下はメッセージ本文の取得に関するメソッドです。
以下はメッセージ本文の取得に関するメソッドです。
-
(このドキュメントは作成中です)
 

                

                
 
|*ImapMessageInfoクラスのメソッド
|*ImapMessageInfoクラスのメソッド
 
|~メソッド|~解説|~対応するPOPコマンド|h
|~メソッド|~解説|~対応するPOPコマンド|h
857,9 784,10
 
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
::Default|オプションのデフォルト値です。 上記オプションのいずれも指定しない場合と同値です。
 

                

                
 
***メッセージの操作
***メッセージの操作
~
以下はメールボックスにあるメッセージの移動・削除・コピー・フラグの変更等の操作に関するメソッドです。
以下はメッセージの操作に関するメソッドです。 これらのメソッドは、ImapMessageInfoBaseクラスから派生したImapMessageInfoクラスおよびImapMessageInfoListクラスで使用できます。
-
(このドキュメントは作成中です)
 

                

                
~
|*ImapMessageInfoクラスおよびImapMessageInfoListクラスのメソッド&br;(ImapMessageInfoBaseクラスから継承)
|*ImapMessageInfoBaseクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド|h
|~メソッド|~解説|~対応するIMAPコマンド|h
 
|AddFlags(IImapMessageFlagSet)&br;AddFlags(ImapMessageFlag, params ImapMessageFlag[])&br;AddKeywords(string, params string[])|1つまたは複数のメッセージに対して、指定したフラグ・キーワードを追加します。|STORE|
|AddFlags(IImapMessageFlagSet)&br;AddFlags(ImapMessageFlag, params ImapMessageFlag[])&br;AddKeywords(string, params string[])|1つまたは複数のメッセージに対して、指定したフラグ・キーワードを追加します。|STORE|
 
|RemoveFlags(IImapMessageFlagSet)&br;RemoveFlags(ImapMessageFlag, params ImapMessageFlag[])&br;RemoveKeywords(string, params string[])|1つまたは複数のメッセージから、指定したフラグ・キーワードを削除します。|STORE|
|RemoveFlags(IImapMessageFlagSet)&br;RemoveFlags(ImapMessageFlag, params ImapMessageFlag[])&br;RemoveKeywords(string, params string[])|1つまたは複数のメッセージから、指定したフラグ・キーワードを削除します。|STORE|
877,19 805,15
 
|CopyTo(string)&br;CopyTo(string, bool)|1つまたは複数のメッセージを、指定した名前のメールボックスにコピーします。 オプションで、メールボックスが存在しない場合に作成するかどうかを指定できます。|COPY|
|CopyTo(string)&br;CopyTo(string, bool)|1つまたは複数のメッセージを、指定した名前のメールボックスにコピーします。 オプションで、メールボックスが存在しない場合に作成するかどうかを指定できます。|COPY|
 
|MoveTo(ImapMailboxInfo)|{{
|MoveTo(ImapMailboxInfo)|{{
 
1つまたは複数のメッセージを、指定したメールボックスに移動します。
1つまたは複数のメッセージを、指定したメールボックスに移動します。
-
サーバがUID EXPUNGEをサポートしていない場合、移動と同時に''既に削除フラグが設定されている他のメッセージも削除されます''。
 
}}|{{
}}|{{
~
COPY, STORE (同一セッションの場合)
COPY, EXPUNGE/UID EXPUNGE (同一セッションの場合)
~
FETCH, APPEND, STORE (異なるセッションの場合)
FETCH, APPEND, EXPUNGE/UID EXPUNGE (異なるセッションの場合)
 
}}|
}}|
~
|MoveTo(string)&br;MoveTo(string, bool)|1つまたは複数のメッセージを、指定した名前のメールボックスに移動します。 オプションで、メールボックスが存在しない場合に作成するかどうかを指定できます。|COPY, STORE|
|MoveTo(string)&br;MoveTo(string, bool)|1つまたは複数のメッセージを、指定した名前のメールボックスに移動します。 オプションで、メールボックスが存在しない場合に作成するかどうかを指定できます。&br;サーバがUID EXPUNGEをサポートしていない場合、移動と同時に''既に削除フラグが設定されている他のメッセージも削除されます''。|COPY, EXPUNGE/UID EXPUNGE|
 
|~メソッド|~解説|~対応するIMAPコマンド|f
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

                
~
|*ImapMessageInfoクラスのメソッド
以下はImapOpenedMailboxInfoクラスのメソッドです。
+
|~メソッド|~解説|~対応するIMAPコマンド|h
+
|Refresh()|メッセージの動的属性を更新します。|FETCH|
+
|ToggleFlags(IImapMessageFlagSet)&br;ToggleFlags(ImapMessageFlag, params ImapMessageFlag[])&br;ToggleKeywords(string, params string[])|メッセージに設定されているフラグ・キーワードを反転します。&br;例として、メッセージに削除フラグが設定されている場合はフラグを削除し、設定されていない場合は追加します。|STORE|
+
|GetStructureOf(string)&br;GetStructureOf<TBodyStructure>(string)&br;GetStructureOf(params int[])&br;GetStructureOf<TBodyStructure>(params int[])|指定したセクションに該当するBODYSTRUCTUREを取得します。&br;文字列"1.2.3"の指定と数値{1,2,3}の指定は等価です。 また、文字列""の指定と数値{}の指定は等価です。|FETCH|
+
|~メソッド|~解説|~対応するIMAPコマンド|f
 

                

                
 
|*ImapOpenedMailboxInfoクラスのメソッド
|*ImapOpenedMailboxInfoクラスのメソッド
 
|~メソッド|~解説|~対応するIMAPコマンド&br;(同一セッションの場合)|~対応するIMAPコマンド&br;(異なるセッションの場合)|h
|~メソッド|~解説|~対応するIMAPコマンド&br;(同一セッションの場合)|~対応するIMAPコマンド&br;(異なるセッションの場合)|h
905,18 829,16
 
}}|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージを指定したメールボックスにコピーします。|SEARCH, COPY|SEARCH, FETCH, APPEND|
}}|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージを指定したメールボックスにコピーします。|SEARCH, COPY|SEARCH, FETCH, APPEND|
 
|{{
|{{
 
MoveMessagesTo(ImapMailboxInfo)
MoveMessagesTo(ImapMailboxInfo)
~
}}|メールボックスにあるすべてのメッセージを、指定したメールボックスに移動します。|COPY, STORE|FETCH, APPEND, STORE|
}}|メールボックスにあるすべてのメッセージを、指定したメールボックスに移動します。&br;サーバがUID EXPUNGEをサポートしていない場合、移動と同時に''既に削除フラグが設定されている他のメッセージも削除されます''。|COPY, EXPUNGE/UID EXPUNGE|FETCH, APPEND, EXPUNGE/UID EXPUNGE|
 
|{{
|{{
 
MoveMessagesTo(ImapMailboxInfo, long, params long[])
MoveMessagesTo(ImapMailboxInfo, long, params long[])
~
}}|メールボックスにあるメッセージのうち、指定したUIDを持つ1つ以上のメッセージを指定したメールボックスに移動します。|COPY, STORE|FETCH, APPEND, STORE|
}}|メールボックスにあるメッセージのうち、指定したUIDを持つ1つ以上のメッセージを指定したメールボックスに移動します。&br;サーバがUID EXPUNGEをサポートしていない場合、移動と同時に''既に削除フラグが設定されている他のメッセージも削除されます''。|COPY, EXPUNGE/UID EXPUNGE|FETCH, APPEND, EXPUNGE/UID EXPUNGE|
 
|{{
|{{
 
MoveMessagesTo(ImapSearchCriteria, ImapMailboxInfo)
MoveMessagesTo(ImapSearchCriteria, ImapMailboxInfo)
 
MoveMessagesTo(ImapSearchCriteria, Encoding, ImapMailboxInfo)
MoveMessagesTo(ImapSearchCriteria, Encoding, ImapMailboxInfo)
~
}}|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージを指定したメールボックスに移動します。|SEARCH, COPY, STORE|SEARCH, FETCH, APPEND, STORE|
}}|メールボックスにあるメッセージのうち、指定した検索条件にマッチするメッセージを指定したメールボックスに移動します。&br;サーバがUID EXPUNGEをサポートしていない場合、移動と同時に''既に削除フラグが設定されている他のメッセージも削除されます''。|SEARCH, COPY, EXPUNGE/UID EXPUNGE|SEARCH, FETCH, APPEND, EXPUNGE/UID EXPUNGE|
 
|~メソッド|~解説|~対応するIMAPコマンド&br;(同一セッションの場合)|~対応するIMAPコマンド&br;(異なるセッションの場合)|f
|~メソッド|~解説|~対応するIMAPコマンド&br;(同一セッションの場合)|~対応するIMAPコマンド&br;(異なるセッションの場合)|f
 

                

                
+
:メッセージの移動|IMAPにはメッセージの移動を行うコマンドが存在しないため、代わりにコピーと削除フラグの設定を行うよう実装しています。 そのため、移動を行っても移動元のメッセージに削除フラグが設定されるのみですぐには削除されません。
+
これらのメッセージはImapOpenedMailboxInfo.Close()メソッドやImapClient.Logout()メソッドを呼び出した時点で完全に削除されますが、すぐに削除したい場合はDelete()メソッドやImapOpenedMailboxInfo.Expunge()メソッドを呼び出すようにしてください。
 
:コピー・移動先のメールボックス|コピー・移動先のメールボックスをImapMailboxInfoで指定する場合、コピー・移動元とコピー・移動先のImapMailboxInfoによって動作が異なります。
:コピー・移動先のメールボックス|コピー・移動先のメールボックスをImapMailboxInfoで指定する場合、コピー・移動元とコピー・移動先のImapMailboxInfoによって動作が異なります。
 
ImapMailboxInfoが同一セッションのものの場合は、サーバ上でコピー・移動が行われます。
ImapMailboxInfoが同一セッションのものの場合は、サーバ上でコピー・移動が行われます。
 
ImapMailboxInfoが異なるセッションのものの場合は、一旦ダウンロードしてから追加先のメールボックスにアップロードします。
ImapMailboxInfoが異なるセッションのものの場合は、一旦ダウンロードしてから追加先のメールボックスにアップロードします。
924,8 846,51
 
また、選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
また、選択できないメールボックス(IsUnselectableがtrue)の場合や、既に削除されているメールボックス(Existがfalse)の場合は、ImapProtocolViolationExceptionをスローします。
 
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
メールボックスが存在しない場合(サーバがTRYCREATEレスポンスコードを返した場合)は、ImapMailboxNotFoundExceptionをスローします。
 

                

                
-
***単一メッセージの操作
-
以下は単一のメッセージの操作に関するメソッドとプロパティです。
-
(このドキュメントは作成中です)
-

                  
-
|*ImapMessageInfoクラスのメソッド
-
|~メソッド|~解説|~対応するIMAPコマンド|h
-
|Refresh()|メッセージの動的属性を更新します。|FETCH|
-
|ToggleFlags(IImapMessageFlagSet)&br;ToggleFlags(ImapMessageFlag, params ImapMessageFlag[])&br;ToggleKeywords(string, params string[])|メッセージに設定されているフラグ・キーワードを反転します。&br;例として、メッセージに削除フラグが設定されている場合はフラグを削除し、設定されていない場合は追加します。|STORE|
-
|GetStructureOf(string)&br;GetStructureOf<TBodyStructure>(string)&br;GetStructureOf(params int[])&br;GetStructureOf<TBodyStructure>(params int[])|指定したセクションに該当するBODYSTRUCTUREを取得します。&br;文字列"1.2.3"の指定と数値{1,2,3}の指定は等価です。 また、文字列""の指定と数値{}の指定は等価です。|FETCH|
-
|~メソッド|~解説|~対応するIMAPコマンド|f
-

                  
-
|*ImapMessageInfoクラスのプロパティ
-
|~プロパティ|~解説|h
-
|Uid|メッセージに割り当てられているUIDを返します。|
-
|Sequence|メッセージに割り当てられている現在の通番を返します。 削除されている場合(IsDeletedがtrueの場合)は0を返します。|
-
|UidValidity|メッセージを取得した時点でのメールボックスのUIDVALIDITY値を返します。 UIDが永続的でない場合(ImapOpenedMailboxInfo.IsUidPersistentがfalseの場合)などは、0を返します。|
-
|Url|メッセージをIMAP URLを返します。|
-
|Mailbox|メッセージが属するメールボックスを表すインスタンスを返します。|
-
|IsDeleted|メッセージが完全に削除されているかどうかを表す値を返します。|
-
|IsAnswered|メッセージが返信済みかどうかを表す値を返します。 \Answeredフラグが設定されている場合trueを返します。|
-
|IsDraft|メッセージが下書きかどうかを表す値を返します。 \Draftフラグが設定されている場合trueを返します。|
-
|IsFlagged|メッセージが「フラグ済み」かどうかを表す値を返します。 \Flaggedフラグが設定されている場合trueを返します。|
-
|IsMarkedAsDeleted|メッセージが削除予定かどうかを表す値を返します。 \Deletedフラグが設定されている場合trueを返します。|
-
|IsRecent|メッセージが新着かどうかを表す値を返します。 \Recentフラグが設定されている場合trueを返します。|
-
|IsSeen|メッセージが既読かどうかを表す値を返します。 \Seenフラグが設定されている場合trueを返します。|
-
|Flags|メッセージに設定されているフラグ・キーワードの一覧を返します。|
-
|IsMultiPart|メッセージがマルチパート形式のメッセージかどうかを表す値を返します。|
-
|MediaType|メッセージのメディアタイプを返します。|
-
|Length|メッセージのサイズをバイト単位で返します。|
-
|Envelope|メッセージのエンベロープを表すImapEnvelopeのインスタンスを返します。|
-
|EnvelopeDate|メッセージのDateヘッダをパースした値をNullable<DateTimeOffset>で返します。 パースに失敗した場合は、DateTimeOffsetのデフォルト値を返します。 Dateヘッダがない場合などは、nullを返します。|
-
|EnvelopeSubject|メッセージのSubjectヘッダをデコードした値をstringで返します。 デコードに失敗した場合は、デコードされていない状態で返します。 Subjectヘッダがない場合などは、nullを返します。|
-
|InternalDate|メッセージがメールボックスに追加された(受信もしくはアップロードした)日時をDateTimeOffsetで返します。|
-
|BodyStructure|メッセージのBODYSTRUCTUREを表すIImapBodyStructureのインスタンスを返します。|
-
|~プロパティ|~解説|f
-
//|ModSeq||
-

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

                  
 
***メッセージのアップロード(メールボックスへの追加)
***メッセージのアップロード(メールボックスへの追加)
~
以下はメールボックスにメッセージをアップロード(追加)するためのメソッドです。
以下はメールボックスにメッセージをアップロードするためのメソッドです。
-
(このドキュメントは作成中です)
 

                

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

                

                
+
**その他のIMAPの操作
 
***サーバからの通知
***サーバからの通知
 
以下はサーバからの通知をハンドリングするためのイベントです。
以下はサーバからの通知をハンドリングするためのイベントです。
-
(このドキュメントは作成中です)
 

                

                
 
|*ImapClientクラスのイベント
|*ImapClientクラスのイベント
 
|~イベント|~解説|h
|~イベント|~解説|h
962,7 927,8
 
|~メソッド|~解説|f
|~メソッド|~解説|f
 

                

                
 
***クォータ
***クォータ
~
以下はクォータの取得に関するメソッドです。
以下はクォータに関するメソッドです。
-
(このドキュメントは作成中です)
 

                

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

                

                
~
**IMAPコマンドの引数およびレスポンスのデータ型
**例外
~
(このドキュメントは作成中です)
ImapClientクラスおよびその他のクラスからは以下の例外をスローします。 ここに明記している以外の例外クラス・状況でスローされる場合があります。
+
-ImapStoreDataItem
+
-ImapSearchCriteria
+
-ImapSortCriteria
+
-IImapBodyStructure
+
-IImapMessageFlagSet
+
-IImapMailboxFlagSet
 

                

                
-
|*スローする例外と状況
-
|~例外クラス|~状況|~スローする可能性のあるメソッド|h
-
|ImapConnectionException|接続に失敗した|ImapClient.Connect()|
-
|ImapUpgradeConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|ImapClient.Connect()|
-
|ImapAuthenticationException|認証に失敗した&br;試行できる認証メカニズムが無い|ImapClient.Connect()|
-
|ImapErrorResponseException|サーバがエラー応答を返した|ImapClientおよび各クラスのメソッド・プロパティ|
-
|ImapProtocolViolationException|プロトコル上不正な操作を行おうとした|ImapClientおよび各クラスのメソッド・プロパティ|
-
|ImapMailboxClosedException|メールボックスが選択されていない、もしくは既に閉じてる状態で操作を行おうとした|ImapOpenedMailboxInfoクラス・ImapMessageInfoクラスの各メソッド・プロパティ|
-
|ImapMessageDeletedException|削除マーク済み(ImapMessageInfo.IsMarkedAsDeletedがtrue)のメッセージに対して操作を行おうとした|ImapMessageInfoクラスの各メソッド・プロパティ|
-
|ImapMailboxNotFoundException|指定された名前のメールボックスが見つからない|ImapClient.GetMailbox()&br;ImapMessageInfo.CopyTo()など|
-
|ImapMessageNotFoundException|指定されたUIDもしくは通番を持つメッセージが存在しない|ImapOpenedMailboxInfo.GetMessageByUid()&br;ImapOpenedMailboxInfo.GetMessageBySequence()|
-
|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;非同期接続中に新たに接続を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ|
-
|TimeoutException (System)|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ|
 

                

                
~
#hr
それぞれの例外クラスの継承関係は次のとおりです。
~

                  
-System.SystemException
~

                  
--Smdn.Net.Imap4.ImapExcetion
~
*例外とトレースログ
---Smdn.Net.Imap4.Protocol.ImapConnectionException
+
**&aname(exception){例外};
+
ライブラリからは主に以下の例外をスローします。 InnerExceptionプロパティに原因となった例外を設定した状態でスローする場合もあります。 また、ここに明記している以外の例外クラス・状況でスローされる場合があります。
+

                  
+
|*スローする例外と状況
+
|~名前空間|~例外クラス|~状況|~スローする可能性のあるメソッド|h
+
|Smdn.Net.Imap4.Protocol|ImapConnectionException|接続に失敗した場合、送受信中にソケットエラーが発生した場合など|ImapClient.Connect()|
+
|Smdn.Net.Imap4.Protocol|ImapSecureConnectionException|SSL/TLSへのアップグレードに失敗した&br;証明書を検証した結果無効と判断した|ImapClient.Connect()|
+
|Smdn.Net.Imap4|ImapAuthenticationException|認証に失敗した&br;試行できる認証メカニズムが無い|ImapClient.Connect()|
+
|Smdn.Net.Imap4|ImapErrorResponseException|サーバがエラー応答を返した|ImapClientおよび各クラスのメソッド・プロパティ|
+
|Smdn.Net.Imap4|ImapProtocolViolationException|プロトコル上不正な操作を行おうとした|ImapClientおよび各クラスのメソッド・プロパティ|
+
|Smdn.Net.Imap4.Client|ImapMailboxClosedException|メールボックスが選択されていない、もしくは既に閉じてる状態で操作を行おうとした|ImapOpenedMailboxInfoクラス・ImapMessageInfoクラスの各メソッド・プロパティ|
+
|Smdn.Net.Imap4.Client|ImapMessageDeletedException|削除マーク済み(ImapMessageInfo.IsMarkedAsDeletedがtrue)のメッセージに対して操作を行おうとした|ImapMessageInfoクラスの各メソッド・プロパティ|
+
|Smdn.Net.Imap4.Client|ImapMailboxNotFoundException|指定された名前のメールボックスが見つからない|ImapClient.GetMailbox()&br;ImapMessageInfo.CopyTo()など|
+
|Smdn.Net.Imap4.Client|ImapMessageNotFoundException|指定されたUIDもしくは通番を持つメッセージが存在しない|ImapOpenedMailboxInfo.GetMessageByUid()&br;ImapOpenedMailboxInfo.GetMessageBySequence()|
+
|System|InvalidOperationException|切断された状態(ImapClient.IsConnectedがfalse)で操作を行おうとした&br;非同期接続中に新たに接続を開始しようとした|ImapClientおよび各クラスのメソッド・プロパティ|
+
|System|TimeoutException|ImapClient.Timeout, SendTimeout, ReceiveTimeoutプロパティで指定されている時間内に操作が完了しなかった|ImapClientおよび各クラスのメソッド・プロパティ|
+
|System|ArgumentException&br;および派生クラス|nullや値域外の値など、メソッド呼び出し時の引数が不正な場合|ImapClientおよび各クラスのメソッド・プロパティ|
+

                  
+
サーバ/クライアントのバグなどにより上記以外の例外がスローされる可能性もあります。 [[ログ出力>#logging]]を有効にしている場合、発生した例外はログに記録されます。
+

                  
+
それぞれの例外クラスの継承関係は次のとおりです。
+
-System.SystemException
+
--Smdn.Net.Imap4.ImapExcetion
+
---Smdn.Net.Imap4.Protocol.ImapConnectionException
 
----Smdn.Net.Imap4.Protocol.ImapUpgradeConnectionException
----Smdn.Net.Imap4.Protocol.ImapUpgradeConnectionException
 
-----Smdn.Net.Imap4.Protocol.ImapSecureConnectionException
-----Smdn.Net.Imap4.Protocol.ImapSecureConnectionException
 
---Smdn.Net.Imap4.ImapInvalidOperationException
---Smdn.Net.Imap4.ImapInvalidOperationException
1024,126 973,547
 
---Smdn.Net.Imap4.Client.ImapMailboxNotFoundException
---Smdn.Net.Imap4.Client.ImapMailboxNotFoundException
 
---Smdn.Net.Imap4.Client.ImapMessageNotFoundException
---Smdn.Net.Imap4.Client.ImapMessageNotFoundException
 

                

                
~
**&aname(logging){ログ};
**非同期操作・スレッドセーフティ
~
シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。 ログ出力に使用する&msdn(netfx,type,System.Diagnostics.TraceSource){TraceSource};の名前と、出力内容は次のとおりです。
現時点で非同期操作をサポートするメソッドは、ImapClient.BeginConnect()/EndConnect()のみです。
-

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

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

                  
-
#hr
-

                  
-
*&aname(ImapWebRequest){ImapWebRequest/ImapWebResponseクラス (Smdn.Net.Imap4.WebClients.dll)};
-
ここではImapWebRequest/ImapWebResponseクラスおよびSmdn.Net.Imap4.WebClients名前空間のクラスの詳細と使い方を紹介します。
-

                  
-
**概説
-
基本的にはHttpWebRequest/ResponseやFtpWebRequest/Responseを用いた操作と同様で、
-
+リクエストURLを指定して&msdn(netfx,method,System.Net.WebRequest.Create){WebRequest.Createメソッド};でImapWebRequestのインスタンスを作成
-
+Method、Credentialsなどのプロパティを指定
-
+ImapWebRequest.GetResponseでリクエストを実行、レスポンスを取得
-
+取得したImapWebResponseインスタンスを参照、必要に応じてImapWebResponse.GetResponseStreamメソッドを呼び出す
-

                  
-
の順でIMAPコマンドを実行、レスポンスを取得します。 以下でImapWebRequest/ImapWebResponseクラスに固有な部分について解説します。
-

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

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

                  
-
#tabpage(C#)
-
#code(cs,記述例){{
-
using System;
-
using System.Net;
-
using Smdn.Net.Imap4;
-
using Smdn.Net.Imap4.WebClients;
-

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

                  
-
// ImapWebRequestインスタンスの作成
-
var request = WebRequest.Create("imap://user@imap.example.net/");
-
  :
-
  :
-
}}
-
#tabpage(VB)
-
#code(vb,記述例){{
-
Imports System
-
Imports System.Net
-
Imports Smdn.Net.Imap4
-
Imports Smdn.Net.Imap4.WebClients
-

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

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

                  
-
**リクエストURLと接続・認証時の動作
-
***&aname(ImapWebRequest.login){接続と認証};
-
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりリクエストURLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。
-

                  
-
リクエストURLで記述されない接続・認証時の動作は、ImapWebRequestクラスのプロパティで指定できます(([[ImapWebRequestのプロパティ>#ImapWebRequest.properties]]も合わせて参照してください))。
-
|*接続・認証時の動作を指定するImapWebRequestクラスのプロパティ
-
|~プロパティ|~解説|h
-
|Credentials|認証時に使用する資格情報(パスワード等)を指定します|
-
|UseTlsIfAvailable|認証を開始する前に、可能ならSSL/TLSへアップグレードするかどうかを指定します|
-
|UsingSaslMechanisms|認証時に試行する認証メカニズムを指定します|
-
|AllowInsecureLogin|接続がSSL/TLSで保護されていない場合でも、平文による認証を許可するかどうか指定します|
-

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

                  
-
#tabpage(C#)
-
#code(cs,記述例){{
-
// imapおよびimapsスキームの登録
-
ImapWebRequestCreator.RegisterPrefix();
-

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

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

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

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

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

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

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

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

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

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

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

                  
-
request6.Credentials = new NetworkCredential("user", "pass");
-
}}
-
#tabpage(VB)
-
#code(vb,記述例){{
-
' imapおよびimapsスキームの登録
-
ImapWebRequestCreator.RegisterPrefix()
-

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

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

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

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

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

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

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

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

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

                

                
~
|*ログ出力に使用するTraceSourceの名前と出力内容
request5.UseTlsIfAvailable = True
~
|~TraceSourceの名前|~出力内容|h
request5.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
~
|"Smdn.Net.Imap4.Client"|コマンドの送受信結果とセッション毎の動作ログ|
request5.AllowInsecureLogin = False
~
|"IMAP"|送信するコマンドと受信したレスポンスの内容|
request5.Credentials = New NetworkCredential("user", "pass")
 

                

                
~
ログ出力先などの設定を行う場合は、以下の例のような&msdn(netfx,id,ms229689){アプリケーション構成ファイル};を作成してください。
'
-
' GMailのアカウント"user"にIMAPで接続。 パスワードは"pass"を使用。
-
'
-
Dim request6 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imaps://user@imap.gmail.com/")), ImapWebRequest)
 

                

                
~
#code(xml,アプリケーション構成ファイルの例){{
request6.Credentials = New NetworkCredential("user", "pass")
+
<?xml version="1.0" encoding="utf-8" ?>
+
<configuration>
+
  <system.diagnostics>
+
    <sources>
+
      <source name="Smdn.Net.Imap4.Client" switchValue="Verbose">
+
        <listeners>
+
          <add name="console" type="System.Diagnostics.ConsoleTraceListener"/>
+
          <remove name="Default"/>
+
        </listeners>
+
      </source>
+
      <source name="IMAP" switchValue="Verbose">
+
        <listeners>
+
          <add name="log" type="System.Diagnostics.TextWriterTraceListener" initializeData="imap.log"/>
+
          <remove name="Default"/>
+
        </listeners>
+
      </source>
+
    </sources>
+
    <switches>
+
      <add name="switch" value="All"/>
+
    </switches>
+
  </system.diagnostics>
+
</configuration>
 
}}
}}
-
#tabpage-end
 

                

                
~
なお、SSL/TLSを使用しているかどうかに関わらず、ログには''パスワードを含む内容を平文で''出力します。 ログの出力が不要な場合はTRACEを無効にしてリビルドするか、ソースファイルTrace.csなどを削除してください。
***&aname(ImapWebRequest.certs){証明書の選択と検証};
-
デフォルトでは、接続・認証時にImapSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
-

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

                

                
~
***トレース内容のカスタマイズ
以下は証明書の検証を行う簡単な例です。
+
トレースにログを出力する際、出力内容はSmdn.Net.MessageAccessProtocols.Diagnosticsの各クラスのインスタンスとしてTraceSource.TraceData()メソッドに渡します。 トレース内容をカスタマイズする場合は、これらのクラスを使うことができます。
 

                

                
~
#code(cs,カスタマイズしたトレースリスナを使う例){{
#tabpage(C#)
-
#code(cs,証明書の検証を行う例){{
 
using System;
using System;
~
using System.Diagnostics;
using System.Net;
~
using System.Text;
using System.Net.Security;
-
using System.Security.Cryptography.X509Certificates;
-
using Smdn.Net.Imap4;
-
using Smdn.Net.Imap4.WebClients;
-

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

                

                
~
using Smdn.Net;
    // 証明書の検証を行うコールバックメソッドを指定
~
using Smdn.Net.MessageAccessProtocols.Diagnostics;
    ImapSessionManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
+
using Smdn.Net.Imap4.Protocol.Client;
 

                

                
~
public class CustomTraceListener : TraceListener {
    using (var client = new WebClient()) {
~
  public CustomTraceListener(string name)
      client.Credentials = new NetworkCredential("user", "pass");
~
    : base(name)
      client.DownloadFile("imaps://user@localhost/INBOX/;UID=1", "sample.eml");
~
  {
    }
 
  }
  }
 

                

                
~
  public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
  private static bool ValidateRemoteCertificate(object sender,
-
                                                X509Certificate certificate,
-
                                                X509Chain chain,
-
                                                SslPolicyErrors sslPolicyErrors)
 
  {
  {
~
    if (data is ReceiveTraceData) {
#if DEBUG
~
      var received = data as ReceiveTraceData;
    // デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
~
      var recv = Encoding.ASCII.GetString(received.Data.Array, received.Data.Offset, received.Data.Count);
    if ((int)(sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0)
-
      sslPolicyErrors &= ~SslPolicyErrors.RemoteCertificateNameMismatch;
-
#endif
 

                

                
~
      Write("受信内容:\t");
    if (sslPolicyErrors == SslPolicyErrors.None) {
~
      WriteLine(recv);
      return true;
-
    }
-
    else {
-
      // エラーがあれば標準エラーに表示
-
      Console.Error.WriteLine(sslPolicyErrors);
-
      return false;
 
    }
    }
~
    else if (data is SendTraceData) {
  }
~
      var sent = data as SendTraceData;
}
~
      var snt = Encoding.ASCII.GetString(sent.Data.Array, sent.Data.Offset, sent.Data.Count);
}}
-
#tabpage(VB)
-
#code(vb,証明書の検証を行う例){{
-
Imports System
-
Imports System.Net
-
Imports System.Net.Security
-
Imports System.Security.Cryptography.X509Certificates
-
Imports Smdn.Net.Imap4
-
Imports Smdn.Net.Imap4.WebClients
-

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

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

                  
-
    Using client As New WebClient()
-
      client.Credentials = New NetworkCredential("user", "pass")
-
      client.DownloadFile("imaps://user@localhost/INBOX/;UID=1", "sample.eml")
-
    End Using
-
  End Sub
-

                  
-
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
-
                                                    ByVal certificate As X509Certificate, _
-
                                                    ByVal chain As X509Chain, _
-
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
-
#If DEBUG Then
-
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
-
    If CInt(sslPolicyErrors & sslPolicyErrors.RemoteCertificateNameMismatch) <> 0 Then
-
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
-
    End If
-
#End If
-

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

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

                  
-
**リクエストURLとリクエスト・レスポンスの動作
-
HTTPと異なり、IMAP URLではリクエストURLの形式によりリクエストの対象が変わります。
-
|*リクエストURLの形式とリクエストの対象
-
|~リクエストURLの形式|~リクエストの対象|h
-
|imap://imap.example.net/|URLで指定されたサーバ・アカウント|
-
|imap://imap.example.net/mailbox|URLで指定されたメールボックス|
-
|imap://imap.example.net/mailbox?...|URLで指定されたメールボックスにあるメッセージのうち、検索クエリに該当する全てのメッセージ|
-
|imap://imap.example.net/mailbox/;UID=1|URLで指定されたメールボックスにあるメッセージのうち、UIDに該当する特定のメッセージ|
-

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

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

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

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

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

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

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

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

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

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

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

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

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

                  
-
***リクエスト対象に制限されないリクエスト
-
リクエストURLの形式によらず使用可能なコマンドのリクエストとレスポンスの動作は次のとおりです。
-

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

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

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

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

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

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

                  
-
以下のプロパティは、未テスト・不完全な実装に関連するプロパティです。 使用はできますが、今後廃止する可能性もあるので、現時点では使用を推奨できません。
-
|*ImapWebRequestクラスのプロパティ
-
|~プロパティ|~デフォルト|~対象となるコマンド|~解説|h
-
|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。 (この機能は現在動作しません。 trueにした場合、NotImplementedExceptionがスローされます)|
-

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

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

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

                  
-
***リクエストとIMAP URLに関するその他の留意事項
-
-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。 現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。
-

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

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

                  
-
記述内容については&msdn(netfx,id,dacty7ed){ネットワーク設定スキーマ};および&msdn(netfx,id,0hyxd0xc){構成セクション スキーマ};も合わせて参照してください。
-

                  
-
**例外
-
ImapWebRequestからは&msdn(netfx,type,System.Net.WebException);または&msdn(netfx,type,System.Net.ProtocolViolationException);をスローします。 WebExceptionをスローする場合は、エラーの状況によりWebException.StatusプロパティとInnerExceptionプロパティに値が設定されます。 また、サーバがエラー応答を返した場合は、Responseプロパティも設定されます。
-
InnerExceptionプロパティに設定される例外クラスについては、[[例外>#exception]]を参照してください。
-

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

                  
-
#hr
-

                  
-
*&aname(samples){サンプルコード};
-
各クライアント実装を用いたサンプルコードを例示します。 証明書の検証を省略している箇所がありますが、実際に使用するコードでは必ず適切な検証を行うように書き換えてください。
-

                  
-
**ImapClient
-
***&aname(ImapClient.sample1){メッセージをダウンロードしてファイルに保存する};
-
#tabpage(C#)
-
#code(cs){{
-
using System;
 

                

                
~
      Write("送信内容:\t");
using Smdn.Net.Imap4;
~
      WriteLine(snt);
using Smdn.Net.Imap4.Client;
+
    }
+
    else if (data is MessageTraceData) {
+
      WriteLine((data as MessageTraceData).Message);
+
    }
+
    else if (data is ExceptionTraceData) {
+
      WriteLine((data as ExceptionTraceData).Exception);
+
    }
+
    else {
+
      base.TraceData(eventCache, source, eventType, id, data);
+
    }
+
  }
 

                

                
~
  public override void Write(string message)
class Sample {
-
  public static void Main(string[] args)
 
  {
  {
~
    // TODO
    using (var client = new ImapClient(new Uri("imap://user;AUTH=DIGEST-MD5@localhost/"))) {
~
  }
      client.Connect("pass");
 

                

                
~
  public override void WriteLine(string message)
      // INBOXを開く
~
  {
      using (var inbox = client.OpenInbox()) {
~
    // TODO
        // UIDが1のメッセージを取得
~
  }
        var message = inbox.GetMessageByUid(1);
+
}
 

                

                
~
public static class Test {
        // ファイルsample.emlに保存
~
  [STAThread]
        message.Save("sample.eml");
~
  public static void Main(string[] args) {
      }
~
    // カスタマイズしたトレースリスナを追加
    }
+
    ImapConnection.TraceSource.Listeners.Add(new CustomTraceListener("log"));
+
      :
+
      :
 
  }
  }
 
}
}
 
}}
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
 

                

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

                

                
~
また現時点では、上記の非同期操作用のメソッドを除き、ImapClientなどのクラスはスレッドセーフではありません。 内部で使用している実装はスレッドセーフなので、処理内容によっては問題なく動作するかもしれませんが、保証はできません。 個々のインスタンスは同一スレッド内で使用してください。 今後のバージョンでスレッドセーフティを保証した実装に改善する予定です。
Class Sample
-
  Public Shared Sub Main(ByVal args As String())
-
    Using client As New ImapClient(New Uri("imap://user;AUTH=DIGEST-MD5@localhost/"))
-
      client.Connect("pass")
 

                

                
~
なお、アプリケーションドメインをまたがる使用については全く考慮していないため、動作および安全性の保証はできません。
      ' INBOXを開く
-
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
-
        ' UIDが1のメッセージを取得
-
        Dim message As ImapMessageInfo = inbox.GetMessageByUid(1)
 

                

                
-
        ' ファイルsample.emlに保存
-
        message.Save("sample.eml")
-
      End Using
-
    End Using
-
  End Sub
-
End Class
-
}}
-
#tabpage-end
 

                

                
~
#hr
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample1]]
+

                  
+

                  
+
*&aname(samples){サンプルコード};
+
各クライアント実装を用いたサンプルコードを例示します。 証明書の検証を省略している箇所がありますが、実際に使用するコードでは必ず適切な検証を行うように書き換えてください。
 

                

                
~
**ImapClient
***&aname(ImapClient.sample2){メッセージをアップロードする};
+
***&aname(ImapClient.sample1){メッセージをアップロードする};
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
1197,7 1567,9
 
}}
}}
 
#tabpage-end
#tabpage-end
 

                

                
~
***&aname(ImapClient.sample2){メッセージの検索};
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample2]]
-

                  
-
***&aname(ImapClient.sample3){メッセージの検索};
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
1271,35 1643,129
 
}}
}}
 
#tabpage-end
#tabpage-end
 

                

                
~
***&aname(ImapClient.sample3){新着メッセージの待機};
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample3]]
-

                  
-
**ImapWebRequest/ImapWebResponse
-
***&aname(ImapWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-

                  
-
using Smdn.Net.Imap4.WebClients;
-

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

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

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

                  
-
Imports Smdn.Net.Imap4.WebClients
-

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

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

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

                  
-
同じ処理を[[ImapClientで記述した例>#ImapClient.sample1]]
-

                  
-
***&aname(ImapWebRequest.sample2){メッセージをアップロードする};
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.IO;
-
using System.Net;
-

                  
-
using Smdn.Net.Imap4.WebClients;
-

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

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

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

                  
-
Imports Smdn.Net.Imap4.WebClients
-

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

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

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

                  
-
同じ処理を[[ImapClientで記述した例>#ImapClient.sample2]]
-

                  
-
***&aname(ImapWebRequest.sample3){メッセージの検索};
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
~
using System.Threading;
using System.Net;
 

                

                
~
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.WebClients;
+
using Smdn.Net.Imap4.Client;
 

                

                
 
class Sample {
class Sample {
 
  public static void Main(string[] args)
  public static void Main(string[] args)
 
  {
  {
~
    using (var client = new ImapClient(new Uri("imap://user@localhost/"))) {
    ImapWebRequestCreator.RegisterPrefix();
~
      client.Connect("pass");
    ImapSessionManager.ServerCertificateValidationCallback = delegate {
-
      // 証明書の検証は省略 (エラーを無視してすべて受け入れる)
-
      return true;
-
    };
-

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

                

                
~
      // INBOXを開く
    request.Credentials = new NetworkCredential("user", "pass");
+
      using (var inbox = client.OpenInbox()) {
+
        for (;;) {
+
          // タイムアウトなし(Timeout.Infinite)で新着メッセージの受信を待機
+
          var newMessages = inbox.WaitForMessageArrival(Timeout.Infinite,
+
                                                        ImapMessageFetchAttributeOptions.StaticAttributes);
+

                  
+
          // 受信したメッセージの件名を表示する
+
          foreach (var message in newMessages) {
+
            Console.WriteLine(message.EnvelopeSubject);
+
          }
 

                

                
~
          // 再び待機を開始する
    using (var response = request.GetResponse() as ImapWebResponse) {
~
        }
      foreach (var message in response.MessageAttributes) {
-
        // 取得したメッセージのURLを表示
-
        Console.WriteLine(message.Url);
 
      }
      }
 
    }
    }
 
  }
  }
1308,37 1774,286
 
#tabpage(VB)
#tabpage(VB)
 
#code(vb){{
#code(vb){{
 
Imports System
Imports System
~
Imports System.Threading
Imports System.Net
-
Imports System.Net.Security
-
Imports System.Security.Cryptography.X509Certificates
 

                

                
 
Imports Smdn.Net.Imap4
Imports Smdn.Net.Imap4
~
Imports Smdn.Net.Imap4.Client
Imports Smdn.Net.Imap4.WebClients
 

                

                
 
Class Sample
Class Sample
 
  Public Shared Sub Main(ByVal args As String())
  Public Shared Sub Main(ByVal args As String())
~
    Using client As New ImapClient(New Uri("imap://user@localhost/"))
    ImapWebRequestCreator.RegisterPrefix()
~
      client.Connect("pass")
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
-

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

                

                
~
      ' INBOXを開く
    request.Credentials = New NetworkCredential("user", "pass")
+
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
+
        Do
+
          ' タイムアウトなし(Timeout.Infinite)で新着メッセージの受信を待機
+
          Dim newMessages As ImapMessageInfoList = inbox.WaitForMessageArrival(Timeout.Infinite, _
+
                                                                               ImapMessageFetchAttributeOptions.StaticAttributes)
+

                  
+
          ' 受信したメッセージの件名を表示する
+
          For Each message As ImapMessageInfo In newMessages
+
            Console.WriteLine(message.EnvelopeSubject)
+
          Next
 

                

                
~
          ' 再び待機を開始する
    Using response As ImapWebResponse = DirectCast(request.GetResponse(), ImapWebResponse)
~
        Loop
      For Each message As IImapMessageAttribute In response.MessageAttributes
~
      End Using
        ' 取得したメッセージのURLを表示
-
        Console.WriteLine(message.Url)
-
      Next
 
    End Using
    End Using
 
  End Sub
  End Sub
-

                  
-
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
-
                                                    ByVal certificate As X509Certificate, _
-
                                                    ByVal chain As X509Chain, _
-
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
-
    ' 証明書の検証は省略 (エラーを無視してすべて受け入れる)
-
    Return True
-
  End Function
 
End Class
End Class
 
}}
}}
 
#tabpage-end
#tabpage-end
 

                

                
-
同じ処理を[[ImapClientで記述した例>#ImapClient.sample3]]
-

                  
-
***&aname(ImapWebRequest.sample4){メッセージのコピー};
-
INBOXにあるメッセージすべてをINBOX.backupにコピーする例。 AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-
using Smdn.Net.Imap4;
-
using Smdn.Net.Imap4.WebClients;
-
  :
-

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

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

                  
-
using (var response = request.GetResponse()) {
-
  :
-
  :
-
}
-
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
-
Imports System.Net
-
Imports Smdn.Net.Imap4
-
Imports Smdn.Net.Imap4.WebClients
-
  :
-

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

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

                  
-
Using response As WebResponse = request.GetResponse()
-
  :
-
  :
-
End Using
-
}}
-
#tabpage-end
-

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

                  
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-
using Smdn.Net.Imap4;
-
using Smdn.Net.Imap4.Protocol;
-
using Smdn.Net.Imap4.WebClients;
-
  :
-

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

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

                  
-
using (var response = request.GetResponse()) {
-
  :
-
  :
-
}
-
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
-
Imports System.Net
-
Imports Smdn.Net.Imap4
-
Imports Smdn.Net.Imap4.Protocol
-
Imports Smdn.Net.Imap4.WebClients
-
  :
-

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

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

                  
-
Using response As WebResponse = request.GetResponse()
-
  :
-
  :
-
End Using
-
}}
-
#tabpage-end
-

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

                  
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-
using Smdn.Net.Imap4;
-
using Smdn.Net.Imap4.Protocol;
-
using Smdn.Net.Imap4.WebClients;
-
  :
-

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

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

                  
-
using (var response = request.GetResponse()) {
-
  :
-
  :
-
}
-
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
-
Imports System.Net
-
Imports Smdn.Net.Imap4
-
Imports Smdn.Net.Imap4.Protocol
-
Imports Smdn.Net.Imap4.WebClients
-
  :
-

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

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

                  
-
Using response As WebResponse = request.GetResponse()
-
  :
-
  :
-
End Using
-
}}
-
#tabpage-end
-

                  
-
***&aname(ImapWebRequest.sample7){メッセージの検索};
-
ImapStyleUriBuilderを使って、複雑な検索クエリを含むリクエストを送信する例。
-

                  
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-
using System.Text;
-

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

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

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

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

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

                  
-
using (var response = request.GetResponse()) {
-
  :
-
  :
-
}
-
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
-
Imports System.Net
-
Imports System.Text
-

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

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

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

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

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

                  
-

                  
-
Using response As WebResponse = request.GetResponse()
-
  :
-
  :
-
End Using
-
}}
-
#tabpage-end
-

                  
-
この例で指定している検索クエリは、
-
+fromが'差出人'かつ送信日が2010年2月6日以前、もしくは
-
+未読で件名に'未承諾広告'を含まない
-

                  
-
となる。
-

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

                  
-
#tabpage(C#)
-
#code(cs){{
-
using System;
-
using System.Net;
-

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

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

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

                  
-
using (var response = request.GetResponse()) {
-
  :
-
  :
-
}
-
}}
-
#tabpage(VB)
-
#code(vb){{
-
Imports System
-
Imports System.Net
-

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

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

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

                  
-
Using response As WebResponse = request.GetResponse()
-
  :
-
  :
-
End Using
-
}}
-
#tabpage-end
-

                  
 
**ImapSession
**ImapSession
 
このクラスを直接使用することはできますが推奨はしません。 また、ドキュメントを用意する予定はありません。 内部実装の参照や改変などの参考程度に掲載します。
このクラスを直接使用することはできますが推奨はしません。 また、ドキュメントを用意する予定はありません。 内部実装の参照や改変などの参考程度に掲載します。
 

                

                

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

current previous
10,16 10,7
 
--[[works/libs/Smdn.Security.Authentication.Sasl]]
--[[works/libs/Smdn.Security.Authentication.Sasl]]
 
--[[works/libs/Smdn.Formats.Mime]]
--[[works/libs/Smdn.Formats.Mime]]
 

                

                
~
*ダウンロード
*機能
+
#googleadunit
+

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

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

                  
+
*機能と特徴
 
**主な機能
**主な機能
 
+すべての標準コマンドの送受信
+すべての標準コマンドの送受信
 
+いくつかの拡張コマンドの送受信
+いくつかの拡張コマンドの送受信
33,9 24,9
 

                

                
 
**クライアント実装
**クライアント実装
 
クライアント実装として以下の3つのクラスを用意しています。
クライアント実装として以下の3つのクラスを用意しています。
-
:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント
 
:ImapClientクラス|メールボックス/メッセージをSystem.IO.DirectoryInfo/FileInfoクラスに似たインターフェイスで操作できるようにIMAP操作を抽象化したクライアント
:ImapClientクラス|メールボックス/メッセージをSystem.IO.DirectoryInfo/FileInfoクラスに似たインターフェイスで操作できるようにIMAP操作を抽象化したクライアント
~
:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント
:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URL(&urn2url(urn:ietf:rfc:5092,short);)での操作に対応したクライアント
+
:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URL(&urn2url(urn:ietf:rfc:5092,short);)での操作に対応したクライアント (別アセンブリ[[works/libs/Smdn.Net.Imap4.WebClients]]で提供)
 

                

                
 
**その他の主な特徴
**その他の主な特徴
 
:メッセージ本文はStreamとして取得可能|メッセージの加工・解析は任意の手段を使用できるよう、Streamとして返します。 MIMEメッセージのデコード機能は含んでいません。
:メッセージ本文はStreamとして取得可能|メッセージの加工・解析は任意の手段を使用できるよう、Streamとして返します。 MIMEメッセージのデコード機能は含んでいません。
44,30 35,35
 
:パース済みのレスポンスにアクセス可能|受信したレスポンスは必要な部分だけを拾い読みして結果を返すのではなく、全てパースしてから結果を返します。
:パース済みのレスポンスにアクセス可能|受信したレスポンスは必要な部分だけを拾い読みして結果を返すのではなく、全てパースしてから結果を返します。
 
:フリー・オープンソース|本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]を採用しています。
:フリー・オープンソース|本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]を採用しています。
 

                

                
-
*ダウンロード
-
#googleadunit
-

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

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

                  
 
*使い方・サンプルコード
*使い方・サンプルコード
~
もっとも簡単なサンプルコードとして、ImapClientクラスを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、INBOXにある一番最後のメールをダウンロードしてファイルに保存するサンプルです。
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとIMAP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
-
using System.Net;
 

                

                
~
using Smdn.Net.Imap4.Client;
using Smdn.Net.Imap4.WebClients;
+
using Smdn.Net.Imap4.Protocol.Client;
 

                

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

                

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

                  
      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml");
+
      using (var inbox = client.OpenInbox()) {
+
        var message = inbox.GetMessageBySequence(inbox.ExistMessageCount);
+

                  
+
        message.Save(message.EnvelopeSubject + ".eml");
+
      }
 
    }
    }
 
  }
  }
 
}
}
79,21 75,16
 
Imports System.Net.Security
Imports System.Net.Security
 
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.X509Certificates
 

                

                
~
Imports Smdn.Net.Imap4.Client
Imports Smdn.Net.Imap4.WebClients
+
Imports Smdn.Net.Imap4.Protocol.Client
 

                

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

                  
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
~
    Using client As New ImapClient(New Uri("imaps://username@imap.gmail.com/"))

                  
~
      client.Connect("password")
    Using client As New WebClient()
~

                  
      client.Credentials = New NetworkCredential("username", "password")
~
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml")
+
        Dim message As ImapMessageInfo = inbox.GetMessageBySequence(inbox.ExistMessageCount)
+

                  
+
        message.Save(message.EnvelopeSubject + ".eml")
+
      End Using
 
    End Using
    End Using
 
  End Sub
  End Sub
 

                

                
107,12 98,13
 
}}
}}
 
#tabpage-end
#tabpage-end
 

                

                
~
詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/SimpleMailer]]をご覧ください。
詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/TundereBird]]をご覧ください。
 

                

                
 
*不具合・要望・質問等
*不具合・要望・質問等
 
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
 

                

                
 
-既知の不具合
-既知の不具合
-
--IDLEして5分程度経過すると、Mono.Security.Protocol.Tls.SslStreamBase.EndReadでMono.Security.Protocol.Tls.TlsExceptionがスローされる
 
--GMailにアップロードしたメッセージのBODYSTRUCTUREが正しくパースできない
--GMailにアップロードしたメッセージのBODYSTRUCTUREが正しくパースできない
 

                

                
 
*動作状況
*動作状況

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

current previous
1,192 0,0
+
${smdncms:title,Smdn.Net.Pop3.WebClients}
+
${smdncms:keywords,Smdn.Net.Pop3.WebClients,POP,POP3,SSL,GMail,C#,VB,VB.NET,.NET,Mono,mail,メール,受信,クライアント,ライブラリ}
+
${smdncms:relpage_list,sub}
+
C#で書いた.NET Framework/Mono用POP3クライアントライブラリです。 [[works/libs/Smdn.Net.Pop3]]をラップして&msdn(netfx,type,System.Net.WebRequest);/&msdn(netfx,type,System.Net.WebResponse);を使ってPOPの操作を行えるようにしたものです。 メッセージのダウンロードにWebClientクラスのメソッドを使うこともできます。 POP URL(&urn2url(urn:ietf:rfc:2384,short);)を用いたリクエストに対応していて、&msdn(netfx,type,System.Net.FtpWebRequest);等と同様にWebRequest.Methodプロパティで送信するコマンドを制御できます。
+

                  
+
-姉妹品
+
--[[works/libs/Smdn.Net.Imap4.WebClients]]
+
--[[works/libs/Smdn.Net.Pop3]]
+

                  
+
*ダウンロード
+
#googleadunit
+

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

                  
+
:最新版 (ソースコード)|${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10.tar.bz2}
+
:開発版|[[http://svn.smdn.jp/anonsvn/libs/Smdn/trunk/]]よりチェックアウトできます
+
:ビルド済みパッケージ|[[こちら>#prebuilt]]から選んでください
+

                  
+
*使い方・サンプルコード
+
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとPOP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Net;
+

                  
+
using Smdn.Net.Pop3.WebClients;
+

                  
+
class GpopRetrieveExample {
+
  public static void Main()
+
  {
+
    PopWebRequestCreator.RegisterPrefix();
+
    PopSessionManager.ServerCertificateValidationCallback += delegate {
+
      return true;
+
    };
+

                  
+
    using (var client = new WebClient()) {
+
      client.Credentials = new NetworkCredential("username", "password");
+
      client.DownloadFile("pops://username@pop.gmail.com/;MSG=1", "message.eml");
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+

                  
+
Imports Smdn.Net.Pop3.WebClients
+

                  
+
Class GpopRetrieveExample
+
  Public Shared Sub Main()
+
    PopWebRequestCreator.RegisterPrefix()
+
    PopSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

                  
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("username", "password")
+
      client.DownloadFile("pops://username@pop.gmail.com/;MSG=1", "message.eml")
+
    End Using
+
  End Sub
+

                  
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    Return True
+
  End Function
+
End Class
+
}}
+
#tabpage-end
+

                  
+
この例で使用している修飾子(;MSG=1)はPOP URLに対する独自の拡張です。 詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Pop3.WebClients/docs]]およびデモ用アプリケーション[[works/tools/junk/TundereBird]]をご覧ください。
+

                  
+
*不具合・要望・質問等
+
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板>misc/forum/libs]]へどうぞ。
+

                  
+
*リリース一覧
+
すべてMIT X11ライセンスでのリリースとなります。
+

                  
+
**ソースコード
+
-1.1x
+
--${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10.tar.bz2}
+
-1.0x
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-1.04.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-1.03.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-1.02.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-1.01.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-1.00.tar.bz2}
+
-0.9x
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.92.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.91.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.90.tar.bz2}
+
-0.2x
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.29.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.28.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.27.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.26.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.25.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.24.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.23.tar.bz2}
+
--${smdncms:distfilelink,../Smdn.Net.Pop3/Smdn.Net.Pop3.Client-0.22.tar.bz2}
+

                  
+
**&aname(prebuilt){ビルド済みパッケージ};
+
|*1.10 (2011-02-18)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.10-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
|*1.04 (2011-02-03)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.04-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
|*1.03 (2011-01-22)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.03-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
|*1.02 (2011-01-08)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.02-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
|*1.01 (2010-12-11)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.01-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
|*1.00 (2010-05-15)
+
|~種類|~パッケージ|h
+
|~通常版|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx4.0.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx3.5.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx2.0.zip,.NET 2.x}
+
}}|
+
|~単一アセンブリ版&sub{*1};|{{
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx4.0-combined.zip,.NET 4}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx3.5-combined.zip,.NET 3.5}
+
${smdncms:distfilelink,Smdn.Net.Pop3.WebClients-1.00-netfx2.0-combined.zip,.NET 2.x}
+
}}|
+

                  
+
:単一アセンブリ版&sup{*1};|すべてのファイルを一つのアセンブリにまとめたものです。 [[works/libs/Smdn.Net.Imap4.WebClients]]や[[works/libs/Smdn.Formats.Mime]]と組み合わせて使用する場合は、型名が衝突するので通常版を使用してください。
+
:ビルド設定等|コンパイラにMono gmcs/dmcsを使用、オプションに/debug- /optimize+ /define:TRACEを指定してビルドしています。
+

                  
+
*変更履歴
+
**1.10 (2011-02-18)
+
[[works/libs/Smdn.Net.Pop3]]よりソースパッケージを分離、個別にリリース (前バージョンとの差分はなし)
+

                  
+
**1.04以前
+
1.04以前の変更履歴については[[Smdn.Net.Pop3の変更履歴>works/libs/Smdn.Net.Pop3/releases]]をご覧ください。
+

                  

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

current previous
1,514 0,0
+
${smdncms:title,ドキュメント・サンプル}
+
${smdncms:keywords,}
+
${pragma,parser-options,non-limited-list}
+
[[works/libs/Smdn.Net.Pop3.WebClients]]のドキュメントとサンプルです。 ここに記載されているものはversion 1.10時点のもので、記載不備などがあるかもしれません。
+

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

                  
+
**&aname(PopWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Net;
+

                  
+
using Smdn.Net.Pop3.WebClients;
+

                  
+
class SaveToFile {
+
  public static void Main(string[] args)
+
  {
+
    PopWebRequestCreator.RegisterPrefix();
+

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

                  
+
      // メールボックスにある1件目のメッセージをダウンロードしてファイルsample.emlに保存
+
      client.DownloadFile("pop://user;AUTH=DIGEST-MD5@localhost/;MSG=1", "sample.eml");
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+

                  
+
Imports Smdn.Net.Pop3.WebClients
+

                  
+
Class SaveToFile
+
  Public Shared Sub Main(ByVal args As String())
+
    PopWebRequestCreator.RegisterPrefix()
+

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

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

                  
+
}}
+
#tabpage-end
+

                  
+
**&aname(PopWebRequest.sample2){Gmailアカウントのメールボックスから、最新のメッセージをダウンロードする};
+
#code(cs){{
+
using System;
+
using System.IO;
+
using System.Text;
+
using System.Net;
+

                  
+
using Smdn.Net.Pop3;
+
using Smdn.Net.Pop3.WebClients;
+

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

                  
+
    var baseUrl = new Uri("pops://user@pop.gmail.com/");
+
    var credential = new NetworkCredential("user", "pass");
+

                  
+
    // STATコマンドでメールボックスにあるメッセージの数を取得
+
    var request = WebRequest.Create(baseUrl) as PopWebRequest;
+

                  
+
    request.Credentials = credential;
+
    request.Method = "STAT";
+
    request.KeepAlive = true; // リクエストが完了しても接続したままにする
+

                  
+
    long recentMessageNumber;
+

                  
+
    using (var response = request.GetResponse() as PopWebResponse) {
+
      recentMessageNumber = response.DropList.MessageCount;
+
    }
+

                  
+
    if (recentMessageNumber == 0) {
+
      // メールボックスにメッセージがない
+
      Console.WriteLine("no messages");
+
      return;
+
    }
+

                  
+
    // 取得するメッセージ番号を含む相対URLを作成
+
    var recentMessageUrl = string.Format("./;MSG={0}", recentMessageNumber);
+

                  
+
    // RETRコマンドでメッセージの本文を取得
+
    request = WebRequest.Create(new Uri(baseUrl, recentMessageUrl)) as PopWebRequest;
+

                  
+
    request.Credentials = credential;
+
    request.Method = "RETR";
+
    request.KeepAlive = false; // リクエストが完了したら切断する
+

                  
+
    using (var response = request.GetResponse()) {
+
      using (var stream = response.GetResponseStream()) {
+
        // メッセージ本文をiso-2022-jpでデコードして表示
+
        var reader = new StreamReader(stream, Encoding.GetEncoding("iso-2022-jp"));
+

                  
+
        Console.WriteLine(reader.ReadToEnd());
+
      }
+
    }
+
  }
+
}
+
}}
+

                  
+
*&aname(PopWebRequest){PopWebRequest/PopWebResponseクラス};
+
ここではPopWebRequest/PopWebResponseクラスおよびSmdn.Net.Pop3.WebClients名前空間のクラスの詳細と使い方を紹介します。
+

                  
+
**概説
+
本ライブラリは[[Smdn.Net.Pop3.Client>works/libs/Smdn.Net.Pop3]]のクラスをラップして実装しています。 そのため、基本的な機能と動作については[[Smdn.Net.Pop3.Clientの解説>works/libs/Smdn.Net.Pop3/doc]]をご覧ください。 ここではSmdn.Net.Pop3.WebClientsおよびPopWebRequest/PopWebResponseクラスに固有な部分を中心に解説します。
+

                  
+
基本的にはHttpWebRequest/HttpWebResponseやFtpWebRequest/FtpWebResponseを用いた操作と同様で、
+
+リクエストURLを指定して&msdn(netfx,method,System.Net.WebRequest.Create){WebRequest.Createメソッド};でPopWebRequestのインスタンスを作成
+
+Method、Credentialsなどのプロパティを指定
+
+PopWebRequest.GetResponseでリクエストを実行、レスポンスを取得
+
+取得したPopWebResponseインスタンスを参照、必要に応じてPopWebResponse.GetResponseStreamメソッドを呼び出す
+

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

                  
+
**pop, popsスキームの登録
+
WebRequestクラスがpopスキームおよびpopsスキームのURLを処理できるように、PopWebRequest/PopWebResponseクラスを使う前にPopWebRequestCreator.RegisterPrefixメソッドを呼び出しておく必要があります。
+

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

                  
+
#tabpage(C#)
+
#code(cs,記述例){{
+
using System;
+
using System.Net;
+
using Smdn.Net.Pop3;
+
using Smdn.Net.Pop3.WebClients;
+

                  
+
  :
+
  :
+
// popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix();
+

                  
+
// PopWebRequestインスタンスの作成
+
var request = WebRequest.Create("pop://user@pop.example.net/");
+
  :
+
  :
+
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.WebClients
+

                  
+
  :
+
  :
+
' popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix()
+

                  
+
' PopWebRequestインスタンスの作成
+
Dim request As WebRequest = WebRequest.Create("pop://user@pop.example.net/")
+
  :
+
  :
+
}}
+
#tabpage-end
+

                  
+
**リクエストURLと接続・認証時の動作
+
***&aname(PopWebRequest.login){接続と認証};
+
接続・認証時の動作は、リクエストURLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。
+

                  
+
リクエストURLで記述されない接続・認証時の動作は、PopWebRequestクラスのプロパティで指定できます(([[PopWebRequestのプロパティ>#PopWebRequest.properties]]も合わせて参照してください))。
+
|*接続・認証時の動作を指定するPopWebRequestクラスのプロパティ
+
|~プロパティ|~解説|h
+
|Credentials|認証時に使用する資格情報(パスワード等)を指定します|
+
|UseTlsIfAvailable|認証を開始する前に、可能ならSSL/TLSへアップグレードするかどうかを指定します|
+
|UsingSaslMechanisms|認証時に試行する認証メカニズムを指定します|
+
|AllowInsecureLogin|接続がSSL/TLSで保護されていない場合でも、平文またはAPOPによる認証を許可するかどうか指定します|
+

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

                  
+
#tabpage(C#)
+
#code(cs,記述例){{
+
// popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix();
+

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

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

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

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

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

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

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

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

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

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

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

                  
+
request6.Credentials = new NetworkCredential("user", "pass");
+
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
' popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix()
+

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

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

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

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

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

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

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

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

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

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

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

                  
+
request6.Credentials = New NetworkCredential("user", "pass")
+
}}
+
#tabpage-end
+

                  
+
***&aname(PopWebRequest.certs){証明書の選択と検証};
+
デフォルトでは、接続・認証時にPopSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
+

                  
+
|*SSL/TLS接続時に参照するメンバ(いずれもクラスプロパティ)
+
|~型|~PopWebRequestクラスが参照するメンバ|h
+
|X509Certificate2Collection|PopSessionManager.ClientCertificates|
+
|RemoteCertificateValidationCallback|PopSessionManager.ServerCertificateValidationCallback|
+
|RemoteCertificateValidationCallback|PopSessionManager.ClientCertificateSelectionCallback|
+

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

                  
+
#tabpage(C#)
+
#code(cs,証明書の検証を行う例){{
+
using System;
+
using System.Net;
+
using System.Net.Security;
+
using System.Security.Cryptography.X509Certificates;
+
using Smdn.Net.Pop3;
+
using Smdn.Net.Pop3.WebClients;
+

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

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

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

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

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

                  
+
Public Class ValidateServerCerts
+
  Public Shared Sub Main(ByVal args As String())
+
    PopWebRequestCreator.RegisterPrefix()
+

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

                  
+
    Using client As New WebClient
+
      client.Credentials = New NetworkCredential("user", "pass")
+
      client.DownloadFile("pops://user@localhost/;MSG=1", "sample.eml")
+
    End Using
+
  End Sub
+

                  
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
#If DEBUG Then
+
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
+
    if (CInt(sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) <> 0 then
+
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
+
    End If
+
#End If
+

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

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

                  
+
**リクエストURLとリクエスト・レスポンスの動作
+
POP URL(&urn2url(urn:ietf:rfc:2384,short);)ではPOPサーバ(メールボックス)を表す形式しか規定されていませんが、本ライブラリでは独自の拡張としてメッセージ番号を指定してリクエストできるようにしてあります。 リクエストURLにメッセージ番号(;MSG=x)が含まれているかどうかでリクエストの対象が変わります。
+
|*リクエストURLの形式とリクエストの対象
+
|~リクエストURLの形式|~リクエストの対象|h
+
|pop://pop.example.net/|URLで指定されたメールボックス|
+
|pop://pop.example.net/;MSG=1|URLで指定されたメールボックスにあるメッセージのうち、メッセージ番号に該当する特定のメッセージ|
+

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

                  
+
PopWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。 以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。 PopWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては[[PopWebRequestのプロパティ>#PopWebRequest.properties]]で説明します。
+

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

                  
+
|~Methodプロパティ|~リクエスト|~解説|~レスポンス|h
+
|PopWebRequestMethods.List, "LIST"&br;(デフォルト)|LISTコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|-|取得したメッセージの一覧は、PopWebResponse.ScanListsプロパティに設定されます。|
+
|PopWebRequestMethods.Rset, "RSET"|RSETコマンドを送信してDELEコマンドの操作をキャンセルします。|-||
+
|PopWebRequestMethods.Stat, "STAT"|STATコマンドを送信してメールボックスにあるメッセージの数と総サイズを取得します。|-|取得したメッセージ数と総サイズは、PopWebResponse.DropListプロパティに設定されます。|
+
|PopWebRequestMethods.Uidl, "UIDL"|UIDLコマンドを送信してメールボックスにあるメッセージのIDの一覧を取得します。|-|取得したIDの一覧は、PopWebResponse.UniqueIdListsプロパティに設定されます。|
+
|~Methodプロパティ|~リクエスト|~解説|~レスポンス|f
+

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

                  
+
|~Methodプロパティ|~リクエスト|~解説|~レスポンス|h
+
|PopWebRequestMethods.Retr, "RETR"&br;(デフォルト)|RETRコマンドを送信してメッセージの本文を取得します。|-|メッセージ本文はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。 取得したメッセージのサイズはWebResponse.ContentLengthプロパティに設定されます。|
+
|PopWebRequestMethods.Dele, "DELE"|DELEコマンドを送信してメッセージを削除します。|-|-|
+
|PopWebRequestMethods.List, "LIST"|LISTコマンドを送信してメッセージの番号とサイズを取得します。|-|取得したメッセージ番号とサイズは、PopWebResponse.ScanListsプロパティに設定されます。|
+
|PopWebRequestMethods.Top, "TOP"|TOPコマンドを送信してメッセージをヘッダ部分を取得します。|現時点ではTOPで取得するボディ部分の行数は指定できません(常に0を指定します)。|メッセージのヘッダ部分はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。 取得したヘッダ部分のサイズはWebResponse.ContentLengthプロパティに設定されます。|
+
|PopWebRequestMethods.Uidl, "UIDL"|UIDLコマンドを送信してメッセージの番号とIDを取得します。|-|取得したメッセージ番号とIDは、PopWebResponse.UniqueIdListsプロパティに設定されます。|
+
|~Methodプロパティ|~リクエスト|~解説|~レスポンス|f
+

                  
+
***リクエスト対象に制限されないリクエスト
+
リクエストURLの形式によらず使用可能なコマンドのリクエストとレスポンスの動作は次のとおりです。
+

                  
+
|~Methodプロパティに指定可能な値|~リクエスト|~解説|~レスポンス|h
+
|PopWebRequestMethods.NoOp, "NOOP"|NOOPコマンドを送信します。|このコマンドは何もしません。 自動ログアウトタイマの更新、セッションの接続性確認などに使います。|-|
+
|~Methodプロパティに指定可能な値|~リクエスト|~解説|~レスポンス|f
+

                  
+
***&aname(PopWebRequest.properties){PopWebRequestクラスのプロパティ};
+
PopWebRequestクラスにはMethodプロパティ以外にもコマンド送信時の動作を制御するためのプロパティを用意してあります。 プロパティの値によってリクエスト内容と動作が変わります。
+

                  
+
|*PopWebRequestクラスのプロパティ
+
|~プロパティ|~デフォルト|~対象となるコマンド|~解説|h
+
|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。 trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます。|
+
|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にSSL/TLSを使用した接続にアップグレードします。|
+
|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。 サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|
+
|AllowInsecureLogin|false|全て(認証時)|接続がSSL/TLSで保護されていない場合でも、平文またはAPOPによる認証を許可するかどうか指定します。|
+
|DeleteAfterRetrieve|false|RETR|RETRコマンドでのメッセージの受信が成功した場合、同じメッセージに対して自動的にDELEコマンドを発行します。|
+
|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。 サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|
+

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

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

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

                  
+
PopWebRequestDefaultsクラスにはPopWebRequestプロパティと同名のプロパティを用意してあります。
+

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

                  
+
#code(xml,アプリケーション構成ファイルの記述例){{
+
<?xml version="1.0" encoding="utf-8" ?>
+
<configuration>
+
  <configSections>
+
    <!-- smdn.net.pop3.client要素を処理するためのセクションハンドラクラスの設定 -->
+
    <sectionGroup name="smdn.net.pop3.client">
+
      <section name="webRequestDefaults" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
+
    </sectionGroup>
+
  </configSections>
+
  <system.net>
+
    <!-- pop, popsスキームの登録 -->
+
    <webRequestModules>
+
      <add prefix="pop"   type="Smdn.Net.Pop3.WebClients.PopWebRequestCreator, Smdn.Net.Pop3.WebClients" />
+
      <add prefix="pops"  type="Smdn.Net.Pop3.WebClients.PopWebRequestCreator, Smdn.Net.Pop3.WebClients" />
+
    </webRequestModules>
+
  </system.net>
+
  <smdn.net.pop3.client>
+
    <!-- PopWebRequestDefaultsクラスのデフォルト値の変更 -->
+
    <webRequestDefaults>
+
      <add key="timeout" value="-1"/>
+
      <add key="readWriteTimeout" value="-1"/>
+
      <add key="useTlsIfAvailable" value="true"/>
+
      <add key="deleteAfterRetrieve" value="false"/>
+
      <add key="keepAlive" value="true"/>
+
      <add key="usingSaslMechanisms" value="DIGEST-MD5, CRAM-MD5, NTLM"/>
+
      <add key="allowInsecureLogin" value="false"/>
+
      <add key="expectedErrorResponseCodes" value="SYS/TEMP"/>
+
    </webRequestDefaults>
+
  </smdn.net.pop3.client>
+
</configuration>
+
}}
+

                  
+
記述内容については&msdn(netfx,id,dacty7ed){ネットワーク設定スキーマ};および&msdn(netfx,id,0hyxd0xc){構成セクション スキーマ};も合わせて参照してください。
+

                  
+
**例外
+
PopWebRequestからは&msdn(netfx,type,System.Net.WebException);または&msdn(netfx,type,System.Net.ProtocolViolationException);をスローします。 WebExceptionをスローする場合は、エラーの状況によりWebException.StatusプロパティとInnerExceptionプロパティに値が設定されます。 また、サーバがエラー応答を返した場合は、Responseプロパティも設定されます。
+

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

                  

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

current previous
7,8 7,6
 
0.20以降はMIT X11ライセンスでのリリースとなります。 0.20より前のバージョンについては特に使用条件を定めていません。
0.20以降はMIT X11ライセンスでのリリースとなります。 0.20より前のバージョンについては特に使用条件を定めていません。