<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <author>
    <name>smdn</name>
    <email>smdn@mail.invisiblefulmoon.net</email>
  </author>
  <generator version="0.03">SmdnFeeds</generator>
  <id>http://smdn.invisiblefulmoon.net/stats/feeds/atom10.xml</id>
  <link href="http://smdn.invisiblefulmoon.net/stats/feeds/atom10.xml" rel="self" type="application/atom+xml" />
  <link href="http://smdn.invisiblefulmoon.net/" rel="related" type="application/xhtml+xml" />
  <link href="http://smdn.invisiblefulmoon.net/stats/history/" rel="alternate" type="application/xhtml+xml" />
  <subtitle type="text">最近更新したページとその変更内容です。</subtitle>
  <title type="text">総武ソフトウェア推進所 更新履歴</title>
  <updated>2010-03-12T07:01:58+09:00</updated>
  <sy:updatePeriod>daily</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
  <sy:updateBase>2010-03-12T07:01:58+09:00</sy:updateBase>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/softwares/Banshee/">Softwares/Banshee</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/softwares/Banshee/">Softwares/Banshee</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
オーディオプレイヤー[[Banshee:http://banshee-project.org/]]について。

*ソースからのビルド・インストール
<del>version 1.5.1のソースからビルドしてインストールする手順。　ビルドに使用した環境はUbuntu 9.10 Desktop。</del>
<ins>version 1.6 RC1をソースからビルドしてインストールする手順。　ビルドに使用した環境はUbuntu 9.10 Desktop。</ins>

-関連するページ
--[[programming/mono/install_trunk]]
configureの結果例。
#prompt{{
  :
<ins>checking for gmcs... /usr/local/bin/gmcs</ins>
<ins>checking for mono... /usr/local/bin/mono</ins>
<ins>checking for gacutil... /usr/local/bin/gacutil</ins>
<ins>checking for pkg-config... /usr/bin/pkg-config</ins>
<ins>checking pkg-config is at least version 0.9.0... yes</ins>
checking for monodocer... /usr/local/bin/monodocer
checking for mdassembler... /usr/local/bin/mdassembler
checking for GNOME_SHARP... yes
checking for MONO_NUNIT... yes
checking for nunit-console2... /usr/local/bin/nunit-console2
configure: creating ./config.status
<del>config.status: creating Makefile</del>
<del>config.status: creating taglib-sharp.pc</del>
<del>config.status: creating src/Makefile</del>
<del>config.status: creating src/AssemblyInfo.cs</del>
<del>config.status: creating src/policy.2.0.taglib-sharp.config</del>
<del>config.status: creating examples/Makefile</del>
<del>config.status: creating docs/Makefile</del>
<del>config.status: creating docs/Package.en.xml</del>
<del>config.status: creating tests/Makefile</del>
configure: WARNING: unrecognized options: --enable-compile-warnings
<del>TagLib# is ready to be compiled.</del>
<ins>TagLib# is ready to be compiled.</ins>
Now type `make' to compile
}}

Number of items = 1
}}

<ins>**google-gdata</ins>
<ins>ソースのダウンロード。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://google-gdata.googlecode.com/files/libgoogle-data-mono-1.4.0.2.tar.gz</ins>
<ins>tar -xvf libgoogle-data-mono-1.4.0.2.tar.gz</ins>
<ins>cd libgoogle-data-mono-1.4.0.2/</ins>
<ins>}}</ins>
<ins>configureは用意されていないので、インストール先を指定する場合は、MakefileのPREFIXを変更する必要がある(デフォルトは/usr/local)。</ins>
<ins />
<ins>make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install</ins>
<ins>}}</ins>
<ins />
<ins>gacutilでインストールされたアセンブリを確認する。</ins>
<ins>#prompt{{</ins>
<ins>$ gacutil -l | grep Google</ins>
<ins>Google.GData.AccessControl, Version=1.4.0.2, Culture=neutral, PublicKeyToken=b4b8eb9a7afc8328</ins>
<ins>Google.GData.Apps, Version=1.4.0.2, Culture=neutral, PublicKeyToken=e6feebfe441b89cb</ins>
<ins>Google.GData.Blogger, Version=1.4.0.2, Culture=neutral, PublicKeyToken=6f8943d33947d761</ins>
<ins>Google.GData.Calendar, Version=1.4.0.2, Culture=neutral, PublicKeyToken=aa6748391206b888</ins>
<ins>Google.GData.Client, Version=1.4.0.2, Culture=neutral, PublicKeyToken=04a59ca9b0273830</ins>
<ins>Google.GData.CodeSearch, Version=1.4.0.2, Culture=neutral, PublicKeyToken=cac30bb7c678972d</ins>
<ins>Google.GData.Contacts, Version=1.4.0.2, Culture=neutral, PublicKeyToken=7e065189dd4b982f</ins>
<ins>Google.GData.Documents, Version=1.4.0.2, Culture=neutral, PublicKeyToken=099e9a853da5b089</ins>
<ins>Google.GData.Extensions, Version=1.4.0.2, Culture=neutral, PublicKeyToken=0b4c5df2ebf20876</ins>
<ins>Google.GData.GoogleBase, Version=1.4.0.2, Culture=neutral, PublicKeyToken=b361faa2ad5bd3db</ins>
<ins>Google.GData.Health, Version=1.4.0.2, Culture=neutral, PublicKeyToken=7dc2246c3cef9211</ins>
<ins>Google.GData.Photos, Version=1.4.0.2, Culture=neutral, PublicKeyToken=a25b50f2e8e3887a</ins>
<ins>Google.GData.Spreadsheets, Version=1.4.0.2, Culture=neutral, PublicKeyToken=3f77feb76ff0d9a1</ins>
<ins>Google.GData.YouTube, Version=1.4.0.2, Culture=neutral, PublicKeyToken=af04a32718ae8833</ins>
<ins>}}</ins>
<ins />
**Banshee本体
-依存するパッケージ類
--intltool

configureの結果例。
#prompt{{
<del>banshee-1-1.5.1</del>
<ins>banshee-1-1.5.5</ins>

  Build Environment
    Install Prefix:    /usr/local
    Datadir:           /usr/local/share
    Libdir:            /usr/local/lib

<del>    C Compiler:        /bin/bash /srv/files/build/banshee/banshee-1-1.5.1/build/m4/shave/shave cc gcc</del>
<del>    Mono C# Compiler:  /bin/bash /srv/files/build/banshee/banshee-1-1.5.1/build/m4/shave/shave mcs /usr/local/bin/gmcs -define:RELEASE</del>
<ins>    C Compiler:        /bin/bash /srv/files/build/banshee/banshee-1-1.5.5/build/m4/shave/shave cc gcc</ins>
<ins>    Mono C# Compiler:  /bin/bash /srv/files/build/banshee/banshee-1-1.5.5/build/m4/shave/shave mcs /usr/local/bin/gmcs -define:RELEASE</ins>
    Mono Runtime:      /usr/local/bin/mono

  Video/Graphics:

  Operating System/Desktop Environment:
    GNOME Support:     yes
<del>    Builtin Equalizer: yes</del>
    OSX Support:       no
<ins>    Moblin Support:    no</ins>

  Digital Audio Player Support:
    Mass Storage:      yes
    Karma:             no

  Extra Features:
<del>    DAAP Support:      yes</del>
<del>    Podcast Support:   no</del>
    Boo Scripting:     no
<del>    Moblin Support:    no</del>
<ins>    Builtin Equalizer: yes</ins>
<ins>    DAAP:              yes</ins>
<ins>    GIO Backend:       no</ins>
<ins>    Library Watcher:   yes</ins>
<ins>    Podcasts:          no</ins>
<ins>    Wikipedia:         no</ins>
<ins>    Gapless playback:  no</ins>
<ins>    YouTube extension: yes</ins>

  Build/Development:
<del>    Unit Tests:        yes</del>
<ins>    Unit Tests:        no</ins>
<ins>    Custom a11y:       no</ins>
    Release Build:     yes
    Vendor Build ID:   source-tarball

<ins>  WARNING: An existing Banshee install is in /usr/local/lib/banshee-1</ins>
<ins>           Remove the existing install before installing this build.</ins>
<ins>           Installing over an existing install will cause conflicts!</ins>
<ins />
}}

configureした結果に問題が無ければmake、make installする。
sudo make install
}}

<ins>なお、ビルド中エラーが発生したため、以下の箇所を修正した。</ins>
<ins>#code(diff,src/Extensions/Banshee.YouTube/Makefile){{</ins>
<ins>141c141</ins>
<ins>&lt; GDATASHARP_LIBS = -r:/usr/local/lib/mono/GData-Sharp/Google.GData.Client.dll -r/usr/local/lib/mono/GData-Sharp/Google.GData.Extensions.dll -r:/usr/local/lib/mono/GData-Sharp/Google.GData.YouTube.dll  </ins>
<ins>---</ins>
<ins>&gt; GDATASHARP_LIBS = -r:/usr/local/lib/mono/GData-Sharp/Google.GData.Client.dll -r:/usr/local/lib/mono/GData-Sharp/Google.GData.Extensions.dll -r:/usr/local/lib/mono/GData-Sharp/Google.GData.YouTube.dll  </ins>
<ins>}}</ins>
<ins />
<ins>#code(diff,src/Extensions/Banshee.NotificationArea/Notifications/Notification.cs){{</ins>
<ins>23c23</ins>
<ins>&lt; #if INTERNAL_NOTIFY_SHARP</ins>
<ins>---</ins>
<ins>&gt; //#if INTERNAL_NOTIFY_SHARP</ins>
<ins>388c388</ins>
<ins>&lt; #endif</ins>
<ins>---</ins>
<ins>&gt; //#endif</ins>
<ins>}}</ins>
<ins />
<ins>#code(diff,src/Extensions/Banshee.NotificationArea/Notifications/Notifications.cs){{</ins>
<ins>23c23</ins>
<ins>&lt; #if INTERNAL_NOTIFY_SHARP</ins>
<ins>---</ins>
<ins>&gt; //#if INTERNAL_NOTIFY_SHARP</ins>
<ins>98c98</ins>
<ins>&lt; #endif</ins>
<ins>---</ins>
<ins>&gt; //#endif</ins>
<ins>}}</ins>
<ins />
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1268344851</id>
    <link href="http://smdn.invisiblefulmoon.net/softwares/Banshee/" rel="alternate" />
    <published>2010-03-12T07:00:51+09:00</published>
    <title type="text">「Softwares/Banshee」を更新</title>
    <updated>2010-03-12T07:00:51+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/softwares/ffmpeg/pv4/">Softwares/FFmpeg/FFmpeg用PV4デコーダ</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/softwares/ffmpeg/pv4/">Softwares/FFmpeg/FFmpeg用PV4デコーダ</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,FFmpeg用PV4デコーダ}</ins>
<ins>${smdncms:keywords,FFmpeg,PV4,デコーダ,デマクサ}</ins>
<ins>*概要</ins>
<ins>FFmpegにアースソフト製ビデオキャプチャボード[[PV3/PV4:http://earthsoft.jp/PV/index.html]]のキャプチャファイルをデマックス・デコードする機能を追加するパッチです。</ins>
<ins />
<ins>*ダウンロード</ins>
<ins>本パッチはMIT X11ライセンスでのリリースとなります。</ins>
<ins>-FFmpeg(SVN-r22118)</ins>
<ins>--${smdncms:distfilelink,ffmpeg-r22118-earthsoftdv.patch,FFmpeg本体用}</ins>
<ins>--${smdncms:distfilelink,libavcodec-r22118-earthsoftdv.patch,libavcodecのみ}</ins>
<ins>--${smdncms:distfilelink,libavformat-r22118-earthsoftdv.patch,libavformatのみ}</ins>
<ins />
<ins>*パッチ適用・ビルド手順</ins>
<ins>trunkからチェックアウトしたソースに適用する例。</ins>
<ins>#code(bash){{</ins>
<ins>svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg</ins>
<ins>cd ffmpeg</ins>
<ins>patch -p0 &lt; ffmpeg-eathsoftdv.patch</ins>
<ins>}}</ins>
<ins />
<ins>パッチを有効にするには、configureで'--enable-demuxer=earthsoftdv'と'--enable-decoder=earthsoftdv'のオプションを指定します。</ins>
<ins>#code(sh){{</ins>
<ins>./configure --enable-demuxer=earthsoftdv --enable-decoder=earthsoftdv ...</ins>
<ins>}}</ins>
<ins />
<ins>configureした結果、'Enabled decoders'と'Enabled demuxers'の一覧に'earthsoftdv'が表示されていれば有効になっています。</ins>
<ins />
<ins>あとは、make、make installするだけです。</ins>
<ins>#code(bash){{</ins>
<ins>make</ins>
<ins>sudo make install</ins>
<ins>}}</ins>
<ins />
<ins>問題なくビルドできた場合、'ffmpeg -codecs'でコーデックの一覧に'earthsoftdv'が表示されるようになります。</ins>
<ins>#prompt{{</ins>
<ins>$ ffmpeg -codecs</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>Codecs:</ins>
<ins> D..... = Decoding supported</ins>
<ins> .E.... = Encoding supported</ins>
<ins> ..V... = Video codec</ins>
<ins> ..A... = Audio codec</ins>
<ins> ..S... = Subtitle codec</ins>
<ins> ...S.. = Supports draw_horiz_band</ins>
<ins> ....D. = Supports direct rendering method 1</ins>
<ins> .....T = Supports weird frame truncation</ins>
<ins> ------</ins>
<ins>  :</ins>
<ins> D V    earthsoftdv     Earthsoft PV3/PV4 DV video codec</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}}</ins>
<ins />
<ins>*使い方</ins>
<ins>通常のトランスコード方法と同じです。　dviファイルがない場合でもトランスコードできます。</ins>
<ins>#code(sh){{</ins>
<ins>ffmpeg -i 1280x720p.dv test.wmv</ins>
<ins>}}</ins>
<ins />
<ins>*動作状況</ins>
<ins>以下のフォーマットのファイルでトランスコードできることを確認済です。</ins>
<ins>-映像フォーマット</ins>
<ins>--1920x1080i</ins>
<ins>--1440x1080i</ins>
<ins>--1280x1080i</ins>
<ins>--1280x720p</ins>
<ins>--720x480i</ins>
<ins>--720x480p</ins>
<ins>-音声フォーマット</ins>
<ins>--リニアPCM</ins>
<ins />
<ins>以下の環境で動作することを確認済みです。</ins>
<ins>-Intel Core 2 Duo E6600 + Ubuntu 9.10 Desktop + FFmpeg(SVN-r22118)</ins>
<ins />
<ins>*不具合・要望等</ins>
<ins>不具合・要望等は[[掲示板&gt;misc/forum/tools]]へどうぞ。</ins>
<ins />
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1267395958</id>
    <link href="http://smdn.invisiblefulmoon.net/softwares/ffmpeg/pv4/" rel="alternate" />
    <published>2010-03-01T07:25:58+09:00</published>
    <title type="text">「Softwares/FFmpeg/FFmpeg用PV4デコーダ」を追加</title>
    <updated>2010-03-01T07:25:58+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
-[[works/libs/Smdn.Formats.Mime]]
-[[works/libs/Smdn.Formats.Ini]]

<ins>以下の2つのサンプルアプリケーションを含んでいます。　機能はほぼ同等です。</ins>
<ins>:TundereBird|Smdn.Net.Imap4.WebClients名前空間およびSmdn.Net.Pop3.WebClients名前空間のクラスを使って実装したサンプル</ins>
<ins>:TungireBird|Smdn.Net.Imap4.Client名前空間およびSmdn.Net.Pop3.Client名前空間のクラスを使って実装したサンプル</ins>
<ins />
*スクリーンショット
//&amp;ref(tunderebird.png);
&amp;ref(tunderebird-win.png);
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.27.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.27</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.27</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.25</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.17</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.26.tar.bz2}
---下記ライブラリのソースを同梱しています
----[[works/libs/Smdn.Net.Imap4]] 0.26
----[[works/libs/Smdn.Formats.Ini]] 0.10

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

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

*変更履歴
<ins>**0.27</ins>
<ins>-機能追加</ins>
<ins>--ImapClient/PopClientを使用したサンプルTungireBirdを追加</ins>
<ins>--サーバ証明書の確認ダイアログを表示するかどうか設定する項目を追加</ins>
<ins />
**0.26
-機能追加
--メッセージのContent-TypeとUnique IDを表示するカラムを追加した
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.27.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.26.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.25.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.24.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.27</ins>
<ins>主に新しいクライアント実装ImapClientの追加、ImapMessageまわりのインターフェイスの整理、LIST-EXTENDEDとLIST-STATUS関連の実装の修正。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--新しいクライアント実装ImapClientをSmdn.Net.Imap4.Client名前空間に追加(ただしインターフェイスは未確定、実装は不完全)</ins>
<ins>--ImapMessageまわりの実装・インターフェイスを変更、動的属性・静的属性・本文を別々のクラスで取り扱うようにした</ins>
<ins>-修正・改善</ins>
<ins>--ImapMailboxFlagListの代わりにIImapMailboxFlagSetインターフェイスを公開するように変更</ins>
<ins>--ImapMessageFlagListの代わりにIImapMessageFlagSetインターフェイスを公開するように変更</ins>
<ins>--\NonExistentフラグがセットされている既知のメールボックスに対してRENAME/CREATEできなくなる不具合を修正</ins>
<ins>--\NonExistentフラグがセットされている既知のメールボックスに対してSELECT/STATUSしようとした場合にImapProtocolViolationExceptionをスローするようにした</ins>
<ins>--APPENDの引数をImapMessageからIImapAppendMessageに変更</ins>
<ins>--STOREのoutパラメータをImapMessageからImapMessageAttributeに変更</ins>
<ins>--body-fld-dspのbody-fld-paramがNILの場合にArgumentNullExceptionがスローされる不具合を修正</ins>
<ins>--WebClients名前空間</ins>
<ins>---ImapWebResponse.Messagesプロパティを廃止、代わりにImapWebResponse.MessageAttributesプロパティを追加</ins>
<ins>---ResponseStreamからのReadの際に生じる内部バッファのコピー回数を減らした</ins>
<ins />
<ins>0.26と0.27のパフォーマンスの比較。</ins>
<ins>|~テストケース|&gt;|~テスト環境|</ins>
<ins>|~|Ubuntu 9.10 + Mono(r152382)|Windows Vista + .NET Framework 3.5|</ins>
<ins>|4kBのメッセージを1500回ダウンロード&amp;br;3回試行|[1]03.82sec -&gt; 03.99sec&amp;br;[2]03.70sec -&gt; 03.91sec&amp;br;[3]03.78src -&gt; 03.76sec|[1]04.82sec -&gt; 05.12sec&amp;br;[2]04.69sec -&gt; 04.91sec&amp;br;[3]04.74src -&gt; 05.46sec|</ins>
<ins>|17MBのメッセージを10回ダウンロード&amp;br;3回試行|[1]33.50sec -&gt; 31.37sec&amp;br;[2]32.50sec -&gt; 30.45sec&amp;br;[3]32.62src -&gt; 31.22sec|[1]42.58sec -&gt; 39.39sec&amp;br;[2]39.59sec -&gt; 39.43sec&amp;br;[3]40.06src -&gt; 39.94sec|</ins>
<ins />
**0.26
主にBODYSTRUCTURE関連の機能強化、下位ライブラリの実装改善、新しいクライアント実装を追加するための下準備。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.26時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.27時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
<del>個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間の説明を参照してください。</del>
<ins>個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間およびSmdn.Net.Imap4.Client名前空間の説明を参照してください。</ins>

**メッセージのダウンロード
<del>WebClientクラスを使って、localhostのINBOXメールボックスからUIDが1のメールをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</del>
<del>#code(cs){{</del>
<ins>localhostのINBOXメールボックスからUIDが1のメールをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</ins>
<ins>#code(cs,WebClientクラスを使う場合){{</ins>
using System;
using System.Net;

}
}}

<ins>#code(cs,ImapClientクラスを使う場合){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    using {</ins>
<ins>      client.Connect("pass");</ins>
<ins />
<ins>      using {</ins>
<ins>        var message = inbox.GetMessageByUid(1);</ins>
<ins />
<ins>        File.WriteAllBytes("sample.eml", message.ReadAllBytes());</ins>
<ins>      }</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
**メッセージのアップロード
<del>WebClientクラスを使って、localhostのINBOXメールボックスにsample.emlをアップロードするサンプル。</del>
<del>#code(cs){{</del>
<ins>localhostのINBOXメールボックスにsample.emlをアップロードするサンプル。</ins>
<ins>#code(cs, WebClientクラスを使う場合){{</ins>
using System;
using System.IO;
using System.Net;
}
}}

<ins>#code(cs,ImapClientクラスを使う場合){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    using {</ins>
<ins>      client.Connect("pass");</ins>
<ins />
<ins>      using {</ins>
<ins>        using {</ins>
<ins>          inbox.AppendMessage(messageStream);</ins>
<ins>        }</ins>
<ins>      }</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
**メッセージの検索
<del>WebRequestクラスを使って、Gmailアカウントのメールボックスからタイトルに[Mono-dev]を含むメールの一覧を取得する例。</del>
<del>#code(cs){{</del>
<ins>Gmailアカウントのメールボックスからタイトルに[Mono-dev]を含むメールの一覧を取得する例。</ins>
<ins>#code(cs,WebRequestクラスを使う場合){{</ins>
using System;
using System.Net;

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

    using {
<del>      foreach {</del>
<ins>      foreach {</ins>
        Console.WriteLine(message.Url);
      }
    }
}
}}

<ins>#code(cs,ImapClientクラスを使う場合){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Client;</ins>
<ins>using Smdn.Net.Imap4.Protocol.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    ImapConnection.ServerCertificateValidationCallback += delegate { return true; };</ins>
<ins />
<ins>    using {</ins>
<ins>      client.Connect("pass");</ins>
<ins />
<ins>      using {</ins>
<ins>        foreach {</ins>
<ins>          Console.WriteLine("UID {0}: {1}", message.Uid, message.Envelope.Subject);</ins>
<ins>        }</ins>
<ins>      }</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
*ライブラリの設計と実装の概要
<del>クライアントの実装は2種類あります。　一つはSmdn.Net.Imap4.Client.Session名前空間のImapSessionクラス、もう一つはSmdn.Net.Imap4.WebClients名前空間のImapWebRequest/ImapWebResponseクラスです。　Smdn.Net.Imap4.WebClients名前空間のクライアントは、System.Net.WebRequest/System.Net.WebResponseを継承したもので、内部でImapSessionクラスを使用しています。</del>
<ins>クライアントの実装は次の3種類があります。</ins>
<ins>+Smdn.Net.Imap4.Client.Session名前空間のImapSessionクラス</ins>
<ins>+Smdn.Net.Imap4.Client名前空間のImapClientクラス</ins>
<ins>+Smdn.Net.Imap4.WebClients名前空間のImapWebRequest/ImapWebResponseクラス</ins>

<del>二つのクライアントのモデルと概要は次の通りです。</del>
<ins>三つのクライアントのモデルと概要は次の通りです。</ins>

:ImapSessionクラス|IMAPのコマンドとほぼ1対1で対応するメソッドを持つクラスです。　IMAPの操作は抽象化していません。　仕様と1対1で対応するような実装にしてあります。
<del>切断する/されるまで選択済みメールボックス・メールボックス毎のフラグ・サーバの能力・名前空間等のセッションの状態を保持します。</del>
<del>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、送信されるIMAPコマンドをあまり意識せずに扱えます。　メッセージのダウンロード・アップロードにWebClientクラスのメソッドを使うこともできます。</del>
<ins>切断する/されるまで選択済みメールボックス・メールボックス毎のフラグ・サーバの能力・名前空間等のセッションの状態を保持します。　このクラスは他の2種類のクライアント実装で使用しています。</ins>
<ins>:ImapClientクラス|IMAPの操作を抽象化したクラスです。　メールボックス/メッセージをSystem.IO.DirectoryInfo/FileInfoクラスに似たインターフェイスで操作できるようにしてあります。</ins>
<ins>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、送信されるIMAPコマンドをあまり意識せずに扱えます。　System.Net.WebRequest/System.Net.WebResponseを継承しているので、メッセージのダウンロード・アップロードにWebClientクラスのメソッドを使うこともできます。</ins>
FtpWebRequest等と同様、WebRequest.Methodプロパティで送信するコマンドを制御できます。

以下でクライアント実装に共通する部分について解説します。　個々のクライアント実装の詳細については各項を参照してください。
リクエストURLがメールボックスを表す場合(imap://imap.example.net/mailboxの形式)のリクエストとレスポンスの動作は次のとおりです。

|Methodプロパティ|リクエスト|解説|レスポンス|h
<del>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得するのはメッセージの属性のみです。　メッセージ本文は取得しません。　取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</del>
<ins>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得するのはメッセージの属性のみです。　メッセージ本文は取得しません。　取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。|取得したメッセージの一覧は、ImapWebResponse.MessageAttributesプロパティに設定されます。|</ins>
|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に設定されます。|
リクエストURLがメールボックスに対する検索クエリを表す場合(imap://imap.example.net/mailbox?...の形式)のリクエストとレスポンスの動作は次のとおりです。

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

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

<ins>*Smdn.Net.Imap4.Client名前空間</ins>
<ins>Smdn.Net.Imap4.Client名前空間のクラスの使い方。　このドキュメントは作成中です。　前述のサンプルおよび[[works/tools/junk/TundereBird]]の実装を参照してください。</ins>
<ins />
*Smdn.Net.Imap4.Client.Session名前空間
Smdn.Net.Imap4.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Imap4.WebClientsの各クラスの実装を参照してください。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
その他、サポートしている機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。

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

**その他の主な特徴

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.26.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.27.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。

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

*動作状況
以下のIMAPサーバに対して概ね問題なく動作することを確認済みです。

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.27.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.26.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.25.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.24.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.27</ins>
<ins>主に新しいクライアント実装PopClientの追加とそれに付随する変更。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--新しいクライアント実装PopClientをSmdn.Net.Pop3.Client名前空間に追加(ただしインターフェイスは未確定、実装は不完全)</ins>
<ins>--PopUriBuilderを追加</ins>
<ins />
**0.26
主にライブラリ本体と下位ライブラリの実装改善、新しいクライアント実装を追加するための下準備。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.25時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.27時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
<del>個々のサンプルの詳細については、後述するSmdn.Net.Pop3.WebClients名前空間の説明を参照してください。</del>
<ins>個々のサンプルの詳細については、後述するSmdn.Net.Pop3.WebClients名前空間およびSmdn.Net.Pop3.Client名前空間の説明を参照してください。</ins>

**メッセージのダウンロード
<del>WebClientクラスを使って、localhostのメールボックスから1番目のメッセージをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</del>
<del>#code(cs){{</del>
<ins>localhostのメールボックスから1番目のメッセージをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</ins>
<ins>#code(cs,WebClientクラスを使う場合){{</ins>
using System;
using System.Net;

}
}}

<ins>#code(cs,PopClientクラスを使う場合){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Pop3;</ins>
<ins>using Smdn.Net.Pop3.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    using {</ins>
<ins>      client.Connect("pass");</ins>
<ins />
<ins>      var message = client.GetMessage(1);</ins>
<ins />
<ins>      File.WriteAllBytes("sample.eml", message.ReadAllBytes());</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
**メッセージ一覧の取得
<del>WebRequestクラスを使って、Gmailアカウントのメールボックスからメールの一覧を取得し、もっとも最近のメールをダウンロード・表示する例。</del>
<del>#code(cs){{</del>
<ins>Gmailアカウントのメールボックスからメールの一覧を取得し、もっとも最近のメールをダウンロード・表示する例。</ins>
<ins>#code(cs,WebRequestクラスを使う場合){{</ins>
using System;
using System.IO;
using System.Text;
}
}}

<ins>#code(cs,PopClientクラスを使う場合){{</ins>
<ins>using System;</ins>
<ins>using System.Collections.Generic;</ins>
<ins>using System.IO;</ins>
<ins>using System.Net;</ins>
<ins>using System.Text;</ins>
<ins />
<ins>using Smdn.Net.Pop3;</ins>
<ins>using Smdn.Net.Pop3.Client;</ins>
<ins>using Smdn.Net.Pop3.Protocol.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    PopConnection.ServerCertificateValidationCallback += delegate {</ins>
<ins>      return true;</ins>
<ins>    };</ins>
<ins />
<ins>    using {</ins>
<ins>      client.Connect("pass");</ins>
<ins />
<ins>      var messages = new List&lt;PopMessageInfo&gt;(client.GetMessages());</ins>
<ins>      var recentMessage = messages[messages.Count - 1];</ins>
<ins />
<ins>      using {</ins>
<ins>        Console.WriteLine(reader.ReadToEnd());</ins>
<ins>      }</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
*ライブラリの設計と実装の概要
このドキュメントは作成中です。


記述内容については[[ネットワーク設定スキーマ:http://msdn.microsoft.com/ja-jp/library/dacty7ed%28VS.80%29.aspx]]および[[構成セクション スキーマ:http://msdn.microsoft.com/ja-jp/library/0hyxd0xc%28VS.80%29.aspx]]も合わせて参照してください。

<ins>*Smdn.Net.Pop3.Client名前空間</ins>
<ins>Smdn.Net.Pop3.Client名前空間のクラスの使い方。　このドキュメントは作成中です。　前述のサンプルおよび[[works/tools/junk/TundereBird]]の実装を参照してください。</ins>
<ins />
*Smdn.Net.Pop3.Client.Session名前空間
Smdn.Net.Pop3.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Pop3.WebClientsの各クラスの実装を参照してください。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
**クライアント実装
クライアント実装として以下の2つのクラスを用意しています。
:PopSessionクラス|POPコマンドと1対1に対応するメソッドを持つクライアント
<ins>:PopClientクラス|メッセージをSystem.IO.FileInfoクラスに似たインターフェイスで操作できるようにPOP操作を抽象化したクライアント</ins>
:PopWebRequest/PopWebResponseクラス|WebRequest/WebResponseクラスから派生し、POP URL(&amp;urn2url(urn:ietf:rfc:2384,short);)での操作に対応したクライアント

**その他の主な特徴

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.26.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.27.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。

</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1267368015</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-02-28T23:40:15+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.27をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.27をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.27をリリース 「Works/Libraries/Smdn.Net.Imap4/リリース一覧」を更新 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Pop3/リリース一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル」を更新</title>
    <updated>2010-02-28T23:40:15+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
-[[works/libs/Smdn.Formats.Ini]]

*スクリーンショット
<del>&amp;ref(tunderebird.png); &amp;ref(tunderebird-win.png);</del>
<ins>//&amp;ref(tunderebird.png);</ins>
<ins>&amp;ref(tunderebird-win.png);</ins>

*ダウンロード
#googleadunit
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.26.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.26</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.26</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.25</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.17</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.25.tar.bz2}
---下記ライブラリのソースを同梱しています
----[[works/libs/Smdn.Net.Imap4]] 0.25
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

*変更履歴
<ins>**0.26</ins>
<ins>-機能追加</ins>
<ins>--メッセージのContent-TypeとUnique IDを表示するカラムを追加した</ins>
<ins>--メッセージの取得にかかった時間を出力するようにした</ins>
<ins>--IMAP</ins>
<ins>---メッセージのセクションごとに本文の取得と保存ができるようにした</ins>
<ins>-修正・改善</ins>
<ins>--Content-Typeの比較処理をcase insensitiveにした</ins>
<ins />
**0.25
-修正・改善
--IMAP
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.26.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.25.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.24.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.23.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.26</ins>
<ins>主にBODYSTRUCTURE関連の機能強化、下位ライブラリの実装改善、新しいクライアント実装を追加するための下準備。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--BODYSTRUCTUREまわりの実装とインターフェイスを整理した</ins>
<ins>--BODYSTRUCTUREを含むレスポンスからすべてのextension dataを取得できるようにした</ins>
<ins>--すべてのIImapBodyStructureからSECTIONを取得できるようにした</ins>
<ins>--FETCHでUIDも取得した場合に限り、すべてのIImapBodyStructureからSECTIONを含むURLを取得できるようにした</ins>
<ins>--ImapMailboxに上位のメールボックス名、階層末尾の名前を取得するプロパティを追加</ins>
<ins>--WebClients名前空間</ins>
<ins>---ImapWebRequest.FetchDataItemを追加</ins>
<ins>-修正・改善</ins>
<ins>--ストリームのアップグレードに失敗した場合、ImapUpgradeConnectionExceptionをスローするようにした</ins>
<ins>--SSL接続/STARTTLSに失敗した場合、ImapSecureConnectionExceptionをスローするようにした</ins>
<ins>--IDコマンドで送信するIDをDictionary&lt;string, string&gt;ではなくIDictionary&lt;string, string&gt;で引き受けるように変更</ins>
<ins>--ログ</ins>
<ins>---POP/IMAPのプロトコルログを分けて収集できるように修正</ins>
<ins>---プロトコルログのTraceSourceのnameを'IMAP'に変更</ins>
<ins>--パフォーマンス関連</ins>
<ins>---下位ライブラリの実装の最適化、バッファアロケーションと動作速度を改善</ins>
<ins>--WebClients名前空間</ins>
<ins>---すべて小文字でなければimapsスキームとみなされない不具合を修正</ins>
<ins>---LOGIN-REFERRAL, MAILBOX-REFERRALのサポートを削除</ins>
<ins />
<ins>0.25と0.26のパフォーマンスの比較。</ins>
<ins>|~テストケース|&gt;|~テスト環境|</ins>
<ins>|~|Ubuntu 9.10 + Mono(r151732)|Windows Vista + .NET Framework 3.5|</ins>
<ins>|4kBのメッセージを1500回ダウンロード&amp;br;3回試行|[1]04.50sec -&gt; 04.47sec&amp;br;[2]04.38sec -&gt; 04.38sec&amp;br;[3]04.58src -&gt; 03.90sec|[1]05.03sec -&gt; 04.89sec&amp;br;[2]04.77sec -&gt; 04.62sec&amp;br;[3]04.98src -&gt; 04.70sec|</ins>
<ins>|17MBのメッセージを10回ダウンロード&amp;br;3回試行|[1]34.95sec -&gt; 33.68sec&amp;br;[2]33.87sec -&gt; 34.79sec&amp;br;[3]33.78src -&gt; 34.62sec|[1]41.65sec -&gt; 38.39sec&amp;br;[2]39.92sec -&gt; 39.02sec&amp;br;[3]38.61src -&gt; 38.14sec|</ins>
<ins />
**0.25
主に未サポートだった拡張の実装、アプリケーション構成ファイルでの設定のサポート、パフォーマンスと.NET Frameworkでの動作の改善。

|4kBのメッセージを1500回ダウンロード&amp;br;2回試行|[1]06.05sec -&gt; 03.80sec&amp;br;[2]06.40sec -&gt; 04.46sec|[1]03.94sec -&gt; 03.68sec&amp;br;[2]04.04sec -&gt; 03.57sec|
|17MBのメッセージを10回ダウンロード&amp;br;2回試行|[1]45.00sec -&gt; 31.95sec&amp;br;[2]46.43sec -&gt; 32.78sec|[1]37.09sec -&gt; 32.54sec&amp;br;[2]36.99sec -&gt; 32.63sec|

<del />
**0.24
主にIMAP URL関連の修正と、WebClients名前空間のクラスでの非ASCII文字を含む検索とpartial fetchのサポート。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.25時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.26時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間の説明を参照してください。
リクエストURLがメールボックスを表す場合(imap://imap.example.net/mailboxの形式)のリクエストとレスポンスの動作は次のとおりです。

|Methodプロパティ|リクエスト|解説|レスポンス|h
<del>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得するのはメッセージの属性のみ(ALLマクロで取得されるフラグ、サイズ、internal date、エンベロープ)です。　メッセージ本文は取得しません。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</del>
<ins>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得するのはメッセージの属性のみです。　メッセージ本文は取得しません。　取得するメッセージ属性は、ImapWebRequest.FetchDataItemプロパティで指定します。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</ins>
|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に設定されます。|
リクエストURLがメールボックスに対する検索クエリを表す場合(imap://imap.example.net/mailbox?...の形式)のリクエストとレスポンスの動作は次のとおりです。

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

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

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

<ins>ImapWebRequest.FetchDataItemプロパティに指定できるマクロの値と、取得する属性の種類は次のとおりです。</ins>
<ins>|*ImapWebRequest.FetchDataItemプロパティに指定できる値</ins>
<ins>|値|取得される属性|</ins>
<ins>|ImapFetchDataItemMacro.All|ALLマクロで表される属性を取得します。　取得するのはFLAGS、INTERNALDATE、RFC822.SIZE、ENVELOPEです。|</ins>
<ins>|ImapFetchDataItemMacro.Fast|FASTマクロで表される属性を取得します。　取得するのはFLAGS、INTERNALDATE、RFC822.SIZEです。|</ins>
<ins>|ImapFetchDataItemMacro.Full|FULLマクロで表される属性を取得します。　取得するのはFLAGS、INTERNALDATE、RFC822.SIZE、ENVELOPE、BODYです。|</ins>
<ins>|ImapFetchDataItemMacro.Extensible|Fullと同じですが、BODYのかわりに拡張されたデータを含むBODYSTRUCTUREを取得します。|</ins>
<ins />
WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。

|*WebRequestクラスから継承されるプロパティ
|*ImapWebRequestクラスのプロパティ
|プロパティ|デフォルト|対象となるコマンド|解説|h
|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。　(この機能は現在動作しません。　trueにした場合、NotImplementedExceptionがスローされます)|
<del>|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)</del>

***ImapWebRequestクラスのデフォルト値の変更
ImapWebRequestDefaultsクラスのプロパティの値を変更することにより、ImapWebRequestクラスのプロパティに設定されるデフォルト値を一括して指定することができます。　全てのリクエストでデフォルトの値を変更したい場合は、ImapWebRequestDefaultsクラスのプロパティの値を変更してください。
      &lt;add key="readWriteTimeout" value="-1"/&gt;
      &lt;add key="fetchBlockSize" value="102400"/&gt;
      &lt;add key="fetchPeek" value="true"/&gt;
<ins>      &lt;add key="fetchDataItem" value="all"/&gt;</ins>
      &lt;add key="subscription" value="true"/&gt;
      &lt;add key="allowCreateMailbox" value="true"/&gt;
      &lt;add key="useTlsIfAvailable" value="true"/&gt;
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.25.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.26.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|CLOSE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.2,short);|&amp;color(green){implemented};||
|EXPUNGE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.3,short);|&amp;color(green){implemented};||
|SEARCH, UID SEARCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.4,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.6,short);|&amp;color(green){implemented};|非ASCII文字での検索に対応&amp;sub{*2};|
<del>|FETCH, UID FETCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.5,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.4,short);|&amp;color(green){implemented};|body-extension fieldsはレスポンスに含まれていても無視します。|</del>
<ins>|FETCH, UID FETCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.5,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.4,short);|&amp;color(green){implemented};||</ins>
|STORE, UID STORE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.6,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.5,short);|&amp;color(green){implemented};||
|COPY, UID COPY|&amp;urn2url(urn:ietf:rfc:3501,#6.4.7,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short);|&amp;color(green){implemented};|Modified UTF-7対応&amp;sub{*1};|
|~Extensions|-|-|-|
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
--base64, quoted-printable, 7bit, 8bit, binary
-MIME Encoding
--B-Encoding(base64), Q-Encoding(quoted-printable)
<ins>-メッセージのパース・デコード</ins>
<ins>-メッセージの組み立て・エンコード(不完全)</ins>

*ダウンロード
#googleadunit
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.1x
<ins>--${smdncms:distfilelink,Smdn.Formats.Mime-0.17.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Formats.Mime-0.16.tar.bz2}
--${smdncms:distfilelink,Smdn.Formats.Mime-0.15.tar.bz2}
--${smdncms:distfilelink,Smdn.Formats.Mime-0.14.tar.bz2}
本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。

*変更履歴
<ins>**0.17</ins>
<ins>-機能追加</ins>
<ins>--Content-Transfer-EncodingおよびCharsetに基づいてデコード・エンコードするStreamを取得するためのユーティリティメソッドを追加</ins>

**0.16
-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース
*動作状況
以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

version 0.13の時点では、手元にある計9,189通のメール(スパム、メーリングリスト・メールマガジンから、携帯から、添付ファイル付きなどを含む)を解析した結果、ほぼ正常に解析できています。　ただし解析した結果が「読める」かどうかまでは検証していません。　またMono 1.9ではJISからのデコードが出来ない場合があるようです。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.26.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.25.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.24.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.23.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.26</ins>
<ins>主にライブラリ本体と下位ライブラリの実装改善、新しいクライアント実装を追加するための下準備。</ins>
<ins />
<ins>-修正・改善</ins>
<ins>--SSL接続/STLSに失敗した場合、PopUpgradeConnectionExceptionをスローするようにした</ins>
<ins>--ログ</ins>
<ins>---POP/IMAPのプロトコルログを分けて収集できるように修正</ins>
<ins>---プロトコルログのTraceSourceのnameを'POP'に変更</ins>
<ins>--パフォーマンス関連</ins>
<ins>---下位ライブラリの実装の最適化、バッファアロケーションと動作速度を改善</ins>
<ins>---RETR/TOPの実装を修正、取得したレスポンスは保持せずに破棄するようにし、またオーバーヘッドが少なくなるようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---すべて小文字でなければpopsスキームとみなされない不具合を修正</ins>
<ins />
<ins>0.25と0.26のパフォーマンスの比較。</ins>
<ins>|~テストケース|&gt;|~テスト環境|</ins>
<ins>|~|Ubuntu 9.10 + Mono(r151732)|Windows Vista + .NET Framework 3.5|</ins>
<ins>|4kBのメッセージを1500回ダウンロード&amp;br;3回試行|[1]04.39sec -&gt; 02.97sec&amp;br;[2]04.62sec -&gt; 02.80sec&amp;br;[3]04.55src -&gt; 02.65sec|[1]04.31sec -&gt; 03.93sec&amp;br;[2]03.89sec -&gt; 04.06sec&amp;br;[3]04.19src -&gt; 04.07sec|</ins>
<ins>|17MBのメッセージを10回ダウンロード&amp;br;3回試行|[1]66.18sec -&gt; 30.13sec&amp;br;[2]60.20sec -&gt; 30.09sec&amp;br;[3]60.12src -&gt; 29.24sec|[1]20.93sec -&gt; 18.19sec&amp;br;[2]21.23sec -&gt; 18.29sec&amp;br;[3]21.38src -&gt; 18.30sec|</ins>
<ins />
**0.25
主にアプリケーション構成ファイルでの設定のサポート、パフォーマンスと.NET Frameworkでの動作の改善。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.25.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.26.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。

</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1266781663</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-02-22T04:47:43+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.26をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.26をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.26をリリース 「Works/Libraries/Smdn.Formats.Mime」 version 0.17をリリース 「Works/Libraries/Smdn.Net.Imap4/リリース一覧」を更新 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/リリース一覧」を更新</title>
    <updated>2010-02-22T04:47:43+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.25.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.25</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.25</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.25</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.16</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.24.tar.bz2}
---下記ライブラリのソースを同梱しています
----[[works/libs/Smdn.Net.Imap4]] 0.24
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

*変更履歴
<ins>**0.25</ins>
<ins>-修正・改善</ins>
<ins>--IMAP</ins>
<ins>---送信するIDにsupport-urlを含めるようにした</ins>
<ins>--POP</ins>
<ins>---設定ファイルのCertFilesに記載されているサーバ証明書を読み込んでいなかったのを修正</ins>
<ins />
**0.24
-修正・改善
--パスワードの入力ダイアログを追加、設定ファイルにパスワードを記入しなくても接続できるようにした。
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/releases/">Works/Libraries/Smdn.Net.Imap4/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.25.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.24.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.23.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Imap4.Client-0.22.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.25</ins>
<ins>主に未サポートだった拡張の実装、アプリケーション構成ファイルでの設定のサポート、パフォーマンスと.NET Frameworkでの動作の改善。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:2087){QUOTA};に対応</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:3516){BINARY}; FETCH/APPENDに対応(実機での動作は未確認)</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:5464){METADATA};に対応(実機での動作は未確認)</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:5466){FILTERS};に部分的に対応(実機での動作は未確認)</ins>
<ins>--WebClients名前空間</ins>
<ins>---アプリケーション構成ファイルのconfiguration/system.net/webRequestModules要素でimap/imapsスキームを登録できるようにした</ins>
<ins>---ImapWebRequestDefaultsクラスを追加、コード内もしくはアプリケーション構成ファイルでImapWebRequestの各プロパティのデフォルト値を設定できるようにした</ins>
<ins>---ImapWebRequest.FetchPeekプロパティを追加</ins>
<ins>-修正・改善</ins>
<ins>--ImapResponseCodeをSmdn.Net.Imap4.Protocol.ClientからSmdn.Net.Imap4.Protocolに移動</ins>
<ins>--SslStream.AuthenticateAsClientでAuthenticationExceptionが発生した場合、ストリームを閉じるようにした</ins>
<ins>--ライブラリ内のメッセージとサーバからのレスポンスを区別できるように内部処理と書式を変更した</ins>
<ins>--Mono 2.6.x, Mono 2.4.xで文字列からDateTimeOffsetへの変換でFormatExceptionがスローされないようにした</ins>
<ins>--パフォーマンス関連</ins>
<ins>---レスポンスパーサの実装を最適化、冗長な処理を削除</ins>
<ins>---文字列比較処理を最適化</ins>
<ins>---ロック処理にSemaphoreを使用していた箇所をMonitorに置き換えた</ins>
<ins>--.NET Framework関連</ins>
<ins>---NetworkCredentialの各プロパティがnullを返すことを期待していた実装を修正、nullではなくstring.Emptyの場合に認証をキャンセルするようにした</ins>
<ins>---SocketError.TimedOutのSocketExceptionが発生した場合、ImapConnectionExceptionではなくTimeoutExceptionをスローするようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---SslStream作成用のコールバック、証明書関連のコールバックのプロパティ名を変更、また値をImapConnectionと共有しないようにした</ins>
<ins>---ImapSessionManagerからIWebRequestCreateの実装を分離、WebRequest.RegisterPrefixはImapWebRequestCreator.RegisterPrefixで行うようにした</ins>
<ins>---RequestStreamへの書き込み待ち合わせにAutoResetEventを使用していた箇所をMonitorに置き換えた</ins>
<ins>---ImapWebRequestDefaults.Subscriptionがtrueの場合はLSUB、falseの場合はLISTをImapWebRequest.Methodプロパティのデフォルトとするようにした</ins>
<ins />
<ins>0.24と0.25のパフォーマンスの比較。</ins>
<ins>|~テストケース|&gt;|~テスト環境|</ins>
<ins>|~|Ubuntu 9.10 + Mono(r148762)|Windows Vista + .NET Framework 3.5|</ins>
<ins>|4kBのメッセージを1500回ダウンロード&amp;br;2回試行|[1]06.05sec -&gt; 03.80sec&amp;br;[2]06.40sec -&gt; 04.46sec|[1]03.94sec -&gt; 03.68sec&amp;br;[2]04.04sec -&gt; 03.57sec|</ins>
<ins>|17MBのメッセージを10回ダウンロード&amp;br;2回試行|[1]45.00sec -&gt; 31.95sec&amp;br;[2]46.43sec -&gt; 32.78sec|[1]37.09sec -&gt; 32.54sec&amp;br;[2]36.99sec -&gt; 32.63sec|</ins>
<ins />
<ins />
**0.24
主にIMAP URL関連の修正と、WebClients名前空間のクラスでの非ASCII文字を含む検索とpartial fetchのサポート。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.24時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.25時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間の説明を参照してください。
class Sample {
  public static void Main(string[] args)
  {
<del>    ImapSessionManager.RegisterWebRequestPrefix();</del>
<ins>    ImapWebRequestCreator.RegisterPrefix();</ins>

    using {
      client.Credentials = new NetworkCredential("user", "pass");
class Sample {
  public static void Main(string[] args)
  {
<del>    ImapSessionManager.RegisterWebRequestPrefix();</del>
<ins>    ImapWebRequestCreator.RegisterPrefix();</ins>

    using {
      client.Credentials = new NetworkCredential("user", "pass");
class Sample {
  public static void Main(string[] args)
  {
<del>    ImapSessionManager.RegisterWebRequestPrefix();</del>
<del>    ImapSessionManager.CertificateValidationCallback = delegate { return true; };</del>
<ins>    ImapWebRequestCreator.RegisterPrefix();</ins>
<ins>    ImapSessionManager.ServerCertificateValidationCallback = delegate { return true; };</ins>

    var request = WebRequest.Create("imaps://user@imap.gmail.com/INBOX?SUBJECT \"[Mono-dev]\"");

|*証明書に関する型と該当するメンバ(いずれもクラス・プロパティ)
|~証明書に関する型|&gt;|~該当するメンバ|h
|~|~Smdn.Net.Imap4.Protocol.Client名前空間|~Smdn.Net.Imap4.WebClients名前空間|
<del>|X509Certificate2Collection|ImapConnection.CertCollection|ImapSessionManager.CertCollection|</del>
<del>|RemoteCertificateValidationCallback|ImapConnection.CertificateValidationCallback|ImapSessionManager.CertificateValidationCallback|</del>
<del>|LocalCertificateSelectionCallback|ImapConnection.CertificateSelectionCallback|ImapSessionManager.CertificateSelectionCallback|</del>
<ins>|X509Certificate2Collection|ImapConnection.ClientCertificates|ImapSessionManager.ClientCertificates|</ins>
<ins>|RemoteCertificateValidationCallback|ImapConnection.ServerCertificateValidationCallback|ImapSessionManager.ServerCertificateValidationCallback|</ins>
<ins>|LocalCertificateSelectionCallback|ImapConnection.ClientCertificateSelectionCallback|ImapSessionManager.ClientCertificateSelectionCallback|</ins>

**操作とデータ構造
ImapSessionクラスには、IMAPコマンドと1対1に対応するメソッドが用意されています。　また、すべてのコマンドの引数とレスポンスのデータ構造は、それに対応する型が定義されています。　これらの型は出来る限り仕様と1対1で対応するように実装してあり、IMAPの詳細が分からなくても使えることを目的とするような抽象化はしていません。
の順でIMAPコマンドを実行、レスポンスを取得できます。　以下でSmdn.Net.Imap4.WebClientsに固有な部分について解説します。

**imap, imapsスキームの登録
<del>Smdn.Net.Imap4.WebClients名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</del>
<ins>Smdn.Net.Imap4.WebClients名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapWebRequestCreator.RegisterPrefixメソッドを呼び出しておく必要があります。</ins>

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

**リクエストURLと接続時の動作
<ins>接続時の動作は&amp;urn2url(urn:ietf:rfc:5092);に記述されている内容に準じた動作となるようにしています。　(ただしimapsスキームを使用した場合にSSL/TLSでの接続を試みる動作は本ライブラリ固有の動作です)</ins>
<ins />
***SSL/TLS・接続ポート
リクエストURLのスキームがimapsの場合は、常にSSL/TLSでの接続を試みます。　スキームがimapの場合は、ImapWebRequest.UseTlsIfAvailableプロパティがtrueで、かつサーバがSTARTTLSに対応している場合、認証を開始する前にSSL/TLSを使用した接続にアップグレードします。 URLでポート番号を指定しない場合、デフォルトのポート(imapは143、imapsは993)に接続します。


|*リクエストURLの形式と認証動作の例
|リクエストURLの形式|ユーザ名|使用する認証メカニズム|h
<del>|imap://user;AUTH=DIGEST-MD5@imap.example.net/|user|DIGEST-MD5|</del>
<del>|imap://;AUTH=DIGEST-MD5@imap.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</del>
<del>|imap://user;AUTH=*@imap.example.net/&amp;br;imap://user@imap.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</del>
<del>|imap://;AUTH=ANONYMOUS@imap.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</del>
<ins>|imap://user;AUTH=DIGEST-MD5&amp;#x40;imap.example.net/|user|DIGEST-MD5|</ins>
<ins>|imap://;AUTH=DIGEST-MD5&amp;#x40;imap.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</ins>
<ins>|imap://user;AUTH=*&amp;#x40;imap.example.net/&amp;br;imap://user&amp;#x40;imap.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</ins>
<ins>|imap://;AUTH=ANONYMOUS&amp;#x40;imap.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</ins>
|imap://imap.example.net/|匿名ユーザ(anonymous)|ANONYMOUSもしくはLOGINコマンドを使用|

試行する認証メカニズムを制御するには、後述するImapWebRequest.UsingSaslMechanismsプロパティの値を変更してください。

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

<del>ImapWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。　以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。　ImapWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては別項で説明します。</del>
<ins>ImapWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。　基本的な動作は&amp;urn2url(urn:ietf:rfc:5092);に記述されている内容に準じたものになっていますが、ImapWebRequestは本ライブラリ固有の拡張を含んでいます。</ins>
<ins />
<ins>以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。　ImapWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては別項で説明します。</ins>

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

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

|*ImapWebRequestクラスのプロパティ
<del>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</del>
<del>|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます|</del>
<ins>|プロパティ|デフォルト|対象となるコマンド|解説|h</ins>
<ins>|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます。|</ins>
|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|
|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。|
|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。　サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|
|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をスローします。|
<del>|Subscription|true|CREATE, DELETE, RENAME, COPY|メールボックスを作成・削除する際に、対象のメールボックスを自動的にSUBSCRIBE/UNSUBSCRIBEコマンドを送信して購読・購読解除するかどうかを指定します。|</del>
<ins>|Subscription|true|CREATE, DELETE, RENAME, COPY|メールボックスを作成・削除する際に、対象のメールボックスに対して自動的にSUBSCRIBE/UNSUBSCRIBEコマンドを送信し、購読・購読解除するかどうかを指定します。|</ins>
|StoreDataItem|null|STORE|STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。|
|StatusDataItem|null|STATUS|STATUSコマンドで取得するメールボックスの情報を指定します。|
|SortCriteria|null|SORT|SORTコマンドで使用するソート方法を指定します。|
|ThreadingAlgorithm|null|THREAD|THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。|
|FetchBlockSize|10240|FETCH|FETCHコマンドでメッセージ本文を取得する際に、1回のFETCHコマンドで取得するブロックのサイズをバイト単位で指定します。|
<ins>|FetchPeek|true|FETCH|FETCHコマンドでメッセージ本文を取得する際に、BODY.PEEK[]とBODY[]のどちらを使用するかを指定します。　trueの場合はBODY.PEEK[]が使用され、取得したメッセージは未読のままになります。|</ins>

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

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

以下のプロパティは、未テスト・不完全な実装に関連するプロパティです。　使用はできますが、今後廃止する可能性もあるので、現時点では使用を推奨できません。
|*ImapWebRequestクラスのプロパティ
<del>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</del>
<ins>|プロパティ|デフォルト|対象となるコマンド|解説|h</ins>
|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。　(この機能は現在動作しません。　trueにした場合、NotImplementedExceptionがスローされます)|
|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)

<ins>***ImapWebRequestクラスのデフォルト値の変更</ins>
<ins>ImapWebRequestDefaultsクラスのプロパティの値を変更することにより、ImapWebRequestクラスのプロパティに設定されるデフォルト値を一括して指定することができます。　全てのリクエストでデフォルトの値を変更したい場合は、ImapWebRequestDefaultsクラスのプロパティの値を変更してください。</ins>
<ins />
<ins>ImapWebRequestDefaultsクラスにはImapWebRequestプロパティと同名のプロパティを用意してありますが、以下の一覧にあるプロパティはImapWebRequestでは設定できないプロパティです。</ins>
<ins />
<ins>|*ImapWebRequestDefaultsクラスのプロパティ</ins>
<ins>|プロパティ|デフォルト|解説|h</ins>
<ins>|AnonymousToken|"anonymous"|匿名ユーザでログインする場合に使用されるユーザ名を指定します。|</ins>
<ins>|Subscription|true|ImapWebRequest.Subscriptionプロパティと同様ですが、falseにした場合WebRequest.Methodのデフォルト値が"LSUB"から"LIST"に変わります。|</ins>
<ins>|ClientID|name=(現在実行中のアセンブリの名前)&amp;br;version=(現在実行中のアセンブリのバージョン)&amp;br;environment=(ランタイムの名前とバージョン)|サーバが&amp;urn2url(urn:ietf:rfc:2971){ID extension};をサポートしている場合に送信されるIDを指定します。|</ins>
<ins />
***リクエストとIMAP URLに関するその他の留意事項
-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。　現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。

<ins>**アプリケーション構成ファイルでの設定</ins>
<ins>アプリケーション構成ファイルを記述することにより、imap, imapsスキームの登録と、ImapWebRequestDefaultsクラスの値を変更することができます。　コード上での変更をしたくない場合、する必要がない場合などは、アプリケーション構成ファイルに設定を記述することができます。　以下はアプリケーション構成ファイルの記述例です。</ins>
<ins />
<ins>#code(xml,アプリケーション構成ファイルの記述例){{</ins>
<ins>&lt;?xml version="1.0" encoding="utf-8" ?&gt;</ins>
<ins>&lt;configuration&gt;</ins>
<ins>  &lt;configSections&gt;</ins>
<ins>    &lt;!-- smdn.net.imap4.client要素を処理するためのセクションハンドラクラスの設定 --&gt;</ins>
<ins>    &lt;sectionGroup name="smdn.net.imap4.client"&gt;</ins>
<ins>      &lt;section name="webRequestDefaults" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/&gt;</ins>
<ins>    &lt;/sectionGroup&gt;</ins>
<ins>  &lt;/configSections&gt;</ins>
<ins>  &lt;system.net&gt;</ins>
<ins>    &lt;!-- imap, imapsスキームの登録 --&gt;</ins>
<ins>    &lt;webRequestModules&gt;</ins>
<ins>      &lt;add prefix="imap"  type="Smdn.Net.Imap4.WebClients.ImapWebRequestCreator, Smdn.Net.Imap4.Client" /&gt;</ins>
<ins>      &lt;add prefix="imaps" type="Smdn.Net.Imap4.WebClients.ImapWebRequestCreator, Smdn.Net.Imap4.Client" /&gt;</ins>
<ins>    &lt;/webRequestModules&gt;</ins>
<ins>  &lt;/system.net&gt;</ins>
<ins>  &lt;smdn.net.imap4.client&gt;</ins>
<ins>    &lt;!-- ImapWebRequestDefaultsクラスのデフォルト値の変更 --&gt;</ins>
<ins>    &lt;webRequestDefaults&gt;</ins>
<ins>      &lt;add key="timeout" value="-1"/&gt;</ins>
<ins>      &lt;add key="readWriteTimeout" value="-1"/&gt;</ins>
<ins>      &lt;add key="fetchBlockSize" value="102400"/&gt;</ins>
<ins>      &lt;add key="fetchPeek" value="true"/&gt;</ins>
<ins>      &lt;add key="subscription" value="true"/&gt;</ins>
<ins>      &lt;add key="allowCreateMailbox" value="true"/&gt;</ins>
<ins>      &lt;add key="useTlsIfAvailable" value="true"/&gt;</ins>
<ins>      &lt;add key="keepAlive" value="true"/&gt;</ins>
<ins>      &lt;add key="readOnly" value="false"/&gt;</ins>
<ins>      &lt;add key="anonymousToken" value="anonymous"/&gt;</ins>
<ins>      &lt;add key="usingSaslMechanisms" value="DIGEST-MD5, CRAM-MD5, NTLM"/&gt;</ins>
<ins>      &lt;add key="expectedErrorResponseCodes" value="ALREADYEXISTS, NONEXISTENT"/&gt;</ins>
<ins>      &lt;add key="clientID" value="name=MyImapClient, support-url=http://imap.example.net/support/"/&gt;</ins>
<ins>    &lt;/webRequestDefaults&gt;</ins>
<ins>  &lt;/smdn.net.imap4.client&gt;</ins>
<ins>&lt;/configuration&gt;</ins>
<ins>}}</ins>
<ins />
<ins>記述内容については[[ネットワーク設定スキーマ:http://msdn.microsoft.com/ja-jp/library/dacty7ed%28VS.80%29.aspx]]および[[構成セクション スキーマ:http://msdn.microsoft.com/ja-jp/library/0hyxd0xc%28VS.80%29.aspx]]も合わせて参照してください。</ins>
<ins />
**サンプル
***メッセージのコピー
INBOXにあるメッセージすべてをINBOX.backupにコピーする例。　AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。
using System;
using System.Net;
using Smdn.Net.Imap4;
<del>using Smdn.Net.Imap4.Protocol.Client;</del>
<ins>using Smdn.Net.Imap4.Protocol;</ins>
using Smdn.Net.Imap4.WebClients;
  :

using System;
using System.Net;
using Smdn.Net.Imap4;
<del>using Smdn.Net.Imap4.Protocol.Client;</del>
<ins>using Smdn.Net.Imap4.Protocol;</ins>
using Smdn.Net.Imap4.WebClients;
  :

using System.Text;

using Smdn.Net.Imap4;
<del>using Smdn.Net.Imap4.Protocol.Client;</del>
using Smdn.Net.Imap4.WebClients;
  :

class Sample {
  public static void Main()
  {
<del>    ImapConnection.CertificateValidationCallback += delegate {</del>
<ins>    ImapConnection.ServerCertificateValidationCallback += delegate {</ins>
      return true;
    };

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
--[[works/libs/Smdn.Formats.Mime]]

*機能
<del>すべての標準コマンドといくつかの拡張コマンドの送受信、SSL/TLS接続(IMAP over SSL, STARTTLS)、SASL認証メカニズムなどに対応しています。</del>
<ins>**主な機能</ins>
<ins>+すべての標準コマンドの送受信</ins>
<ins>+いくつかの拡張コマンドの送受信</ins>
<ins>++IDLE</ins>
<ins>++QUOTA</ins>
<ins>++SORT/THREADほか</ins>
<ins>+SSL/TLS接続(IMAP over SSL, STARTTLS)</ins>
<ins>+SASL認証メカニズム(DIGEST-MD5他)</ins>

<del>使用可能なコマンド</del>
<del>:認証系コマンド|LOGIN, AUTHENTICATE, LOGOUT, STARTTLS</del>
<del>::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</del>
<del>SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています</del>
<del>:メールボックス操作系コマンド|</del>
<del>::標準コマンド|CREATE, RENAME, DELETE, CLOSE, SELECT, EXAMINE, LIST, LSUB, STATUS, SUBSCRIBE, UNSUBSCRIBE</del>
<del>::拡張コマンド|RLIST, RLSUB, LIST(LIST-EXTENDED), XLIST(Gimap), UNSELECT, NAMESPACE</del>
<del>:メッセージ操作系コマンド|</del>
<del>::標準コマンド|APPEND,SEARCH, EXPUNGE</del>
<del>::拡張コマンド|(UID)SORT,, UID EXPUNGE</del>
<del>:その他のコマンド|</del>
<del>::標準コマンド|NOOP, CHECK, CAPABILITY</del>
<del>::拡張コマンド|ENABLE, COMPRESS, IDLE, ID, COMPARATOR, LANGUAGE</del>
<ins>その他、サポートしている機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。</ins>

<del>実装しているクライアントは次の二種類です。</del>
<ins>**クライアント実装</ins>
<ins>クライアント実装として以下の2つのクラスを用意しています。</ins>
:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント
:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)での操作に対応したクライアント

<del>その他、サポートしている機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。</del>
<ins>**その他の主な特徴</ins>
<ins>:メッセージ本文はStreamとして取得可能|メッセージの加工・解析は任意の手段を使用できるよう、Streamとして返します。　MIMEメッセージのデコード機能は含んでいません。</ins>
<ins>:StreamReader, Regexは不使用|送受信時の文字列処理はstringではなくbyte[]のまま処理しています。　byte[]⇄stringの変換に起因する不必要なメモリの消費と速度の低下はできる限り抑えてあります。　また、大きなメッセージを取得してもLarge Object Heapを消費しないよう実装しています。</ins>
<ins>:ログ出力にTraceSourceを使用|送受信内容・動作状況のログをTraceListenerで取得できます。　またログ出力のレベルを設定できます。　イベントハンドラによる送受信時のフックは無駄と考え用意していません。</ins>
<ins>:パース済みのレスポンスにアクセス可能|受信したレスポンスは必要な部分だけを拾い読みして結果を返すのではなく、全てパースしてから結果を返します。</ins>
<ins>:フリー・オープンソース|本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]を採用しています。</ins>

*ダウンロード
#googleadunit

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.24.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.25.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
class GimapFetchExample {
  public static void Main()
  {
<del>    ImapSessionManager.RegisterWebRequestPrefix();</del>
<del>    ImapSessionManager.CertificateValidationCallback += delegate {</del>
<ins>    ImapWebRequestCreator.RegisterPrefix();</ins>
<ins>    ImapSessionManager.ServerCertificateValidationCallback += delegate {</ins>
      return true;
    };


*制限事項・特記事項
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
<del>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</del>
<ins>-SASLの実装は、本体とは別ライブラリの[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています。</ins>
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、十分な検証は行っていないため保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</ins>

*参考文献
#amazon(4873110289,left,content)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
**standards and IMAP extensions
サポートする標準仕様およびIMAP拡張仕様の一覧です。　標準化されていないドラフトも一部サポートしています。
|RFC|capability name|status|note|h
<del>|&amp;urn2url(urn:ietf:rfc:2087,anchor-text);|QUOTA|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:2087,anchor-text);|QUOTA|&amp;color(green){implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:2088,anchor-text);|LITERAL+|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:2177,anchor-text);|IDLE|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:2180,anchor-text);|-|&amp;color(orange){partially implemented};||
|&amp;urn2url(urn:ietf:rfc:3348,anchor-text);|CHILDREN|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:3501,anchor-text);|IMAP4rev1|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:3502,anchor-text);|MULTIAPPEND|&amp;color(green){implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:3516,anchor-text);|BINARY|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:3516,anchor-text);|BINARY|&amp;color(red){not tested};||</ins>
|&amp;urn2url(urn:ietf:rfc:3691,anchor-text);|UNSELECT|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4314,anchor-text);|ACL|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:4314,anchor-text);|RIGHTS=*|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5267,anchor-text);|CONTEXT=SEARCH|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5267,anchor-text);|CONTEXT=SORT|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5267,anchor-text);|ESORT|&amp;color(green){implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:5464,anchor-text);|METADATA|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:5464,anchor-text);|METADATA-SERVER|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:5464,anchor-text);|METADATA|&amp;color(red){not tested};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:5464,anchor-text);|METADATA-SERVER|&amp;color(red){not tested};||</ins>
|&amp;urn2url(urn:ietf:rfc:5465,anchor-text);|NOTIFY|&amp;color(gray){not implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:5466,anchor-text);|FILTERS|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:5466,anchor-text);|FILTERS|&amp;color(red){not tested};||</ins>
|&amp;urn2url(urn:ietf:rfc:5524,anchor-text);|URLAUTH=BINARY|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5530,anchor-text);|-|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,anchor-text);|SEARCH=INTHREAD|&amp;color(green){implemented};||
|STORE, UID STORE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.6,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.5,short);|&amp;color(green){implemented};||
|COPY, UID COPY|&amp;urn2url(urn:ietf:rfc:3501,#6.4.7,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short);|&amp;color(green){implemented};|Modified UTF-7対応&amp;sub{*1};|
|~Extensions|-|-|-|
<del>|SETQUOTA|&amp;urn2url(urn:ietf:rfc:2087,#4.1,short);|&amp;color(gray){not implemented};||</del>
<del>|GETQUOTA|&amp;urn2url(urn:ietf:rfc:2087,#4.2,short);|&amp;color(gray){not implemented};||</del>
<del>|GETQUOTAROOT|&amp;urn2url(urn:ietf:rfc:2087,#4.3,short);|&amp;color(gray){not implemented};||</del>
<ins>|SETQUOTA|&amp;urn2url(urn:ietf:rfc:2087,#4.1,short);|&amp;color(green){implemented};||</ins>
<ins>|GETQUOTA|&amp;urn2url(urn:ietf:rfc:2087,#4.2,short);|&amp;color(green){implemented};||</ins>
<ins>|GETQUOTAROOT|&amp;urn2url(urn:ietf:rfc:2087,#4.3,short);|&amp;color(green){implemented};||</ins>
|IDLE|&amp;urn2url(urn:ietf:rfc:2177,#3,short);|&amp;color(green){implemented};||
|RLIST|&amp;urn2url(urn:ietf:rfc:2193,#5.1,short);|&amp;color(red){not tested};||
|RLSUB|&amp;urn2url(urn:ietf:rfc:2193,#5.2,short);|&amp;color(red){not tested};||
|THREAD, UID THREAD|&amp;urn2url(urn:ietf:rfc:5256,#3,short);|&amp;color(green){implemented};|非ASCII文字での検索に対応&amp;sub{*2};|
|CONVERSIONS|&amp;urn2url(urn:ietf:rfc:5259,#5.1,short);|&amp;color(gray){not implemented};||
|CONVERT, UID CONVERT|&amp;urn2url(urn:ietf:rfc:5259,#6,short);|&amp;color(gray){not implemented};||
<del>|GETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.2,short);|&amp;color(gray){not implemented};||</del>
<del>|SETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.3,short);|&amp;color(gray){not implemented};||</del>
<ins>|GETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.2,short);|&amp;color(red){not tested};||</ins>
<ins>|SETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.3,short);|&amp;color(red){not tested};||</ins>
|NOTIFY|&amp;urn2url(urn:ietf:rfc:5465,#3.1,short);|&amp;color(gray){not implemented};||
|CREATE with special-use flags|&amp;urn2url(urn:ietf:id:ietf-morg-list-specialuse-00,anchor-text);|&amp;color(gray){not implemented};||
|LIST with STATUS return option|&amp;urn2url(urn:ietf:id:ietf-morg-status-in-list-01,anchor-text);|&amp;color(green){implemented};||
|UIDNEXT|&amp;urn2url(urn:ietf:rfc:3501,short);|&amp;color(green){implemented};||
|UIDVALIDITY|&amp;urn2url(urn:ietf:rfc:3501,short);|&amp;color(green){implemented};||
|UNSEEN|&amp;urn2url(urn:ietf:rfc:3501,short);|&amp;color(green){implemented};||
<del>|UNKNOWN-CTE|&amp;urn2url(urn:ietf:rfc:3516,short);|&amp;color(gray){not implemented};||</del>
<ins>|UNKNOWN-CTE|&amp;urn2url(urn:ietf:rfc:3516,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
|UIDNOTSTICKY|&amp;urn2url(urn:ietf:rfc:4315,short);|&amp;color(green){implemented};||
|APPENDUID|&amp;urn2url(urn:ietf:rfc:4315,short);|&amp;color(green){implemented};||
|COPYUID|&amp;urn2url(urn:ietf:rfc:4315,short);|&amp;color(green){implemented};||
|MAXCONVERTMESSAGES|&amp;urn2url(urn:ietf:rfc:5259,short);|&amp;color(gray){not implemented};||
|MAXCONVERTPARTS|&amp;urn2url(urn:ietf:rfc:5259,short);|&amp;color(gray){not implemented};||
|NOUPDATE|&amp;urn2url(urn:ietf:rfc:5267,short);|&amp;color(gray){not implemented};||
<del>|METADATA|&amp;urn2url(urn:ietf:rfc:5464,short);|&amp;color(gray){not implemented};||</del>
<ins>|METADATA LONGENTRIES|&amp;urn2url(urn:ietf:rfc:5464,short);|&amp;color(orange){partially implemented};|通常のレスポンスと同様&amp;sub{*1};に扱います。|</ins>
<ins>|METADATA MAXSIZE|&amp;urn2url(urn:ietf:rfc:5464,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
<ins>|METADATA TOOMANY|&amp;urn2url(urn:ietf:rfc:5464,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
<ins>|METADATA NOPRIVATE|&amp;urn2url(urn:ietf:rfc:5464,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
|NOTIFICATIONOVERFLOW|&amp;urn2url(urn:ietf:rfc:5465,short);|&amp;color(gray){not implemented};||
|BADEVENT|&amp;urn2url(urn:ietf:rfc:5465,short);|&amp;color(gray){not implemented};||
<del>|UNDEFINED-FILTER|&amp;urn2url(urn:ietf:rfc:5466,short);|&amp;color(gray){not implemented};||</del>
<ins>|UNDEFINED-FILTER|&amp;urn2url(urn:ietf:rfc:5466,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
|UNAVAILABLE|&amp;urn2url(urn:ietf:rfc:5530,short);|&amp;color(orange){partially implemented};|通常のレスポンスと同様&amp;sub{*1};に扱います。|
|AUTHENTICATIONFAILED|&amp;urn2url(urn:ietf:rfc:5530,short);|&amp;color(orange){partially implemented};|通常のレスポンスと同様&amp;sub{*1};に扱います。|
|AUTHORIZATIONFAILED|&amp;urn2url(urn:ietf:rfc:5530,short);|&amp;color(orange){partially implemented};|通常のレスポンスと同様&amp;sub{*1};に扱います。|
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/releases/">Works/Libraries/Smdn.Net.Pop3/リリース一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*リリース一覧
-0.2x
<ins>--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.25.tar.bz2}</ins>
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.24.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.23.tar.bz2}
--${smdncms:distfilelink,../Smdn.Net.Pop3.Client-0.22.tar.bz2}
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

*変更履歴
<ins>**0.25</ins>
<ins>主にアプリケーション構成ファイルでの設定のサポート、パフォーマンスと.NET Frameworkでの動作の改善。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--WebClients名前空間</ins>
<ins>---アプリケーション構成ファイルのconfiguration/system.net/webRequestModules要素でpop/popsスキームを登録できるようにした</ins>
<ins>---PopWebRequestDefaultsクラスを追加、コード内もしくはアプリケーション構成ファイルでPopWebRequestの各プロパティのデフォルト値を設定できるようにした</ins>
<ins>-修正・改善</ins>
<ins>--PopResponseCodeをSmdn.Net.Pop3.Protocol.ClientからSmdn.Net.Pop3.Protocolに移動</ins>
<ins>--SslStream.AuthenticateAsClientでAuthenticationExceptionが発生した場合、ストリームを閉じるようにした</ins>
<ins>--ライブラリ内のメッセージとサーバからのレスポンスを区別できるように内部処理と書式を変更した</ins>
<ins>--パフォーマンス関連</ins>
<ins>---レスポンスパーサの実装を最適化、冗長な処理を削除</ins>
<ins>---文字列比較処理を最適化</ins>
<ins>---ロック処理にSemaphoreを使用していた箇所をMonitorに置き換えた</ins>
<ins>--.NET Framework関連</ins>
<ins>---NetworkCredentialの各プロパティがnullを返すことを期待していた実装を修正、nullではなくstring.Emptyの場合に認証をキャンセルするようにした</ins>
<ins>---SocketError.TimedOutのSocketExceptionが発生した場合、ImapConnectionExceptionではなくTimeoutExceptionをスローするようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---SslStream作成用のコールバック、証明書関連のコールバックのプロパティ名を変更、また値をPopConnectionと共有しないようにした</ins>
<ins>---PopSessionManagerからIWebRequestCreateの実装を分離、WebRequest.RegisterPrefixはPopWebRequestCreator.RegisterPrefixで行うようにした</ins>
<ins />
**0.24
-機能追加
--拡張コマンドなど任意のコマンドを送信するためのメソッドを追加
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.24時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.25時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
個々のサンプルの詳細については、後述するSmdn.Net.Pop3.WebClients名前空間の説明を参照してください。
using System;
using System.Net;

<del>using Smdn.Net.Imap4.WebClients;</del>
<ins>using Smdn.Net.Pop3.WebClients;</ins>

class Sample {
  public static void Main(string[] args)
  {
<del>    PopSessionManager.RegisterWebRequestPrefix();</del>
<ins>    PopWebRequestCreator.RegisterPrefix();</ins>

    using {
      client.Credentials = new NetworkCredential("user", "pass");
class Sample {
  public static void Main(string[] args)
  {
<del>    PopSessionManager.RegisterWebRequestPrefix();</del>
<del>    PopSessionManager.CertificateValidationCallback += delegate {</del>
<ins>    PopWebRequestCreator.RegisterPrefix();</ins>
<ins>    PopSessionManager.ServerCertificateValidationCallback += delegate {</ins>
      return true;
    };

の順でPOPコマンドを実行、レスポンスを取得できます。　以下でSmdn.Net.Pop3.WebClientsに固有な部分について解説します。

**pop, popsスキームの登録
<del>Smdn.Net.Pop3.WebClients名前空間のクラスを使う場合には、WebRequestクラスがpopスキームおよびpopsスキームのURLを処理できるようにPopSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</del>
<ins>Smdn.Net.Pop3.WebClients名前空間のクラスを使う場合には、WebRequestクラスがpopスキームおよびpopsスキームのURLを処理できるようにPopWebRequestCreator.RegisterPrefixメソッドを呼び出しておく必要があります。</ins>

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

**リクエストURLと接続時の動作
<ins>接続時の動作は&amp;urn2url(urn:ietf:rfc:2384);に記述されている内容に準じた動作となるようにしています。　(ただしpopsスキームを使用した場合にSSL/TLSでの接続を試みる動作は本ライブラリ固有の動作です)</ins>
<ins />
***SSL/TLS・接続ポート
リクエストURLのスキームがpopsの場合は、常にSSL/TLSでの接続を試みます。　スキームがpopの場合は、PopWebRequest.UseTlsIfAvailableプロパティがtrueで、かつサーバがSTLSに対応している場合、認証を開始する前にSSL/TLSを使用した接続にアップグレードします。 URLでポート番号を指定しない場合、デフォルトのポート(popは110、popsは995)に接続します。


|*リクエストURLの形式と認証動作の例
|リクエストURLの形式|ユーザ名|使用する認証メカニズム|h
<del>|pop://user;AUTH=+APOP@pop.example.net/|user|APOP|</del>
<del>|pop://user;AUTH=DIGEST-MD5@pop.example.net/|user|DIGEST-MD5|</del>
<del>|pop://;AUTH=DIGEST-MD5@pop.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</del>
<del>|pop://user;AUTH=*@pop.example.net/&amp;br;pop://user@pop.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</del>
<del>|pop://;AUTH=ANONYMOUS@pop.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</del>
<ins>|pop://user;AUTH=+APOP&amp;#x40;pop.example.net/|user|APOP|</ins>
<ins>|pop://user;AUTH=DIGEST-MD5&amp;#x40;pop.example.net/|user|DIGEST-MD5|</ins>
<ins>|pop://;AUTH=DIGEST-MD5&amp;#x40;pop.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</ins>
<ins>|pop://user;AUTH=*&amp;#x40;pop.example.net/&amp;br;pop://user&amp;#x40;pop.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</ins>
<ins>|pop://;AUTH=ANONYMOUS&amp;#x40;pop.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</ins>
|pop://pop.example.net/|匿名ユーザ(anonymous)|ANONYMOUSもしくはUSER/PASSコマンドを使用|

試行する認証メカニズムを制御するには、後述するPopWebRequest.UsingSaslMechanismsプロパティの値を変更してください。
PopWebRequestクラスにはMethodプロパティ以外にもコマンド送信時の動作を制御するためのプロパティを用意してあります。　プロパティの値によってリクエスト内容と動作が変わります。

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

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

<ins>***PopWebRequestクラスのデフォルト値の変更</ins>
<ins>PopWebRequestDefaultsクラスのプロパティの値を変更することにより、PopWebRequestクラスのプロパティに設定されるデフォルト値を一括して指定することができます。　全てのリクエストでデフォルトの値を変更したい場合は、PopWebRequestDefaultsクラスのプロパティの値を変更してください。</ins>
<ins />
<ins>PopWebRequestDefaultsクラスにはPopWebRequestプロパティと同名のプロパティを用意してありますが、以下の一覧にあるプロパティはPopWebRequestでは設定できないプロパティです。</ins>
<ins />
<ins>|*PopWebRequestDefaultsクラスのプロパティ</ins>
<ins>|プロパティ|デフォルト|解説|h</ins>
<ins>|AnonymousToken|"anonymous"|匿名ユーザでログインする場合に使用されるユーザ名を指定します。|</ins>
<ins />
<ins>**アプリケーション構成ファイルでの設定</ins>
<ins>アプリケーション構成ファイルを記述することにより、pop, popsスキームの登録と、PopWebRequestDefaultsクラスのデフォルト値を変更することができます。　コード上での変更をしたくない場合、する必要がない場合などは、アプリケーション構成ファイルに設定を記述することができます。　以下はアプリケーション構成ファイルの記述例です。</ins>
<ins />
<ins>#code(xml,アプリケーション構成ファイルの記述例){{</ins>
<ins>&lt;?xml version="1.0" encoding="utf-8" ?&gt;</ins>
<ins>&lt;configuration&gt;</ins>
<ins>  &lt;configSections&gt;</ins>
<ins>    &lt;!-- smdn.net.pop3.client要素を処理するためのセクションハンドラクラスの設定 --&gt;</ins>
<ins>    &lt;sectionGroup name="smdn.net.pop3.client"&gt;</ins>
<ins>      &lt;section name="webRequestDefaults" type="System.Configuration.DictionarySectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/&gt;</ins>
<ins>    &lt;/sectionGroup&gt;</ins>
<ins>  &lt;/configSections&gt;</ins>
<ins>  &lt;system.net&gt;</ins>
<ins>    &lt;!-- pop, popsスキームの登録 --&gt;</ins>
<ins>    &lt;webRequestModules&gt;</ins>
<ins>      &lt;add prefix="pop"   type="Smdn.Net.Pop3.WebClients.PopWebRequestCreator, Smdn.Net.Pop3.Client" /&gt;</ins>
<ins>      &lt;add prefix="pops"  type="Smdn.Net.Pop3.WebClients.PopWebRequestCreator, Smdn.Net.Pop3.Client" /&gt;</ins>
<ins>    &lt;/webRequestModules&gt;</ins>
<ins>  &lt;/system.net&gt;</ins>
<ins>  &lt;smdn.net.pop3.client&gt;</ins>
<ins>    &lt;!-- PopWebRequestDefaultsクラスのデフォルト値の変更 --&gt;</ins>
<ins>    &lt;webRequestDefaults&gt;</ins>
<ins>      &lt;add key="timeout" value="-1"/&gt;</ins>
<ins>      &lt;add key="readWriteTimeout" value="-1"/&gt;</ins>
<ins>      &lt;add key="useTlsIfAvailable" value="true"/&gt;</ins>
<ins>      &lt;add key="deleteAfterRetrieve" value="false"/&gt;</ins>
<ins>      &lt;add key="keepAlive" value="true"/&gt;</ins>
<ins>      &lt;add key="anonymousToken" value="anonymous"/&gt;</ins>
<ins>      &lt;add key="usingSaslMechanisms" value="DIGEST-MD5, CRAM-MD5, NTLM"/&gt;</ins>
<ins>      &lt;add key="expectedErrorResponseCodes" value="ALREADYEXISTS, NONEXISTENT"/&gt;</ins>
<ins>    &lt;/webRequestDefaults&gt;</ins>
<ins>  &lt;/smdn.net.pop3.client&gt;</ins>
<ins>&lt;/configuration&gt;</ins>
<ins>}}</ins>
<ins />
<ins>記述内容については[[ネットワーク設定スキーマ:http://msdn.microsoft.com/ja-jp/library/dacty7ed%28VS.80%29.aspx]]および[[構成セクション スキーマ:http://msdn.microsoft.com/ja-jp/library/0hyxd0xc%28VS.80%29.aspx]]も合わせて参照してください。</ins>
<ins />
*Smdn.Net.Pop3.Client.Session名前空間
Smdn.Net.Pop3.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Pop3.WebClientsの各クラスの実装を参照してください。

class Sample {
  public static void Main(string[] args)
  {
<del>    PopConnection.CertificateValidationCallback += delegate {</del>
<ins>    PopConnection.ServerCertificateValidationCallback += delegate {</ins>
      return true;
    };

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
--[[works/libs/Smdn.Security.Authentication.Sasl]]
--[[works/libs/Smdn.Formats.Mime]]

<del>*機能</del>
<del>すべての標準コマンドといくつかの拡張コマンドの送受信、SSL/TLS接続(POP over SSL, STLS)、SASL認証メカニズムなどに対応しています。</del>
<ins>*機能と特徴</ins>
<ins>**主な機能</ins>
<ins>+すべての標準コマンドといくつかの拡張コマンドの送受信</ins>
<ins>+SSL/TLS接続(POP over SSL, STLS)</ins>
<ins>+APOP</ins>
<ins>+SASL認証メカニズム(DIGEST-MD5他)</ins>

<del>使用可能なコマンド。</del>
<del>:認証系コマンド|USER, PASS, QUIT, APOP, AUTH(&amp;urn2url(urn:ietf:rfc:5034,short);)</del>
<del>::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</del>
<del>SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています</del>
<del>:メッセージ操作系コマンド|STAT, LIST, RETR, DELE, TOP, UIDL, RSET</del>
<del>:その他のコマンド|NOOP, CAPA(&amp;urn2url(urn:ietf:rfc:2449,short);), STLS(&amp;urn2url(urn:ietf:rfc:2595,short);)</del>
<ins>その他、サポートしている機能の詳細は「実装済み機能一覧」の項をご覧ください。</ins>

<del>実装しているクライアントは次の二種類です。</del>
<ins>**クライアント実装</ins>
<ins>クライアント実装として以下の2つのクラスを用意しています。</ins>
:PopSessionクラス|POPコマンドと1対1に対応するメソッドを持つクライアント
:PopWebRequest/PopWebResponseクラス|WebRequest/WebResponseクラスから派生し、POP URL(&amp;urn2url(urn:ietf:rfc:2384,short);)での操作に対応したクライアント

<ins>**その他の主な特徴</ins>
<ins>:メッセージ本文はStreamとして取得可能|メッセージの加工・解析は任意の手段を使用できるよう、Streamとして返します。　MIMEメッセージのデコード機能は含んでいません。</ins>
<ins>:StreamReader, Regexは不使用|送受信時の文字列処理はstringではなくbyte[]のまま処理しています。　byte[]⇄stringの変換に起因する不必要なメモリの消費と速度の低下はできる限り抑えてあります。　また、大きなメッセージを取得してもLarge Object Heapを消費しないよう実装しています。</ins>
<ins>:ログ出力にTraceSourceを使用|送受信内容・動作状況のログをTraceListenerで取得できます。　またログ出力のレベルを設定できます。　イベントハンドラによる送受信時のフックは無駄と考え用意していません。</ins>
<ins>:パース済みのレスポンスにアクセス可能|受信したレスポンスは必要な部分だけを拾い読みして結果を返すのではなく、全てパースしてから結果を返します。</ins>
<ins>:フリー・オープンソース|本ライブラリは[[MIT X11ライセンス:http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]を採用しています。</ins>
<ins />
*ダウンロード
#googleadunit

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

<del>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.24.tar.bz2}</del>
<ins>:最新版|${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.25.tar.bz2}</ins>
:開発版|[[anonsvn]]よりチェックアウトできます

デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
class GpopRetrieveExample {
  public static void Main()
  {
<del>    PopSessionManager.RegisterWebRequestPrefix();</del>
<del>    PopSessionManager.CertificateValidationCallback += delegate {</del>
<ins>    PopWebRequestCreator.RegisterPrefix();</ins>
<ins>    PopSessionManager.ServerCertificateValidationCallback += delegate {</ins>
      return true;
    };


*制限事項・特記事項
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
<del>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</del>
<ins>-SASLの実装は、本体とは別ライブラリの[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています。</ins>
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、十分な検証は行っていないため保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</ins>

*参考文献
#amazon(4873110289,left,content)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|&amp;urn2url(urn:ietf:rfc:4505,anchor-text);|ANONYMOUS|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4752,anchor-text);|GSSAPI|&amp;color(gray){not implemented};||
|[[[MS-NLMP:http://msdn.microsoft.com/en-us/library/cc236621(PROT.13).aspx]]] NT LAN Manager{partially implemented};|サーバ側の実装によっては正しく動作しない可能性があります。|
<del>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-*|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1-PLUS|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-11,anchor-text);|SCRAM-*|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-11,anchor-text);|SCRAM-SHA-1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-11,anchor-text);|SCRAM-SHA-1-PLUS|&amp;color(gray){not implemented};||</ins>
|RFC|mechanism name|status|note|f

使い方・認証処理の実装は[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.25.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.24.tar.bz2}
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.23.tar.bz2}
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.22.tar.bz2}
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

*変更履歴
<ins>**0.25</ins>
<ins>-SaslClientMechanismを継承した任意のクラスを既知の認証メカニズムとして登録・使用できるようにした</ins>
<ins>-NetworkCredentialの各プロパティがnullを返すことを期待していた実装を修正、nullではなくstring.Emptyの場合に認証をキャンセルするようにした</ins>
<ins />
**0.24
-Mono.Security.dllがない環境でも動作するように、Mono.Security.Protocol.Ntlmの実装をインポート
-認証時に参照するNetworkCredentialのUserNameおよびPasswordプロパティがnullだった場合の動作を整理

*制限事項・特記事項
-本ライブラリには、NTLM認証でのチャレンジレスポンスの実装として、Mono.Security.Protocol.Ntlmのクラスを含んでいます。
<del>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。</del>
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、十分な検証は行っていないため保証はできません。</ins>

*関連するページ
-[[programming/mono/Mono.Security.Protocol.Ntlm]]
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1266185678</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-02-15T07:14:38+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.25をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.25をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.25をリリース 「Works/Libraries/Smdn.Security.Authentication.Sasl」 version 0.25をリリース 「Works/Libraries/Smdn.Net.Imap4/リリース一覧」を更新 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/リリース一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル」を更新</title>
    <updated>2010-02-15T07:14:38+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.24.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.24</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.24</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.24</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.16</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.23.tar.bz2}
---下記ライブラリのソースを同梱しています
----[[works/libs/Smdn.Net.Imap4]] 0.23
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

*変更履歴
<ins>**0.24</ins>
<ins>-修正・改善</ins>
<ins>--パスワードの入力ダイアログを追加、設定ファイルにパスワードを記入しなくても接続できるようにした。</ins>
<ins />
**0.23
-機能追加
--IMAP
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.24時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間の説明を参照してください。

    using {
      client.Credentials = new NetworkCredential("user", "pass");
<del>      client.UploadData("imap://user;AUTH=DIGEST-MD5@localhost/INBOX/", ImapWebRequestMethods.Append, File.ReadAllBytes("sample.eml"));</del>
<ins>      client.UploadData("imap://user;AUTH=DIGEST-MD5@localhost/INBOX", ImapWebRequestMethods.Append, File.ReadAllBytes("sample.eml"));</ins>
    }
  }
}
    ImapSessionManager.RegisterWebRequestPrefix();
    ImapSessionManager.CertificateValidationCallback = delegate { return true; };

<del>    var request = WebRequest.Create("imaps://user@imap.gmail.com/INBOX/?SUBJECT \"[Mono-dev]\"");</del>
<ins>    var request = WebRequest.Create("imaps://user@imap.gmail.com/INBOX?SUBJECT \"[Mono-dev]\"");</ins>

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

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

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

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

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

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

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

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

|Methodプロパティ|リクエスト|解説|レスポンス|h
|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメッセージの本文を取得します。|該当するUIDのメッセージがない場合、WebExceptionStatus.SuccessのWebExceptionをスローします。|メッセージ本文はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。　取得するメッセージのサイズはWebResponse.ContentLength、Content-TypeはWebResponse.ContentTypeプロパティに設定されます。|
<ins>|ImapWebRequestMethods.Copy, "COPY"|COPYコマンドを送信してメッセージを別のメールボックスにコピーします。|コピー先のメールボックスはImapWebRequest.DestinationUriプロパティで指定します。|サーバがCOPYUIDレスポンスコードを返した場合は、コピーしたメッセージのURLがWebResponse.ResponseUriに設定されます。　また、コピー先のメールボックスを自動的に作成した場合、作成したメールボックスはImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
|ImapWebRequestMethods.Expunge, "EXPUNGE"|STOREコマンドを送信して\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。|サーバが&amp;urn2url(urn:ietf:rfc:4315,#2.1){UID EXPUNGE};に対応していない場合、URLで指定されたメッセージだけでなく''既に\Deletedフラグが設定されている他のメッセージも同時に削除されます''。|-|
|ImapWebRequestMethods.Store, "STORE"|STOREコマンドを送信してメッセージにフラグを追加・削除・設定します。|追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。|-|
|Methodプロパティ|リクエスト|解説|レスポンス|f
|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をスローします。|
<ins>|Subscription|true|CREATE, DELETE, RENAME, COPY|メールボックスを作成・削除する際に、対象のメールボックスを自動的にSUBSCRIBE/UNSUBSCRIBEコマンドを送信して購読・購読解除するかどうかを指定します。|</ins>
|StoreDataItem|null|STORE|STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。|
<ins>|StatusDataItem|null|STATUS|STATUSコマンドで取得するメールボックスの情報を指定します。|</ins>
<ins>|SortCriteria|null|SORT|SORTコマンドで使用するソート方法を指定します。|</ins>
<ins>|ThreadingAlgorithm|null|THREAD|THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。|</ins>
|FetchBlockSize|10240|FETCH|FETCHコマンドでメッセージ本文を取得する際に、1回のFETCHコマンドで取得するブロックのサイズをバイト単位で指定します。|

WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。
|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h
|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。　(この機能は現在動作しません。　trueにした場合、NotImplementedExceptionがスローされます)|
|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)
<del>|SearchCriteriaEncoding|Encoding.UTF8|SEARCH等|検索クエリのエンコードに使用する文字コードを指定します。　サーバがサポートしていない文字コードを指定した場合はエラーとなります。　(この機能は現在動作しません。　将来のバージョンで検索クエリにASCII文字以外も含められるようにした時点で機能します。)|</del>
<del>|SortCriteria|null|SORT|SORTコマンドで使用するソート方法を指定します。|</del>
<del>|ThreadingAlgorithm|null|THREAD|THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。|</del>

***リクエストとIMAP URLに関するその他の留意事項
<del>-現時点では検索クエリに日本語等非ASCII文字を含めることはできません。　URLエンコードした文字列を検索クエリに含めた場合でも、エンコードした結果に非ASCII文字が含まれるような場合はリクエスト時にWebExceptionをスローします。</del>
-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。　現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。

**サンプル
using Smdn.Net.Imap4.WebClients;
  :

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

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

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

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

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Delete;
using Smdn.Net.Imap4.WebClients;
  :

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

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Create;
}
}}

<ins>***メッセージの検索</ins>
<ins>ImapStyleUriBuilderを使って、複雑な検索クエリを含むリクエストを送信する例。</ins>
<ins />
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Text;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.WebClients;</ins>
<ins>  :</ins>
<ins />
<ins>var builder = new ImapUriBuilder("imap://user@localhost/INBOX");</ins>
<ins />
<ins>builder.SearchCriteria =</ins>
<ins>                       |;</ins>
<ins>builder.Charset = Encoding.GetEncoding(932);</ins>
<ins />
<ins>var request = WebRequest.Create(builder.Uri) as ImapWebRequest;</ins>
<ins />
<ins>request.Credentials = new NetworkCredential("user", "pass");</ins>
<ins />
<ins>using {</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>この例で指定している検索クエリは、</ins>
<ins>+fromが'差出人'かつ送信日が2010年2月6日以前、もしくは</ins>
<ins>+未読で件名に'未承諾広告'を含まない</ins>
<ins />
<ins>となる。</ins>
<ins />
***メッセージへのフラグの設定
fromにspammer.example.comを含むメッセージをすべて既読にし、Thunderbirdの迷惑メールのマーク(Junk)を設定する例。　ImapStoreDataItem.ReplaceFlagsメソッドを使って新しく置き換える(設定する)フラグを作成し、StoreDataItemプロパティにしています。

using Smdn.Net.Imap4.WebClients;
  :

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

request.Credentials = new NetworkCredential("user", "pass");
request.Method = ImapWebRequestMethods.Store;
  public static void Main()
  {
    using {
<del>      session.Credentials = new NetworkCredential("user", "pass");</del>
<ins>      var cred = new NetworkCredential("user", "pass");</ins>

<del>      if {</del>
<ins>      if {</ins>
        Console.WriteLine("authentication failed");
        return;
      }
    };

    using {
<del>      session.Credentials = new NetworkCredential("user", "pass");</del>
<ins>      var cred = new NetworkCredential("user", "pass");</ins>

<del>      if {</del>
<ins>      if {</ins>
        Console.WriteLine("authentication failed");
        return;
      }
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
--[[works/libs/Smdn.Security.Authentication.Sasl]]
--[[works/libs/Smdn.Formats.Mime]]

<del>*機能概要</del>
<ins>*機能</ins>
<ins>すべての標準コマンドといくつかの拡張コマンドの送受信、SSL/TLS接続(IMAP over SSL, STARTTLS)、SASL認証メカニズムなどに対応しています。</ins>
<ins />
使用可能なコマンド
:認証系コマンド|LOGIN, AUTHENTICATE, LOGOUT, STARTTLS
::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS
#googleadunit
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

<ins>デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>
<ins />
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.24.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.23.tar.bz2}
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.22.tar.bz2}
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.21.tar.bz2}
--IDLEして5分程度経過すると、Mono.Security.Protocol.Tls.SslStreamBase.EndReadでMono.Security.Protocol.Tls.TlsExceptionがスローされる

*変更履歴
<ins>**0.24</ins>
<ins>主にIMAP URL関連の修正と、WebClients名前空間のクラスでの非ASCII文字を含む検索とpartial fetchのサポート。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--ImapUriBuilderの実装を追加</ins>
<ins>--WebClients名前空間</ins>
<ins>---検索クエリに非ASCII文字および同期リテラル・非同期リテラルを含むURLでのSEARCH/SORT/THREADをリクエストできるようにした</ins>
<ins>---/;SECTION=および/;PARTIAL=を含むURLでのリクエストできるようにした</ins>
<ins>---サーバがCOPYUIDレスポンスコードを返す場合、ImapWebResponse.ResponseUriに返されたUIDを含むURLを設定するようにした</ins>
<ins>---ImapWebRequest.Subscriptionプロパティを追加</ins>
<ins>---ImapWebResponse.SupportedCharsetsプロパティを追加</ins>
<ins>-修正・改善</ins>
<ins>--IMAP URL関連</ins>
<ins>---ImapStyleUriParserの実装を整理、&amp;urn2url(urn:ietf:rfc:5092){IMAP URL Scheme};に従った動作となるようにエスケープされた文字を含むURLの取扱いを修正</ins>
<ins>---クエリのデリミタのみを含むURL(例 imap://localhost/INBOX/?)が検索クエリを含んでいないと判断される不具合を修正</ins>
<ins>---ImapMailbox.Url, ImapMessage.Urlのメールボックス名がModified UTF7でエンコードされていたものを、UTF-8+URLエンコードでエンコードするように修正</ins>
<ins>---ImapMailbox.Url, ImapMessage.Urlのメールボックス名を'/'で終端しないようにした</ins>
<ins>---クエリ・UIDなどが含まれていてメールボックス名を含まないURL(例 imap://localhost/?...、imap://localhost/;uid=1)を不正なURLとして扱うようにした</ins>
<ins>---Modified-UTF7エンコードされたメールボックス名が含まれているURLからメールボックス名を取得する場合、デコードせずModified-UTF7エンコードされたままの値を取得するようにした</ins>
<ins>---URLのクエリに同期リテラルを含む場合、非同期リテラルに書き換えた上でSEARCHコマンドを開始するようにした</ins>
<ins>--コマンド送受信関連</ins>
<ins>---BADCHASETレスポンスコードに文字コードが含まれている場合、パースエラーとなる不具合を修正</ins>
<ins>---長さを指定せず開始オクテットのみの指定でpartial fetchできてしまう不具合を修正</ins>
<ins>---空のsequence-set, uid-setと結合した場合に、文字列中に不要な','が含まれる不具合を修正</ins>
<ins>---ImapSession.EndAppendが呼ばれる前にImapSession.BeginAppendを呼んでも例外とならない場合がある不具合を修正</ins>
<ins>---ImapSession.BeginAppendを呼び出した場合、処理が開始されるまではIAsyncResultを返さないようにした</ins>
<ins>---saved result($)を含むImapMatchedSequenceSetのToArrayを呼んだ場合、NotSupportedExceptionをスローするようにした</ins>
<ins>---接続時に不正なレスポンスを受信した場合、タイムアウトまで待ち合わせず、即座にImapConnectionExceptionをスローするようにした</ins>
<ins>--認証処理関連</ins>
<ins>---ImapSession.Credentialsプロパティを廃止し、ICredentialsByHostは認証系メソッドの引数で受け渡すように変更</ins>
<ins>---認証時に参照するNetworkCredentialのUserNameおよびPasswordプロパティがnullだった場合の動作を整理、例外をスローせず認証をキャンセルするようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---ImapWebRequest.SearchCriteriaEncodingプロパティを削除</ins>
<ins>---APPENDコマンドでのRequestStreamへの書き込み中に、書き込み遅延が起きていなくてもバッファーアンダーランが発生する不具合を修正</ins>
<ins>---サーバがLITERAL+に対応していても、APPENDコマンドでは常に同期リテラルを使用するようにした</ins>
<ins>---サーバがLITERAL+に対応していない場合で、URLのクエリ部分にリテラルを含む場合、ProtocolViolationExceptionをスローするようにした</ins>
<ins>---FETCHコマンドでのメッセージの属性とメッセージ本文の取得を単一のコマンドで行うようにした</ins>
<ins>---FETCHコマンドで取得するメッセージの属性を、ALLマクロ相当からFULLマクロ相当の値に変更</ins>
<ins />
**0.23
主に未サポートだった拡張の実装、メールボックス操作系コマンドの実装不備の修正。

-.NET Framework 3.5
-Mono 2.7

<del>*制限事項</del>
<ins>ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。</ins>
<ins />
<ins>*制限事項・特記事項</ins>
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</ins>

*参考文献
#amazon(4873110289,left,content)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|CLOSE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.2,short);|&amp;color(green){implemented};||
|EXPUNGE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.3,short);|&amp;color(green){implemented};||
|SEARCH, UID SEARCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.4,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.6,short);|&amp;color(green){implemented};|非ASCII文字での検索に対応&amp;sub{*2};|
<del>|FETCH, UID FETCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.5,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.4,short);|&amp;color(orange){partially implemented};|HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, TEXTのFETCHは未実装です。　またbody-extension fieldsはレスポンスに含まれていても無視します。|</del>
<ins>|FETCH, UID FETCH|&amp;urn2url(urn:ietf:rfc:3501,#6.4.5,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.4,short);|&amp;color(green){implemented};|body-extension fieldsはレスポンスに含まれていても無視します。|</ins>
|STORE, UID STORE|&amp;urn2url(urn:ietf:rfc:3501,#6.4.6,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short); &amp;urn2url(urn:ietf:rfc:4466,#2.5,short);|&amp;color(green){implemented};||
|COPY, UID COPY|&amp;urn2url(urn:ietf:rfc:3501,#6.4.7,short); &amp;urn2url(urn:ietf:rfc:3501,#6.4.11,short);|&amp;color(green){implemented};|Modified UTF-7対応&amp;sub{*1};|
|~Extensions|-|-|-|

:Modified UTF-7対応&amp;sub{*1};|メールボックス名に非ASCII文字を含む場合、自動的にModified UTF-7に変換します。
:非ASCII文字での検索に対応&amp;sub{*2};|文字コードには任意のSystem.Text.Encodingを指定できます。　明示的に指定しない場合はUTF-8を使用します。
<del>&amp;urn2url(urn:ietf:rfc:5255);への対応はまだ不完全です。</del>

**response codes
サポートするレスポンスコードの一覧です。
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</del>
<ins>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ここに記載されているものはversion 0.24時点のもので、記載不備などがあるかもしれません。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*使用例
個々のサンプルの詳細については、後述するSmdn.Net.Pop3.WebClients名前空間の説明を参照してください。
|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます|
|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。|
|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。　サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|
<ins>|DeleteAfterRetrieve|false|RETR|RETRコマンドでのメッセージの受信が成功した場合、同じメッセージに対して自動的にDELEコマンドを発行します。|</ins>
|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|

WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
--[[works/libs/Smdn.Formats.Mime]]

*機能
<del>使用可能なコマンド</del>
<ins>すべての標準コマンドといくつかの拡張コマンドの送受信、SSL/TLS接続(POP over SSL, STLS)、SASL認証メカニズムなどに対応しています。</ins>
<ins />
<ins>使用可能なコマンド。</ins>
:認証系コマンド|USER, PASS, QUIT, APOP, AUTH(&amp;urn2url(urn:ietf:rfc:5034,short);)
::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS
SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています
#googleadunit
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

<ins>デモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>
<ins />
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.24.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.23.tar.bz2}
--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.22.tar.bz2}
-0.1x
--[[POP3 Extension Mechanism:http://www.iana.org/assignments/pop3-extension-mechanism]]

*変更履歴
<ins>**0.24</ins>
<ins>-機能追加</ins>
<ins>--拡張コマンドなど任意のコマンドを送信するためのメソッドを追加</ins>
<ins>--WebClients名前空間</ins>
<ins>---PopWebRequest.DeleteAfterRetrieveプロパティを追加</ins>
<ins>-修正・改善</ins>
<ins>--PopSession.Credentialsプロパティを廃止し、ICredentialsByHostは認証系メソッドの引数で受け渡すように変更</ins>
<ins>--認証時に参照するNetworkCredentialのUserNameおよびPasswordプロパティがnullだった場合の動作を整理、例外をスローせず認証をキャンセルするようにした</ins>
<ins>--PopStyleUriParserの実装を整理、&amp;urn2url(urn:ietf:rfc:2384){POP URL Scheme};に従った動作となるようにエスケープされた文字を含むURLの取扱いを修正</ins>
<ins>--接続時に不正なレスポンスを受信した場合、タイムアウトまで待ち合わせず、即座にPopConnectionExceptionをスローするように修正</ins>
<ins />
**0.23
-機能追加
--&amp;urn2url(urn:ietf:rfc:2449,#8){Extended POP3 Response Codes};に対応
-.NET Framework 3.5
-Mono 2.7

<del>*制限事項</del>
<ins>ただし、Windows上での動作確認は不十分です。　テストはしていますが、予期しないバグがあるかもしれません。</ins>
<ins />
<ins>*制限事項・特記事項</ins>
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。　SSL/TLS接続を使用するか、セキュリティが保証されたネットワーク内での使用を推奨します。</ins>

*参考文献
#amazon(4873110289,left,content)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|&amp;urn2url(urn:ietf:rfc:4422,anchor-text);|EXTERNAL|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:4505,anchor-text);|ANONYMOUS|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4752,anchor-text);|GSSAPI|&amp;color(gray){not implemented};||
<del>|[[[MS-NLMP:http://msdn.microsoft.com/en-us/library/cc236621(PROT.13).aspx]]] NT LAN Manager{partially implemented};|Mono.Security.dllを使用します。　Mono.Security.dllを動的にロードできない環境では使用できません。　また、サーバ側の実装によっては正しく動作しない可能性があります。|</del>
<ins>|[[[MS-NLMP:http://msdn.microsoft.com/en-us/library/cc236621(PROT.13).aspx]]] NT LAN Manager{partially implemented};|サーバ側の実装によっては正しく動作しない可能性があります。|</ins>
|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-*|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1-PLUS|&amp;color(gray){not implemented};||
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.24.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.23.tar.bz2}
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.22.tar.bz2}

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

*変更履歴
<ins>**0.24</ins>
<ins>-Mono.Security.dllがない環境でも動作するように、Mono.Security.Protocol.Ntlmの実装をインポート</ins>
<ins>-認証時に参照するNetworkCredentialのUserNameおよびPasswordプロパティがnullだった場合の動作を整理</ins>
<ins />
**0.23
-initial client responseを取得するメソッドを追加

**0.21
-[[works/libs/Smdn.Net.Imap4]]より分離

<ins>*制限事項・特記事項</ins>
<ins>-本ライブラリには、NTLM認証でのチャレンジレスポンスの実装として、Mono.Security.Protocol.Ntlmのクラスを含んでいます。</ins>
<ins>-実装にあたり、セキュリティ上の考慮はしていますが、保証はできません。</ins>
<ins />
*関連するページ
-[[programming/mono/Mono.Security.Protocol.Ntlm]]
-[[programming/tips/cram_md5]]
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1265464846</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-02-06T23:00:46+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.24をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.24をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.24をリリース 「Works/Libraries/Smdn.Security.Authentication.Sasl」 version 0.24をリリース 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル」を更新</title>
    <updated>2010-02-06T23:00:46+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,TundereBird}
<ins>${smdncms:parser_options,non-limited-list}</ins>
*概要
IMAP4・POP3対応のメールクライアントです。　実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。
-[[works/libs/Smdn.Net.Imap4]]
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.23.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.23</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.23</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.23</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.16</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.22.tar.bz2}
---下記ライブラリのソースを同梱しています
<del>---[[works/libs/Smdn.Net.Imap4]] 0.22</del>
<del>---[[works/libs/Smdn.Net.Pop3]] 0.22</del>
<del>---[[works/libs/Smdn.Security.Authentication.Sasl]] 0.22</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.16</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.16</del>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.22</ins>
<ins>----[[works/libs/Smdn.Net.Pop3]] 0.22</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.22</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.16</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.21.tar.bz2}
---下記ライブラリのソースを同梱しています
<del>---[[works/libs/Smdn.Net.Imap4]] 0.21</del>
<del>---[[works/libs/Smdn.Security.Authentication.Sasl]] 0.21</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.15</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.15</del>
<ins>----[[works/libs/Smdn.Net.Imap4]] 0.21</ins>
<ins>----[[works/libs/Smdn.Security.Authentication.Sasl]] 0.21</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.15</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.15</ins>
--${smdncms:distfilelink,TundereBird-0.20.tar.bz2}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.20</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.14</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.14</del>
<ins>----[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.20</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.14</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.14</ins>
-0.1x
--${smdncms:distfilelink,TundereBird-0.13.zip}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.13</del>
<del>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.13</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.13</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.13</del>
<ins>----[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.13</ins>
<ins>----[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.13</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.13</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.13</ins>
--${smdncms:distfilelink,TundereBird-0.12.zip}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.12</del>
<del>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.12</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.12</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.12</del>
<ins>----[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.12</ins>
<ins>----[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.12</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.12</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.12</ins>
--${smdncms:distfilelink,TundereBird-0.11.zip}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.11</del>
<del>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.11</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.11</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.11</del>
<ins>----[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.11</ins>
<ins>----[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.11</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.11</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.11</ins>
--${smdncms:distfilelink,TundereBird-0.10.zip}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.10</del>
<del>---[[works/libs/Smdn.Formats.Mime]] 0.10</del>
<del>---[[works/libs/Smdn.Formats.Ini]] 0.10</del>
<ins>----[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.10</ins>
<ins>----[[works/libs/Smdn.Formats.Mime]] 0.10</ins>
<ins>----[[works/libs/Smdn.Formats.Ini]] 0.10</ins>

*使い方
+tunderebird.iniを開いてアカウント情報を記入してから起動してください。
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

*変更履歴
<ins>**0.23</ins>
<ins>-機能追加</ins>
<ins>--IMAP</ins>
<ins>---階層中に存在しないメールボックスがあっても正しく表示できるようにした</ins>
<ins>---Gimap XLISTに対応している場合、'Trash'の代わりに\Trashフラグを持つメールボックスをゴミ箱として使用するようにした</ins>
<ins>-修正・改善</ins>
<ins>--IMAP</ins>
<ins>---メールボックス名を変更する際に、階層も変えられるように修正</ins>
<ins />
**0.22
-機能追加
--POP3のサポートを再追加
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|ImapWebRequestMethods.Delete, "DELETE"|DELETEコマンドを送信してメールボックスを削除します。|削除しようとするメールボックスに対してUNSUBSCRIBEコマンドを送信してから削除します。&amp;br;削除しようとするメールボックスにメッセージがある場合は削除に失敗するので、STOREやEXPUNGEでメッセージを削除してからメールボックスを削除する必要があります。|-|
|ImapWebRequestMethods.Rename, "RENAME"|RENAMEコマンドを送信してメールボックスの名前を変更します。|変更後のメールボックス名はImapWebRequest.DestinationUriプロパティで指定します。|名前を変更した後のメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。　また、名前を変更した後のメールボックスのURLがWebResponse.ResponseUriに設定されます。|
|ImapWebRequestMethods.Check, "CHECK"|CHECKコマンドを送信します。|このコマンドは何もしません。　CHECKコマンドの動作、レスポンスの内容はサーバの実装によります。|-|
<del>|ImapWebRequestMethods.Select, "SELECT"|SELECTコマンドを送信してメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。|</del>
<del>|ImapWebRequestMethods.Examine, "EXAMINE"|EXAMINEコマンドを送信して読み取り専用でメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。|</del>
<ins>|ImapWebRequestMethods.Select, "SELECT"|SELECTコマンドを送信してメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。　また、選択したメールボックスのURLがWebResponse.ResponseUriに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Examine, "EXAMINE"|EXAMINEコマンドを送信して読み取り専用でメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。　また、選択したメールボックスのURLがWebResponse.ResponseUriに設定されます。|</ins>
|ImapWebRequestMethods.Subscribe, "SUBSCRIBE"|SUBSCRIBEコマンドを送信してメールボックスの購読を開始します。|-|-|
|ImapWebRequestMethods.Unsubscribe, "UNSUBSCRIBE"|UNSUBSCRIBEコマンドを送信してメールボックスの購読を解除します。|-|-|
|Methodプロパティ|リクエスト|解説|レスポンス|f
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています
:メールボックス操作系コマンド|
::標準コマンド|CREATE, RENAME, DELETE, CLOSE, SELECT, EXAMINE, LIST, LSUB, STATUS, SUBSCRIBE, UNSUBSCRIBE
<del>::拡張コマンド|RLIST, RLSUB, UNSELECT, NAMESPACE</del>
<ins>::拡張コマンド|RLIST, RLSUB, LIST(LIST-EXTENDED), XLIST(Gimap), UNSELECT, NAMESPACE</ins>
:メッセージ操作系コマンド|
::標準コマンド|APPEND,SEARCH, EXPUNGE
::拡張コマンド|(UID)SORT,, UID EXPUNGE
:その他のコマンド|
::標準コマンド|NOOP, CHECK, CAPABILITY
<del>::拡張コマンド|ENABLE, COMPRESS, IDLE, ID</del>
<ins>::拡張コマンド|ENABLE, COMPRESS, IDLE, ID, COMPARATOR, LANGUAGE</ins>

実装しているクライアントは次の二種類です。
:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.23.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.22.tar.bz2}
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.21.tar.bz2}
--${smdncms:distfilelink,Smdn.Protocols.Imap4-0.20.tar.bz2}
*不具合・要望・質問等
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

<ins>-既知の不具合</ins>
<ins>--IDLEして5分程度経過すると、Mono.Security.Protocol.Tls.SslStreamBase.EndReadでMono.Security.Protocol.Tls.TlsExceptionがスローされる</ins>
<ins />
*変更履歴
<ins>**0.23</ins>
<ins>主に未サポートだった拡張の実装、メールボックス操作系コマンドの実装不備の修正。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:4959){SASL-IR};に対応</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:5255){COMPARATOR};に対応(実機での動作は未確認)</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:5255){LANGUAGE};に対応(実機での動作は未確認)</ins>
<ins>--Gimap XLISTコマンドに対応</ins>
<ins>--&amp;urn2url(urn:ietf:id:ietf-morg-list-specialuse-00){Extension to IMAP CREATE command to set special-use flags};に対応</ins>
<ins>--&amp;urn2url(urn:ietf:id:ietf-morg-status-in-list-01,short);に対応</ins>
<ins>--ImapMailbox.Url, ImapMessage.UrlにUIDVALIDTYを含めるようにした</ins>
<ins>--コマンドを発行する際に引数のチェックを行い、ArgumentExceptionをスローするようにした(未完了につき不完全)</ins>
<ins>--プロトコル上不正な以下の操作を行おうとした場合、ImapProtocolViolationException(SystemExceptionから派生)をスローするようにした</ins>
<ins>---選択済みメールボックスに対してSTATUSしようとした場合</ins>
<ins>---\NoSelectフラグが設定されているメールボックスに対してSTATUSしようとした場合</ins>
<ins>---\NoSelectフラグが設定されていて、下位のメールボックスを持つ既知のメールボックスをDELETEしようとした場合</ins>
<ins>---既知のメールボックス名にRENAMEしようとした場合</ins>
<ins>---既知のメールボックス名でCREATEしようとした場合</ins>
<ins>---INBOXをCREATEしようとした場合</ins>
<ins>---上記以外でInvalidOperationExceptionをスローしていた箇所はImapProtocolViolationExceptionに変更</ins>
<ins>--コマンド処理中にタイムアウト値を変更しようとした場合、InvalidOperationExceptionをスローするようにした</ins>
<ins>--ImapSession.ServerID, ImapSession.ServerCapabilitiesに対してコレクションの変更を行おうとした場合、NotSupportedExceptionをスローするようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---XLISTコマンドを発行できるようにした</ins>
<ins>---RENAMEに成功した後、変更前のメールボックスをUNSUBSCRIBEするようにした</ins>
<ins>---RENAMEに成功した後、下位のメールボックスに対してSUBSCRIBE/UNSUBSCRIBEするようにした</ins>
<ins>---DELETEに成功した後、削除したメールボックスをUNSUBSCRIBEするようにした</ins>
<ins>---COPYで自動的にメールボックスを作成した後、作成したメールボックスをSUBSCRIBEするようにした</ins>
<ins>---単一のメッセージを表すURL形式でもCOPYできるようにした</ins>
<ins>---サーバがサポートしない機能を使用しようとした場合、およびプロトコル上不正な操作を行おうとした場合、System.Net.ProtocolViolationExceptionをスローするようにした</ins>
<ins>-修正・改善</ins>
<ins>--受信したレスポンスをstringで保持する機能を削除</ins>
<ins>--コマンド[LIST "" ""]を送信できない、レスポンスを受信できない不具合を修正</ins>
<ins>--同一メッセージのFETCHレスポンスが複数に分割して返された場合、複数のメッセージとして解釈してしまう不具合を修正</ins>
<ins>--RLSUB/RLISTのレスポンスを正しく取得していない不具合を修正</ins>
<ins>--ImapSession.HandlesIncapableAsExceptionがtrueの場合かつ、サーバがIMAP4rev1に対応していないかCAPABILITYコマンド未発行の場合、CAPABILITYコマンドが発行できない不具合を修正</ins>
<ins>--RENAMEで下位のメールボックスをもつメールボックスの名前を変更した場合、内部で管理している下位のメールボックス名も変更するようにした</ins>
<ins>--切断状態になった時点でImapSession.SelectedMailboxをnullにするように修正</ins>
<ins>--選択済みメールボックスに対してRENAMEしても例外を送出しないように変更</ins>
<ins>--選択済みメールボックスに対してDELETEしても例外を送出しないように変更</ins>
<ins>--ImapSession.BeginIdleメソッドでIDLEを開始した後、継続要求応答もしくはエラー応答が返されるまではIAsyncResultを返さないように変更</ins>
<ins>--ImapSession.Idleメソッドでタイムアウト時間を指定してIDLEを開始した場合、エラー応答が返された場合は即座に結果を返すように変更</ins>
<ins>--ImapSession.StatusChangedイベントを廃止し、ImapSession.Idleメソッドへコールバック用のデリゲートを指定できるように変更</ins>
<ins>--ImapSession.(Begin)IdleメソッドでIDLEを開始した後TraceSourceにアイドル中であることを出力する間隔を、ImapSession.ReceiveTimeoutから30秒の固定値に変更</ins>
<ins />
**0.22
主にWebClients名前空間のクラスの改善。

*動作状況
以下のIMAPサーバに対して概ね問題なく動作することを確認済みです。
-GMail
<del>-Dovecot</del>
<ins>-Dovecot</ins>

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
-[[IMAPプロトコルの流れを学ぶ:http://www.atmarkit.co.jp/fmobile/rensai/imap04/imap04.html]]
-[[IMAP4 and CRAM-MD5 Authentication:http://vision.kuee.kyoto-u.ac.jp/~nob/doc/cram-md5/cram-md5.html]]
-[[APOPとIMAP(CRAM-MD5)をC#で使おう:http://mobiquitous.com/programming/apop-imap.html]]
<ins>-[[The IMAP Conneco-chan:http://www.lins.jp/~obata/imap/]]</ins>
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|&amp;urn2url(urn:ietf:rfc:2342,anchor-text);|NAMESPACE|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:2595,anchor-text);|STARTTLS|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:2595,anchor-text);|LOGINDISABLED|&amp;color(green){implemented};||
<ins>|&amp;urn2url(urn:ietf:rfc:2683,anchor-text);|-|&amp;color(orange){partially implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:2971,anchor-text);|ID|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:3348,anchor-text);|CHILDREN|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:3501,anchor-text);|IMAP4rev1|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4466,anchor-text);|-|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4467,anchor-text);|URLAUTH|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:4469,anchor-text);|CATENATE|&amp;color(gray){not implemented};||
<ins>|&amp;urn2url(urn:ietf:rfc:4549,anchor-text);|-|&amp;color(gray){not implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:4551,anchor-text);|CONDSTORE|&amp;color(orange){partially implemented};||
|&amp;urn2url(urn:ietf:rfc:4731,anchor-text);|ESEARCH|&amp;color(green){implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:4959,anchor-text);|SASL-IR|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:4959,anchor-text);|SASL-IR|&amp;color(green){implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:4978,anchor-text);|COMPRESS=DEFLATE|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5032,anchor-text);|WITHIN|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5092,anchor-text);|-|&amp;color(orange){partially implemented};|URLAUTHは未実装です。　URLにUIDVALIDITYが指定されていてもUIDの検証は行いません。　[独自拡張]URLのスキームがimapsの場合、デフォルトポートとして993を使用し、SSLによる接続を試みます。|
|&amp;urn2url(urn:ietf:rfc:5161,anchor-text);|ENABLE|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5162,anchor-text);|QRESYNC|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5182,anchor-text);|SEARCHRES|&amp;color(green){implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|I18NLEVEL=1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|I18NLEVEL=2|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|LANGUAGE|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|I18NLEVEL=1|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|I18NLEVEL=2|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:5255,anchor-text);|LANGUAGE|&amp;color(green){implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:5256,anchor-text);|SORT|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5256,anchor-text);|THREAD=ORDEREDSUBJECT|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5256,anchor-text);|THREAD=REFERENCES|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5257,anchor-text);|ANNOTATE-EXPERIMENT-1|&amp;color(gray){not implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:5258,anchor-text);|LIST-EXTENDED|&amp;color(gray){not implemented};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:5258,anchor-text);|LIST-EXTENDED|&amp;color(green){implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:5259,anchor-text);|CONVERT|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5267,anchor-text);|CONTEXT=SEARCH|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5267,anchor-text);|CONTEXT=SORT|&amp;color(gray){not implemented};||
|&amp;urn2url(urn:ietf:rfc:5530,anchor-text);|-|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,anchor-text);|SEARCH=INTHREAD|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,anchor-text);|THREAD=REFS|&amp;color(green){implemented};||
<ins>|&amp;urn2url(urn:ietf:id:ietf-morg-list-specialuse-00,anchor-text);|CREATE-SPECIAL-USE|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-morg-status-in-list-01,anchor-text);|LIST-STATUS|&amp;color(green){implemented};||</ins>
<ins>|Gimap|XLIST|&amp;color(green){implemented};||</ins>
|RFC|capability name|status|note|f

**commands
|SORT with RETURN result specifier|&amp;urn2url(urn:ietf:rfc:4731,#3.1,short); &amp;urn2url(urn:ietf:rfc:5182,#2.1,short); &amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,#3.5,short);|&amp;color(green){implemented};||
|COMPRESS|&amp;urn2url(urn:ietf:rfc:4978,#3,short);|&amp;color(gray){not implemented};||
|ENABLE|&amp;urn2url(urn:ietf:rfc:5161,#3.1,short);|&amp;color(green){implemented};||
<del>|LANGUAGE|&amp;urn2url(urn:ietf:rfc:5255,#3.2,short);|&amp;color(gray){not implemented};||</del>
<del>|COMPARATOR|&amp;urn2url(urn:ietf:rfc:5255,#4.7,short);|&amp;color(gray){not implemented};||</del>
<ins>|LANGUAGE|&amp;urn2url(urn:ietf:rfc:5255,#3.2,short);|&amp;color(red){not tested};||</ins>
<ins>|COMPARATOR|&amp;urn2url(urn:ietf:rfc:5255,#4.7,short);|&amp;color(red){not tested};||</ins>
|SORT, UID SORT|&amp;urn2url(urn:ietf:rfc:5256,#3,short);|&amp;color(green){implemented};|非ASCII文字での検索に対応&amp;sub{*2};|
|THREAD, UID THREAD|&amp;urn2url(urn:ietf:rfc:5256,#3,short);|&amp;color(green){implemented};|非ASCII文字での検索に対応&amp;sub{*2};|
|CONVERSIONS|&amp;urn2url(urn:ietf:rfc:5259,#5.1,short);|&amp;color(gray){not implemented};||
|GETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.2,short);|&amp;color(gray){not implemented};||
|SETMETADATA|&amp;urn2url(urn:ietf:rfc:5464,#4.3,short);|&amp;color(gray){not implemented};||
|NOTIFY|&amp;urn2url(urn:ietf:rfc:5465,#3.1,short);|&amp;color(gray){not implemented};||
<ins>|CREATE with special-use flags|&amp;urn2url(urn:ietf:id:ietf-morg-list-specialuse-00,anchor-text);|&amp;color(gray){not implemented};||</ins>
<ins>|LIST with STATUS return option|&amp;urn2url(urn:ietf:id:ietf-morg-status-in-list-01,anchor-text);|&amp;color(green){implemented};||</ins>
<ins>|XLIST{implemented};||</ins>
|command|RFC|status|note|f

:Modified UTF-7対応&amp;sub{*1};|メールボックス名に非ASCII文字を含む場合、自動的にModified UTF-7に変換します。
|COMPRESSIONACTIVE|&amp;urn2url(urn:ietf:rfc:4978,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|
|CLOSED|&amp;urn2url(urn:ietf:rfc:5162,short);|&amp;color(gray){not implemented};||
|NOTSAVED|&amp;urn2url(urn:ietf:rfc:5182,short);|&amp;color(green){implemented};||
<del>|BADCOMPARATOR|&amp;urn2url(urn:ietf:rfc:5255,short);|&amp;color(gray){not implemented};||</del>
<ins>|BADCOMPARATOR|&amp;urn2url(urn:ietf:rfc:5255,short);|&amp;color(orange){partially implemented};|通常のNOレスポンスと同様&amp;sub{*1};に扱います。|</ins>
|ANNOTATE|&amp;urn2url(urn:ietf:rfc:5257,short);|&amp;color(gray){not implemented};||
|ANNOTATIONS|&amp;urn2url(urn:ietf:rfc:5257,short);|&amp;color(gray){not implemented};||
|TEMPFAIL|&amp;urn2url(urn:ietf:rfc:5259,short);|&amp;color(gray){not implemented};||
:通常のレスポンスと同様&amp;sub{*1};|そのレスポンスを受信したということだけを検知します。　レスポンスに応じた処理を行うといったことはしません。

**関連リンク
<ins>-[[Wg Status Pages:http://tools.ietf.org/wg/]]</ins>
<ins>--[[Eai Status Pages:http://tools.ietf.org/wg/eai/]]</ins>
<ins>--[[Morg Status Pages:http://tools.ietf.org/wg/morg/]]</ins>
-[[IANA — Protocol Registries:http://www.iana.org/protocols/]]
--[[Internet Message Access Protocol 4 Capabilities Registry:http://www.iana.org/assignments/imap4-capabilities]]
--[[IMAP Response Codes:http://www.iana.org/assignments/imap-response-codes/imap-response-codes.xhtml]]
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます|
|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。|
|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。　サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|
<del>//|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|</del>
<ins>|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|</ins>

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

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.23.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.22.tar.bz2}
-0.1x
--[[works/tools/junk/TundereBird]]に含まれているものを使ってください
*不具合・要望・質問等
不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。

<ins>*実装済み機能一覧</ins>
<ins>サポートするPOP標準仕様・拡張仕様の一覧です。</ins>
<ins>:&amp;color(green){implemented};|実装済みの機能</ins>
<ins>一部不完全な箇所があったり、仕様と異なる実装になっているかもしれません</ins>
<ins>:&amp;color(orange){partially implemented};|部分的に実装済みの機能</ins>
<ins>コマンドの送受信のみサポートする、仕様の一部のみをサポートする、などの状態です</ins>
<ins>:&amp;color(red){not tested};|実装済みだが動作確認できていない機能</ins>
<ins>:&amp;color(gray){not implemented};|実装されていない機能</ins>
<ins />
<ins>|RFC|status|note|h</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:1939,anchor-text);|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2384,anchor-text);|&amp;color(green){implemented};|[独自拡張]URLのスキームがpopsの場合、デフォルトポートとして995を使用し、SSLによる接続を試みます。　また、修飾子;MSG=が含まれている場合、メールボックス内の特定のメッセージを表すURLとして解釈します。|</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2449,anchor-text);|&amp;color(orange){partially implemented};|LOGIN-DELAY, PIPELINING, EXPIREに関連する機能は未実装です。　また、レスポンスコードが含まれていても通常のレスポンスと同様&amp;sub{*1};に扱います。|</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2595,anchor-text);|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3206,anchor-text);|&amp;color(orange){partially implemented};|レスポンスコードが含まれていても通常のレスポンスと同様&amp;sub{*1};に扱います。|</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:5034,anchor-text);|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-eai-pop-09,anchor-text);|&amp;color(gray){not implemented};||</ins>
<ins>|RFC|status|note|f</ins>
<ins />
<ins>:通常のレスポンスと同様&amp;sub{*1};|そのレスポンスを受信したということだけを検知します。　レスポンスに応じた処理を行うといったことはしません。</ins>
<ins />
<ins>**関連リンク</ins>
<ins>-[[Wg Status Pages:http://tools.ietf.org/wg/]]</ins>
<ins>--[[Eai Status Pages:http://tools.ietf.org/wg/eai/]]</ins>
<ins>--[[Morg Status Pages:http://tools.ietf.org/wg/morg/]]</ins>
<ins>-[[IANA — Protocol Registries:http://www.iana.org/protocols/]]</ins>
<ins>--[[POP3 Extension Mechanism:http://www.iana.org/assignments/pop3-extension-mechanism]]</ins>
<ins />
*変更履歴
<ins>**0.23</ins>
<ins>-機能追加</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:2449,#8){Extended POP3 Response Codes};に対応</ins>
<ins>--AUTHコマンドを発行する場合、可能なら応答を待たずにinitial-responseを送信するようにした</ins>
<ins>--プロトコル上不正な以下の操作を行おうとした場合、PopProtocolViolationException(SystemExceptionから派生)をスローするようにした</ins>
<ins>---InvalidOperationExceptionをスローしていた箇所はImapProtocolViolationExceptionに変更</ins>
<ins>--PopSession.ServerCapabilitiesに対してコレクションの変更を行おうとした場合、NotSupportedExceptionをスローするようにした</ins>
<ins>--WebClients名前空間</ins>
<ins>---PopWebRequest.ExpectedErrorResponseCodesプロパティを追加</ins>
<ins>---サーバがサポートしない機能を使用しようとした場合、およびプロトコル上不正な操作を行おうとした場合、System.Net.ProtocolViolationExceptionをスローするようにした</ins>
<ins>-修正・改善</ins>
<ins>--受信したレスポンスをstringで保持する機能を削除</ins>
<ins />
**0.22
-[[works/libs/Smdn.Net.Imap4]]をベースに再実装
-PopWebRequest/PopWebResponseクラスの実装を追加
*動作状況
以下のPOPサーバに対して概ね問題なく動作することを確認済みです。
-GMail
<del>-Dovecot</del>
<ins>-Dovecot</ins>

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:keywords,Smdn.Security.Authentication.Sasl,SASL,DIGEST-MD5,CRAM-MD5,C#,.NET,ライブラリ}
C#で書いた.NET Framework/Mono用SASLクライアントライブラリです。　IMAP4クライアントライブラリ[[works/libs/Smdn.Net.Imap4]]およびPOP3クライアントライブラリ[[works/libs/Smdn.Net.Pop3]]にてSASLによる認証処理で使用しています。

<del>*機能概要</del>
<ins>*実装済み機能一覧</ins>
サポートするSASLメカニズムの一覧です。

|RFC|mechanism name|status|note|h
|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1-PLUS|&amp;color(gray){not implemented};||
|RFC|mechanism name|status|note|f

<del>使い方・実装は[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</del>
<ins>使い方・認証処理の実装は[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>

*ダウンロード
#googleadunit
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.23.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.22.tar.bz2}

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

<ins>*変更履歴</ins>
<ins>**0.23</ins>
<ins>-initial client responseを取得するメソッドを追加</ins>
<ins />
**0.22
-[[works/libs/Smdn.Net.Imap4]], [[works/libs/Smdn.Net.Pop3]]バージョンアップに伴うリリース

**0.21
-[[works/libs/Smdn.Net.Imap4]]より分離

<del>**関連するページ</del>
<ins>*関連するページ</ins>
-[[programming/mono/Mono.Security.Protocol.Ntlm]]
-[[programming/tips/cram_md5]]

<del>**関連リンク</del>
<ins>*関連リンク</ins>
-[[IANA — Protocol Registries:http://www.iana.org/protocols/]]
--[[SIMPLE AUTHENTICATION AND SECURITY LAYER MECHANISMS:http://www.iana.org/assignments/sasl-mechanisms]]

</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1264796376</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-01-30T05:19:36+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.23をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.23をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.23をリリース 「Works/Libraries/Smdn.Security.Authentication.Sasl」 version 0.23をリリース 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル」を更新</title>
    <updated>2010-01-30T05:19:36+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Ini/">Works/Libraries/Smdn.Formats.Ini</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,TundereBird}
*概要
<del>IMAP4対応のメールクライアントです。　実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。</del>
<ins>IMAP4・POP3対応のメールクライアントです。　実用を目的としたものではなく、下記ライブラリのサンプル兼デモ用アプリケーションです。</ins>
-[[works/libs/Smdn.Net.Imap4]]
<ins>-[[works/libs/Smdn.Net.Pop3]]</ins>
<ins>-[[works/libs/Smdn.Security.Authentication.Sasl]]</ins>
-[[works/libs/Smdn.Formats.Mime]]
-[[works/libs/Smdn.Formats.Ini]]

-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.22.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>---[[works/libs/Smdn.Net.Imap4]] 0.22</ins>
<ins>---[[works/libs/Smdn.Net.Pop3]] 0.22</ins>
<ins>---[[works/libs/Smdn.Security.Authentication.Sasl]] 0.22</ins>
<ins>---[[works/libs/Smdn.Formats.Mime]] 0.16</ins>
<ins>---[[works/libs/Smdn.Formats.Ini]] 0.16</ins>
--${smdncms:distfilelink,TundereBird-0.21.tar.bz2}
---下記ライブラリのソースを同梱しています
<del>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.21</del>
<ins>---[[works/libs/Smdn.Net.Imap4]] 0.21</ins>
<ins>---[[works/libs/Smdn.Security.Authentication.Sasl]] 0.21</ins>
---[[works/libs/Smdn.Formats.Mime]] 0.15
---[[works/libs/Smdn.Formats.Ini]] 0.15
--${smdncms:distfilelink,TundereBird-0.20.tar.bz2}
--${smdncms:distfilelink,TundereBird-0.13.zip}
---下記ライブラリのソースを同梱しています
---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.13
<del>---[[works/libs/Smdn.Protocols.Pop3]] 0.13</del>
<ins>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.13</ins>
---[[works/libs/Smdn.Formats.Mime]] 0.13
---[[works/libs/Smdn.Formats.Ini]] 0.13
--${smdncms:distfilelink,TundereBird-0.12.zip}
---下記ライブラリのソースを同梱しています
---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.12
<del>---[[works/libs/Smdn.Protocols.Pop3]] 0.12</del>
<ins>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.12</ins>
---[[works/libs/Smdn.Formats.Mime]] 0.12
---[[works/libs/Smdn.Formats.Ini]] 0.12
--${smdncms:distfilelink,TundereBird-0.11.zip}
---下記ライブラリのソースを同梱しています
---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.11
<del>---[[works/libs/Smdn.Protocols.Pop3]] 0.11</del>
<ins>---[[Smdn.Protocols.Pop3&gt;works/libs/Smdn.Net.Pop3]] 0.11</ins>
---[[works/libs/Smdn.Formats.Mime]] 0.11
---[[works/libs/Smdn.Formats.Ini]] 0.11
--${smdncms:distfilelink,TundereBird-0.10.zip}
+Visual Studioではログ出力により動作が遅くなる場合があります。　遅くなる場合は、tunderebird.exe.configを編集してログを出力しないようにしてください。

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

*変更履歴
<ins>**0.22</ins>
<ins>-機能追加</ins>
<ins>--POP3のサポートを再追加</ins>
<ins>--設定ファイルにタイムアウト時間を指定するTimeoutキーを追加</ins>
<ins />
**0.21
-機能追加
--設定ファイルにメールボックスの選択時にSELECTとEXAMINEのどちらを使用するか指定するReadOnlyキーを追加
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。

*使用例
<del>個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClient名前空間の説明を参照してください。</del>
<ins>個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClients名前空間の説明を参照してください。</ins>

**メッセージのダウンロード
WebClientクラスを使って、localhostのINBOXメールボックスからUIDが1のメールをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。
using System;
using System.Net;

<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>

class Sample {
  public static void Main(string[] args)
using System.IO;
using System.Net;

<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>

class Sample {
  public static void Main(string[] args)
using System;
using System.Net;

<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>

class Sample {
  public static void Main(string[] args)
}}

*ライブラリの設計と実装の概要
<del>**クライアント</del>
<del>クライアントの実装は2種類あります。　一つはSmdn.Net.Imap4.Client.Session名前空間のImapSessionクラス、もう一つはSmdn.Net.Imap4.WebClient名前空間のImapWebRequest/ImapWebResponseクラスです。　Smdn.Net.Imap4.WebClient名前空間のクライアントは、System.Net.WebRequest/System.Net.WebResponseを継承したもので、内部でImapSessionクラスを使用しています。</del>
<ins>クライアントの実装は2種類あります。　一つはSmdn.Net.Imap4.Client.Session名前空間のImapSessionクラス、もう一つはSmdn.Net.Imap4.WebClients名前空間のImapWebRequest/ImapWebResponseクラスです。　Smdn.Net.Imap4.WebClients名前空間のクライアントは、System.Net.WebRequest/System.Net.WebResponseを継承したもので、内部でImapSessionクラスを使用しています。</ins>

二つのクライアントのモデルと概要は次の通りです。

:ImapSessionクラス|IMAPのコマンドとほぼ1対1で対応するメソッドを持つクラスです。　IMAPの操作は抽象化していません。　仕様と1対1で対応するような実装にしてあります。
切断する/されるまで選択済みメールボックス・メールボックス毎のフラグ・サーバの能力・名前空間等のセッションの状態を保持します。
<del>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、読み込みのみの操作に関しては送信されるIMAPコマンドを意識せずに扱えます。</del>
<del>ImapWebRequest.KeepAliveプロパティでリクエスト毎にセッションを切断するか、ログイン状態を維持するかどうか設定できます。　また、送信するコマンドはImapWebRequest.Methodプロパティで変更できます。</del>
<ins>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、送信されるIMAPコマンドをあまり意識せずに扱えます。　メッセージのダウンロード・アップロードにWebClientクラスのメソッドを使うこともできます。</ins>
<ins>FtpWebRequest等と同様、WebRequest.Methodプロパティで送信するコマンドを制御できます。</ins>

<del>**認証</del>
<ins>以下でクライアント実装に共通する部分について解説します。　個々のクライアント実装の詳細については各項を参照してください。</ins>
<ins />
<ins>**資格情報</ins>
認証時に必要なユーザ名・パスワードはSystem.Net.ICredentialsByHostインターフェイスを通して取得します。　ICredentialsインターフェイスではなく、ICredentialsByHostインターフェイスを実装していて、GetCredentialメソッドが適切なSystem.Net.NetworkCredentialを返すクラスなら何でも設定できます。

<del>ImapWebRequest.Credentialsプロパティは、WebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、同時にICredentialsByHostを実装していない場合は例外をスローします。</del>
<ins>ImapWebRequest.CredentialsプロパティはWebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、設定されるインスタンスはICredentialsByHostも実装している必要があります。</ins>

**証明書の選択と検証
<del>認証時に使用する証明書はX509Certificate2Collectionで設定できます。　また、証明書の選択と検証にはRemoteCertificateValidationCallbackデリゲートとLocalCertificateSelectionCallbackデリゲートを使用できます。</del>
<ins>SSL/TLS接続時に使用する証明書はX509Certificate2Collectionで設定できます。　また、証明書の選択と検証にはRemoteCertificateValidationCallbackデリゲートとLocalCertificateSelectionCallbackデリゲートを使用できます。</ins>

|*証明書に関する型と該当するメンバ(いずれもクラス・プロパティ)
<del>|~証明書に関する型|&gt;|~該当するメンバ|</del>
<del>|~|~Smdn.Net.Imap4.Protocol.Client名前空間|~Smdn.Net.Imap4.WebClient名前空間|</del>
<ins>|~証明書に関する型|&gt;|~該当するメンバ|h</ins>
<ins>|~|~Smdn.Net.Imap4.Protocol.Client名前空間|~Smdn.Net.Imap4.WebClients名前空間|</ins>
|X509Certificate2Collection|ImapConnection.CertCollection|ImapSessionManager.CertCollection|
|RemoteCertificateValidationCallback|ImapConnection.CertificateValidationCallback|ImapSessionManager.CertificateValidationCallback|
|LocalCertificateSelectionCallback|ImapConnection.CertificateSelectionCallback|ImapSessionManager.CertificateSelectionCallback|
ImapSessionクラスには、IMAPコマンドと1対1に対応するメソッドが用意されています。　また、すべてのコマンドの引数とレスポンスのデータ構造は、それに対応する型が定義されています。　これらの型は出来る限り仕様と1対1で対応するように実装してあり、IMAPの詳細が分からなくても使えることを目的とするような抽象化はしていません。

**メールボックスのインスタンス
<del>メールボックスの情報はImapMailboxクラスに保持されます。　このクラスのインスタンスは、LISTコマンド等により作成された後は、ログアウトするまでライブラリ側で管理されます。　同じメールボックスに対してSELECTしたりRENAMEした場合はインスタンスの値のみが更新され、常に同じインスタンスが返されます。</del>
<ins>メールボックスの情報はImapMailboxクラスに保持されます。　このクラスのインスタンスは、LIST/SELECT/CREATEコマンド等により作成された後は、ログアウトするまでライブラリ側で管理されます。　同じメールボックスに対してSELECTしたりRENAMEした場合はインスタンスの値のみが更新され、常に同じインスタンスが返されます。</ins>

**ログ
<del>シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。　ログにはパスワードを含む送受信内容を解読可能な状態で出力します。　ログの出力が不要な場合はTrace.csを削除するか、TRACEを無効にしてリビルドしてください。</del>
<ins>シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。　ログにはパスワードを含む内容を平文で出力します。　ログの出力が不要な場合はTrace.csを削除するか、TRACEを無効にしてリビルドしてください。</ins>

|*ログ出力に使用するTraceSourceの名前と出力内容
<del>|TraceSource|出力内容|h</del>
<del>|Smdn.Net.Imap4.Client|サーバとの送受信内容とセッション毎の動作ログを出力します。|</del>
<del>|Smdn.Net.Imap4.Client#Connection|サーバとの送受信内容のみを出力します。|</del>
<ins>|TraceSourceの名前|出力内容|h</ins>
<ins>|Smdn.Net.Imap4.Client|コマンドの送受信結果とセッション毎の動作ログを出力します。|</ins>
<ins>|Smdn.Net.MessageAccessProtocols|送信するコマンドと受信したレスポンスの内容を出力します。|</ins>
<ins />
<ins>*Smdn.Net.Imap4.WebClients名前空間</ins>
<ins>ここではSmdn.Net.Imap4.WebClients名前空間のクラスの詳細と使い方を紹介します。　基本的にはHttpWebRequest/ResponseやFtpWebRequest/Responseと同様で、</ins>
<ins>+URLを指定してWebRequest.CreateでWebRequestのインスタンスを作成</ins>
<ins>+Method、Credentialsなどのプロパティを指定</ins>
<ins>+WebRequest.GetResponseでリクエストを実行、レスポンスを取得</ins>
<ins>+取得したWebResponseインスタンスを参照、必要に応じてWebResponse.GetResponseStreamメソッドを呼び出す</ins>

<del>*Smdn.Net.Imap4.WebClient名前空間</del>
<del>Smdn.Net.Imap4.WebClient名前空間のクラスの使い方。</del>
<ins>の順でIMAPコマンドを実行、レスポンスを取得できます。　以下でSmdn.Net.Imap4.WebClientsに固有な部分について解説します。</ins>

**imap, imapsスキームの登録
<del>Smdn.Net.Imap4.WebClient名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</del>
<ins>Smdn.Net.Imap4.WebClients名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</ins>

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

<del>**ログインと認証</del>
<del>認証に用いるユーザ名は、URLから取得します。　URLにユーザ名が指定されていない場合は、ANONYMOUS認証を行います。　パスワードはImapWebRequest.Credentialsを参照し、接続しようとしているホスト名とポート番号から適切なものを取得します。　使用する認証メカニズムもユーザ名同様にURLから取得しますが、省略した場合、"AUTH=*"が指定されている場合は対応している認証方法を順に試行します。</del>
<ins>**リクエストURLと接続時の動作</ins>
<ins>***SSL/TLS・接続ポート</ins>
<ins>リクエストURLのスキームがimapsの場合は、常にSSL/TLSでの接続を試みます。　スキームがimapの場合は、ImapWebRequest.UseTlsIfAvailableプロパティがtrueで、かつサーバがSTARTTLSに対応している場合、認証を開始する前にSSL/TLSを使用した接続にアップグレードします。 URLでポート番号を指定しない場合、デフォルトのポート(imapは143、imapsは993)に接続します。</ins>
<ins />
<ins>|*リクエストURLの形式と接続動作の例</ins>
<ins>|リクエストURLの形式|接続ポート|SSL/TLS|h</ins>
<ins>|imap://imap.example.net/|143|可能ならSSL/TLSへのアップグレードを試行|</ins>
<ins>|imap://imap.example.net:993/|993|可能ならSSL/TLSへのアップグレードを試行|</ins>
<ins>|imaps://imap.example.net/|993|常にSSL/TLSで接続|</ins>
<ins>|imaps://imap.example.net:10143/|10143|常にSSL/TLSで接続|</ins>
<ins />
<ins>***認証</ins>
<ins>認証に用いるユーザ名は、リクエストURLから取得します。　パスワードはWebRequest.Credentialsプロパティを参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。　IMAP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、リクエストURLからはパスワードを取得しません(指定されていても無視します)。</ins>
<ins />
<ins>使用する認証メカニズムもユーザ名同様にURLから取得します。　省略した場合、もしくは"AUTH=*"が指定されている場合は次の順で認証を試行します。</ins>
<ins>+AUTHENTICATEコマンド</ins>
<ins>+LOGINコマンド</ins>
<ins />
<ins>リクエストURLにユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。</ins>
<ins />
<ins>|*リクエストURLの形式と認証動作の例</ins>
<ins>|リクエストURLの形式|ユーザ名|使用する認証メカニズム|h</ins>
<ins>|imap://user;AUTH=DIGEST-MD5@imap.example.net/|user|DIGEST-MD5|</ins>
<ins>|imap://;AUTH=DIGEST-MD5@imap.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</ins>
<ins>|imap://user;AUTH=*@imap.example.net/&amp;br;imap://user@imap.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</ins>
<ins>|imap://;AUTH=ANONYMOUS@imap.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</ins>
<ins>|imap://imap.example.net/|匿名ユーザ(anonymous)|ANONYMOUSもしくはLOGINコマンドを使用|</ins>
<ins />
<ins>試行する認証メカニズムを制御するには、後述するImapWebRequest.UsingSaslMechanismsプロパティの値を変更してください。</ins>
<ins />
<ins>**リクエストURLとリクエスト・レスポンスの動作</ins>
<ins>HTTPと異なり、IMAP URLではリクエストURLの形式によりリクエストの対象が変わります。</ins>
<ins>|*リクエストURLの形式とリクエストの対象</ins>
<ins>|リクエストURLの形式|リクエストの対象|h</ins>
<ins>|imap://imap.example.net/|URLで指定されたサーバ・アカウント|</ins>
<ins>|imap://imap.example.net/mailbox/|URLで指定されたメールボックス|</ins>
<ins>|imap://imap.example.net/mailbox/?...|URLで指定されたメールボックスにあるメッセージのうち、検索クエリに該当する全てのメッセージ|</ins>
<ins>|imap://imap.example.net/mailbox/;UID=1|URLで指定されたメールボックスにあるメッセージのうち、UIDに該当する特定のメッセージ|</ins>
<ins />
<ins>WebRequest.Createメソッドが返すWebRequestインスタンスのMethodプロパティにデフォルトで設定される値は、リクエストURLの形式によって決まります。</ins>
<ins />
<ins>ImapWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。　以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。　ImapWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては別項で説明します。</ins>
<ins />
<ins>***サーバ・アカウントに対するリクエスト</ins>
<ins>リクエストURLがサーバ・アカウントを表す場合(imap://imap.example.net/の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|ImapWebRequestMethods.Lsub, "LSUB"&amp;br;(デフォルト)|LSUBコマンドを送信して購読中のメールボックスの一覧を取得します。|-|取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.List, "LIST"|LISTコマンドを送信して全てのメールボックスの一覧を取得します。|-|取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***メールボックスに対するリクエスト</ins>
<ins>リクエストURLがメールボックスを表す場合(imap://imap.example.net/mailbox/の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得するのはメッセージの属性のみ(ALLマクロで取得されるフラグ、サイズ、internal date、エンベロープ)です。　メッセージ本文は取得しません。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Append, "APPEND"|APPENDコマンドを送信してメールボックスにメッセージをアップロードします。|アップロードするメッセージはWebRequest.GetRequestStreamメソッドが返すStreamに書き込みます。　現在の実装では、リクエスト開始時にContentLengthの値が指定されているか、GetRequestStreamメソッドが返すStreamを閉じるまでアップロードは保留されます。　メッセージはMIME形式であるべきですが、ライブラリ側ではアップロードする内容をチェックしません。|サーバがアップロードしたメッセージのUIDを返す場合は、アップロードしたメッセージのURLがWebResponse.ResponseUriに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Expunge, "EXPUNGE"|EXPUNGEコマンドを送信してメールボックスから\Deletedフラグの付いたメッセージを削除します。|-|-|</ins>
<ins>|ImapWebRequestMethods.Create, "CREATE"|CREATEコマンドを送信してURLで指定された名前でメールボックスを作成します。|作成できた場合、作成したメールボックスに対して自動的にSUBSCRIBEコマンドを送信します。|作成したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。　また、作成したメールボックスのURLがWebResponse.ResponseUriに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Delete, "DELETE"|DELETEコマンドを送信してメールボックスを削除します。|削除しようとするメールボックスに対してUNSUBSCRIBEコマンドを送信してから削除します。&amp;br;削除しようとするメールボックスにメッセージがある場合は削除に失敗するので、STOREやEXPUNGEでメッセージを削除してからメールボックスを削除する必要があります。|-|</ins>
<ins>|ImapWebRequestMethods.Rename, "RENAME"|RENAMEコマンドを送信してメールボックスの名前を変更します。|変更後のメールボックス名はImapWebRequest.DestinationUriプロパティで指定します。|名前を変更した後のメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。　また、名前を変更した後のメールボックスのURLがWebResponse.ResponseUriに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Check, "CHECK"|CHECKコマンドを送信します。|このコマンドは何もしません。　CHECKコマンドの動作、レスポンスの内容はサーバの実装によります。|-|</ins>
<ins>|ImapWebRequestMethods.Select, "SELECT"|SELECTコマンドを送信してメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Examine, "EXAMINE"|EXAMINEコマンドを送信して読み取り専用でメールボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|選択したメールボックスは、ImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Subscribe, "SUBSCRIBE"|SUBSCRIBEコマンドを送信してメールボックスの購読を開始します。|-|-|</ins>
<ins>|ImapWebRequestMethods.Unsubscribe, "UNSUBSCRIBE"|UNSUBSCRIBEコマンドを送信してメールボックスの購読を解除します。|-|-|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***メールボックスに対する検索クエリを含むリクエスト</ins>
<ins>リクエストURLがメールボックスに対する検索クエリを表す場合(imap://imap.example.net/mailbox/?...の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|ImapWebRequestMethods.Search, "SEARCH"&amp;br;(デフォルト)|SEARCHコマンドを送信して検索クエリに該当するメッセージの一覧を取得します。|取得するのはメッセージの属性のみ(ALLマクロで取得されるフラグ、サイズ、internal date、エンベロープ)です。　メッセージ本文は取得しません。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Copy, "COPY"|COPYコマンドを送信して検索クエリに該当するメッセージを別のメールボックスにコピーします。|コピー先のメールボックスはImapWebRequest.DestinationUriプロパティで指定します。|コピー先のメールボックスを自動的に作成した場合、作成したメールボックスはImapWebResponse.Mailboxesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Expunge, "EXPUNGE"|STOREコマンドを送信して検索クエリに該当するメッセージに\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。|サーバが&amp;urn2url(urn:ietf:rfc:4315,#2.1){UID EXPUNGE};に対応していない場合、検索クエリに該当したメッセージだけでなく''既に\Deletedフラグが設定されている他のメッセージも同時に削除されます''。|-|</ins>
<ins>|ImapWebRequestMethods.Store, "STORE"|STOREコマンドを送信して検索クエリに該当するメッセージにフラグを追加・削除・設定します。|追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。|-|</ins>
<ins>|ImapWebRequestMethods.Sort, "SORT"|SORTコマンドを送信して検索クエリに該当するメッセージの一覧をソート済みの形式で取得します。|ソート方法はImapWebRequest.SortCriteriaプロパティで指定します。&amp;br;''サーバがSORT=* extensionをサポートしない場合、WebExceptionをスローします。''|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Thread, "THREAD"|THREADコマンドを送信して検索クエリに該当するメッセージの一覧をスレッド形式で取得します。|スレッド形式のアルゴリズムはImapWebRequest.ThreadingAlgorithmプロパティで指定します。&amp;br;''サーバがTHREAD=* extensionをサポートしない場合、WebExceptionをスローします。''|取得したスレッド形式の一覧は、ImapWebResponse.ThreadTreeプロパティに設定されます。|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***メールボックス内の特定のメッセージに対するリクエスト</ins>
<ins>リクエストURLが特定のメッセージを表す場合(imap://imap.example.net/mailbox/;UID=1の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|ImapWebRequestMethods.Fetch, "FETCH"&amp;br;(デフォルト)|FETCHコマンドを送信してメッセージの本文を取得します。|該当するUIDのメッセージがない場合、WebExceptionStatus.SuccessのWebExceptionをスローします。|メッセージ本文はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。　取得するメッセージのサイズはWebResponse.ContentLength、Content-TypeはWebResponse.ContentTypeプロパティに設定されます。|</ins>
<ins>|ImapWebRequestMethods.Expunge, "EXPUNGE"|STOREコマンドを送信して\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。|サーバが&amp;urn2url(urn:ietf:rfc:4315,#2.1){UID EXPUNGE};に対応していない場合、URLで指定されたメッセージだけでなく''既に\Deletedフラグが設定されている他のメッセージも同時に削除されます''。|-|</ins>
<ins>|ImapWebRequestMethods.Store, "STORE"|STOREコマンドを送信してメッセージにフラグを追加・削除・設定します。|追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。|-|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***リクエスト対象に制限されないリクエスト</ins>
<ins>リクエストURLの形式によらず使用可能なコマンドのリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティに指定可能な値|リクエスト|解説|レスポンス|h</ins>
<ins>|ImapWebRequestMethods.NoOp, "NOOP"|NOOPコマンドを送信します。|このコマンドは何もしません。　自動ログアウトタイマの更新、セッションの接続性確認、新着メッセージの確認などに使います。|-|</ins>
<ins>|Methodプロパティに指定可能な値|リクエスト|解説|レスポンス|f</ins>

<del>URLのスキームがimapの場合で、ポート番号を省略した場合はデフォルトでポート143に接続します。　imapsの場合でポート番号が指定されていない場合はデフォルトでポート993に接続します。　また、imapsの場合は、SSLでの接続を試みます。</del>
<ins>***ImapWebRequestクラスのプロパティ</ins>
<ins>ImapWebRequestクラスにはMethodプロパティ以外にもコマンド送信時の動作を制御するためのプロパティを用意してあります。　プロパティの値によってリクエスト内容と動作が変わります。</ins>

<del>|*URLの形式と認証動作の例</del>
<del>|URLの形式|認証動作|h</del>
<del>|imap://user;AUTH=DIGEST-MD5@localhost/|ユーザ名'user'でDIGEST-MD5を使ってlocalhostのポート143に接続|</del>
<del>|imaps://user@localhost:10993/|ユーザ名'user'でlocalhostのポート10993にSSLで接続|</del>
<del />
<del>ImapWebRequest.KeepAliveプロパティにtrueを指定した場合は、リクエストが終了してもセッションは維持し、逆にfalseを指定した場合はリクエストが終了するとセッションを閉じます。　ImapWebRequest.KeepAliveプロパティのデフォルトはtrueです。</del>
<del />
<del>**URLの形式とリクエストの種類</del>
<del>HTTPと異なり、IMAP URLの形式によりリクエストする内容が変わります。</del>
<del>|*URLの形式とデフォルトのリクエスト内容</del>
<del>|URLの形式|リクエスト内容|h</del>
<del>|サーバを表す場合&amp;br;(例: imap://example.com/)|サーバにあるメールボックスの一覧を取得します。|</del>
<del>|メールボックスを表す場合&amp;br;(例: imap://example.com/INBOX/)|メールボックスにあるメッセージの一覧を取得します。|</del>
<del>|メールボックス内の単一のメッセージを表す場合&amp;br;(例: imap://example.com/INBOX/;UID=1)|該当するUIDを持つメッセージの属性と本文を取得します。|</del>
<del>|メールボックスに対する検索クエリを含む場合&amp;br;(例: imap://example.com/INBOX/?RECENT)|メールボックスにあるメッセージのうち、検索クエリに該当するものの一覧を取得します。|</del>
<del />
<del>リクエスト内容はImapWebRequest.Methodプロパティに設定する値によっても変わります。　URLがサーバを表す場合のリクエスト内容と動作・レスポンスは次の通りです。</del>
<del>|*サーバを表すURLでのリクエスト</del>
<del>|Methodプロパティの値|リクエスト内容|動作とレスポンス|h</del>
<del>|null, String.Empty&amp;br;またはImapWebRequestMethods.Lsub|Methodを指定しない場合のデフォルトの動作です。&amp;br;LSUBコマンドを送信してメールボックスの一覧を取得します。|取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。|</del>
<del>|ImapWebRequestMethods.List|LISTコマンドを送信してメールボックスの一覧を取得します。|取得したメールボックスの一覧は、ImapWebResponse.Mailboxesプロパティに設定されます。|</del>
<del>|ImapWebRequestMethods.Noop|NOOPコマンドを送信します。|このコマンドは何もしません。　自動ログアウトタイマの更新、セッションの接続性確認などに使います。|</del>
<del />
<del>URLがメールボックスを表す場合のリクエスト内容と動作・レスポンスは次の通りです。</del>
<del>|*メールボックスを表すURLでのリクエスト</del>
<del>|Methodプロパティの値|リクエスト内容|動作とレスポンス|h</del>
<del>|null, String.Empty&amp;br;またはImapWebRequestMethods.Fetch|Methodを指定しない場合のデフォルトの動作です。&amp;br;FETCHコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。&amp;br;取得するのはメッセージの属性のみ(ALLマクロで取得されるフラグ、サイズ、internal date、エンベロープ)です。　メッセージ本文は取得しません。|</del>
<del>|ImapWebRequestMethods.Append|APPENDコマンドを送信してメールボックスにメッセージをアップロードします。|アップロードするメッセージはImapWebRequest.GetRequestStreamメソッドで取得したStreamに書き込みます。　メッセージはMIME形式であるべきですが、ライブラリ側ではアップロードする内容をチェックしません。|</del>
<del>|ImapWebRequestMethods.Create|CREATEコマンドを送信してURLで指定された名前でメールボックスを作成します。|作成できた場合、作成したメールボックスに対して自動的にSUBSCRIBEコマンドを送信します。|</del>
<del>|ImapWebRequestMethods.Delete|DELETEコマンドを送信してメールボックスを削除します。|削除しようとするメールボックスに対してUNSUBSCRIBEコマンドを送信してから削除します。&amp;br;削除しようとするメールボックスにメッセージがある場合は削除に失敗するので、STOREやEXPUNGEでメッセージを削除してからメールボックスを削除する必要があります。|</del>
<del>|ImapWebRequestMethods.Expunge|EXPUNGEコマンドを送信してメールボックスから\Deletedフラグの付いたメッセージを削除します。||</del>
<del>|ImapWebRequestMethods.Examine|EXAMINEコマンドを送信して読み取り専用でメッセージボックスを選択します。|このコマンドは選択するだけで何もしません。　メールボックスの状態を取得する場合などに使います。|</del>
<del>|ImapWebRequestMethods.Rename|RENAMEコマンドを送信してメールボックスの名前を変更します。|変更後のメールボックス名はImapWebRequest.DestinationUriプロパティで指定します。|</del>
<del>|ImapWebRequestMethods.Subscribe|SUBSCRIBEコマンドを送信してメールボックスの購読を開始します。||</del>
<del>|ImapWebRequestMethods.Unsubscribe|UNSUBSCRIBEコマンドを送信してメールボックスの購読を解除します。||</del>
<del />
<del>URLが単一のメッセージを表す場合のリクエスト内容と動作・レスポンスは次の通りです。</del>
<del>|*単一のメッセージを表すURLでのリクエスト</del>
<del>|Methodプロパティの値|リクエスト内容|動作とレスポンス|h</del>
<del>|null, String.Empty&amp;br;またはImapWebRequestMethods.Fetch|Methodを指定しない場合のデフォルトの動作です。&amp;br;FETCHコマンドを送信してメッセージの本文を取得します。|メッセージ本文はImapWebResponse.GetResponseStreamメソッドで取得したStreamから読み込めます。|</del>
<del>|ImapWebRequestMethods.Expunge|STOREコマンドを送信して\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。|サーバが&amp;urn2url(urn:ietf:rfc:4315,#2.1){UID EXPUNGE};に対応していない場合、URLで指定されたメッセージだけでなく''既に\Deletedフラグが設定されている他のメッセージも同時に削除されます''。|</del>
<del>|ImapWebRequestMethods.Store|STOREコマンドを送信してメッセージにフラグを追加・削除・設定します。|追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。|</del>
<del />
<del>URLが検索クエリを含む場合のリクエスト内容と動作・レスポンスは次の通りです。</del>
<del>|*検索クエリを含むURLでのリクエスト</del>
<del>|Methodプロパティの値|リクエスト内容|動作とレスポンス|h</del>
<del>|null, String.Empty&amp;br;またはImapWebRequestMethods.Search|Methodを指定しない場合のデフォルトの動作です。&amp;br;SEARCHコマンドを送信して検索クエリに該当するメッセージの一覧を取得します。|取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。&amp;br;取得するのはメッセージの属性のみ(ALLマクロで取得されるフラグ、サイズ、internal date、エンベロープ)です。　メッセージ本文は取得しません。|</del>
<del>|ImapWebRequestMethods.Copy|COPYコマンドを送信して検索クエリに該当するメッセージを別のメールボックスにコピーします。|コピー先のメールボックスはImapWebRequest.DestinationUriプロパティで指定します。|</del>
<del>|ImapWebRequestMethods.Expunge|STOREコマンドを送信して検索クエリに該当するメッセージに\Deletedフラグを追加した後、EXPUNGEコマンドを送信してメッセージを削除します。|サーバが&amp;urn2url(urn:ietf:rfc:4315,#2.1){UID EXPUNGE};に対応していない場合、検索クエリに該当したメッセージだけでなく''既に\Deletedフラグが設定されている他のメッセージも同時に削除されます''。|</del>
<del>|ImapWebRequestMethods.Store|STOREコマンドを送信して検索クエリに該当するメッセージにフラグを追加・削除・設定します。|追加・削除・設定するフラグはImapWebRequest.StoreDataItemプロパティで指定します。|</del>
<del>|ImapWebRequestMethods.Thread|THREADコマンドを送信して検索クエリに該当するメッセージの一覧をスレッド形式で取得します。|スレッド形式のアルゴリズムはImapWebRequest.ThreadingAlgorithmプロパティで指定します。　また、取得したスレッド形式の一覧は、ImapWebResponse.ThreadTreeプロパティに設定されます。&amp;br;''サーバがTHREAD=* extensionをサポートしない場合、WebExceptionをスローします。''|</del>
<del>|ImapWebRequestMethods.Sort|SORTコマンドを送信して検索クエリに該当するメッセージの一覧をソート済みの形式で取得します。|ソート方法はImapWebRequest.SortCriteriaプロパティで指定します。　また、取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。&amp;br;''サーバがSORT=* extensionをサポートしない場合、WebExceptionをスローします。''|</del>
<ins>|*ImapWebRequestクラスのプロパティ</ins>
<ins>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</ins>
<ins>|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます|</ins>
<ins>|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|</ins>
<ins>|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。|</ins>
<ins>|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。　サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|</ins>
<ins>|ReadOnly|false|FETCH, SEARCH等|メールボックスを選択する際に、SELECTコマンドの代わりにEXAMINEコマンドを送信するかどうかを指定します。　メッセージに対する操作を行うコマンドを送信する場合に有効になります。　EXAMINEコマンドで選択したメールボックスのメッセージに対する操作の結果はサーバの実装によります。　ReadOnlyがtrueでもDELETEなどのコマンドには影響しません。|</ins>
<ins>|AllowCreateMailbox|true|COPY|COPYコマンドを送信した際にサーバがレスポンスコードTRYCREATEを返した場合、自動的にメールボックスを作成するかどうかを指定します。　現在の実装では、APPENDコマンドでTRYCREATEが返された場合でもメールボックスは作成せず、常にエラーとなります。|</ins>
<ins>|DestinationUri|null|COPY, RENAME|COPYの場合はメッセージのコピー先メールボックス名、RENAMEの場合は変更後のメールボックス名を含むURLを指定します。　URLはコピー元・変更前(WebRequest.RequestUri)と同一サーバ、同一ユーザである必要があります。　それ以外の場合、ArgumentExceptionをスローします。|</ins>
<ins>|StoreDataItem|null|STORE|STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。|</ins>
<ins>|FetchBlockSize|10240|FETCH|FETCHコマンドでメッセージ本文を取得する際に、1回のFETCHコマンドで取得するブロックのサイズをバイト単位で指定します。|</ins>

<del>***IMAP URLに関する注意事項など</del>
<del>-現時点では検索クエリに日本語等非ASCII文字を含めることはできません。　URLエンコードした文字列を検索クエリに含めた場合でも、エンコードした結果に非ASCII文字が含まれるような場合はリクエスト時にWebExceptionをスローします。</del>
<del>-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。　現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。</del>
<ins>WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。</ins>

<del>**ImapWebRequestクラスのプロパティ</del>
<del>ImapWebRequestクラスにはコマンド送信時の動作を制御するためのプロパティを用意してあります。　プロパティの値によってリクエスト内容と動作が変わります。</del>
<ins>|*WebRequestクラスから継承されるプロパティ</ins>
<ins>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</ins>
<ins>|Timeout|-1|全て|リクエストを開始してからレスポンスを取得するまでのタイムアウト時間を指定します。|</ins>
<ins>|ReadWriteTimeout|300000|全て|ソケット送受信のタイムアウト時間を指定します。|</ins>
<ins>|ContentLength|0|APPEND|メールボックスにアップロードするメッセージのサイズを指定します。|</ins>

<ins>以下のプロパティは、未テスト・不完全な実装に関連するプロパティです。　使用はできますが、今後廃止する可能性もあるので、現時点では使用を推奨できません。</ins>
|*ImapWebRequestクラスのプロパティ
|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h
<del>|KeepAlive|true|全て|リクエストが終了した後もログイン状態を維持するかどうかを指定します。|</del>
<del>|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)</del>
<del>|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、TLSを使用した接続に変更します。|</del>
|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。　(この機能は現在動作しません。　trueにした場合、NotImplementedExceptionがスローされます)|
<del>|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、WebExceptionがスローされません。|</del>
<del>|ReadOnly|false|FETCH, SEARCH等|メールボックスを選択する際に、SELECTコマンドの代わりにEXAMINEコマンドを送信するかどうかを指定します。　メッセージに対する操作を行うコマンドを送信する場合に有効になります。　EXAMINEコマンドで選択したメールボックスのメッセージに対する操作の結果はサーバの実装によります。　ReadOnlyがtrueでもDELETEなどのコマンドには影響しません。|</del>
<ins>|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)</ins>
|SearchCriteriaEncoding|Encoding.UTF8|SEARCH等|検索クエリのエンコードに使用する文字コードを指定します。　サーバがサポートしていない文字コードを指定した場合はエラーとなります。　(この機能は現在動作しません。　将来のバージョンで検索クエリにASCII文字以外も含められるようにした時点で機能します。)|
<del>|AllowCreateMailbox|true|COPY|COPYコマンドを送信した際にサーバがレスポンスコードTRYCREATEを返した場合、自動的にメールボックスを作成するかどうかを指定します。|</del>
<del>|DestinationUri|null|COPY, RENAME|COPYの場合はメッセージのコピー先、RENAMEの場合は変更後のメールボックス名を含むURLを指定します。　URLはコピー元・変更前と同一サーバ、同一ユーザである必要があります。　それ以外の場合、InvalidOperationExceptionをスローします。|</del>
<del>|StoreDataItem|null|STORE|STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。|</del>
|SortCriteria|null|SORT|SORTコマンドで使用するソート方法を指定します。|
|ThreadingAlgorithm|null|THREAD|THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。|

<ins>***リクエストとIMAP URLに関するその他の留意事項</ins>
<ins>-現時点では検索クエリに日本語等非ASCII文字を含めることはできません。　URLエンコードした文字列を検索クエリに含めた場合でも、エンコードした結果に非ASCII文字が含まれるような場合はリクエスト時にWebExceptionをスローします。</ins>
<ins>-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。　現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。</ins>
<ins />
**サンプル
***メッセージのコピー
INBOXにあるメッセージすべてをINBOX.backupにコピーする例。　AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。
using System;
using System.Net;
using Smdn.Net.Imap4;
<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>
  :

var request = WebRequest.Create("imap://user@localhost/INBOX/?ALL") as ImapWebRequest;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.Protocol.Client;
<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>
  :

var request = WebRequest.Create("imap://user@localhost/INBOX.old/") as ImapWebRequest;
using System.Net;
using Smdn.Net.Imap4;
using Smdn.Net.Imap4.Protocol.Client;
<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>
  :

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

using Smdn.Net.Imap4;
using Smdn.Net.Imap4.Protocol.Client;
<del>using Smdn.Net.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClients;</ins>
  :

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

*Smdn.Net.Imap4.Client.Session名前空間
<del>Smdn.Net.Imap4.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Imap4.WebClientの各クラスの実装を参照してください。</del>
<ins>Smdn.Net.Imap4.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Imap4.WebClientsの各クラスの実装を参照してください。</ins>

**サンプル
***ログインと各種コマンド送信の例
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,Smdn.Net.Imap4}
<ins>${smdncms:header_title,Smdn.Net.Imap4}</ins>
${smdncms:keywords,Smdn.Net.Imap4,IMAP,IMAP4,IMAP4rev1,C#,.NET,Mono,mail,クライアント,ライブラリ}
C#で書いた.NET Framework/Mono用IMAP4rev1クライアントライブラリです。　IMAPサーバからのメールボックスの管理(作成・削除・ステータスの取得など)、メッセージの検索・取得・アップロードなどが出来ます。

<ins>-姉妹品</ins>
<ins>--[[works/libs/Smdn.Net.Pop3]]</ins>
<ins>-関連ライブラリ</ins>
<ins>--[[works/libs/Smdn.Security.Authentication.Sasl]]</ins>
<ins>--[[works/libs/Smdn.Formats.Mime]]</ins>
<ins />
*機能概要
使用可能なコマンド
:認証系コマンド|LOGIN, AUTHENTICATE, LOGOUT, STARTTLS
<del>::認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</del>
<ins>::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</ins>
<ins>SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています</ins>
:メールボックス操作系コマンド|
::標準コマンド|CREATE, RENAME, DELETE, CLOSE, SELECT, EXAMINE, LIST, LSUB, STATUS, SUBSCRIBE, UNSUBSCRIBE
::拡張コマンド|RLIST, RLSUB, UNSELECT, NAMESPACE

実装しているクライアントは次の二種類です。
:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント
<del>:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URLでの操作に対応したクライアント</del>
<ins>:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)での操作に対応したクライアント</ins>
<ins />
<ins>その他、サポートしている機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。</ins>

<del>使い方・サンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]、機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</del>
<ins>*使い方・サンプルコード</ins>
<ins>もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとIMAP URLを使ったメッセージのダウンロード方法を例示します。　Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4.WebClients;</ins>
<ins />
<ins>class GimapFetchExample {</ins>
<ins>  public static void Main()</ins>
<ins>  {</ins>
<ins>    ImapSessionManager.RegisterWebRequestPrefix();</ins>
<ins>    ImapSessionManager.CertificateValidationCallback += delegate {</ins>
<ins>      return true;</ins>
<ins>    };</ins>
<ins />
<ins>    using {</ins>
<ins>      client.Credentials = new NetworkCredential("username", "password");</ins>
<ins>      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml");</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]およびデモ用アプリケーション[[works/tools/junk/TundereBird]]をご覧ください。</ins>

*ダウンロード
#googleadunit
-開発版
--[[anonsvn]]よりチェックアウトできます
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.22.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.21.tar.bz2}
--${smdncms:distfilelink,Smdn.Protocols.Imap4-0.20.tar.bz2}
-0.1x
--[[works/tools/junk/TundereBird]]に含まれているものを使ってください

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

*変更履歴
<ins>**0.22</ins>
<ins>主にWebClients名前空間のクラスの改善。</ins>
<ins />
<ins>-機能追加</ins>
<ins>--INBOXをDELETEしようとした場合、InvalidOperationExceptionをスローするようにした</ins>
<ins>--コマンド実行中にタイムアウトが発生した場合、TimeoutExceptionをスローするようにした</ins>
<ins>--コマンドを発行する際に引数のチェックを行い、ArgumentExceptionをスローするようにした(未完了につき不完全)</ins>
<ins>--WebClients名前空間</ins>
<ins>---任意の形式のIMAP URLでNOOPコマンドを発行できるようにした</ins>
<ins>---CHECKコマンド、SELECTコマンドを発行できるようにした</ins>
<ins>---リクエスト実行中にImapWebRequestの各プロパティを設定しようとした場合、InvalidOperationExceptionをスローするようにした</ins>
<ins>---ImapWebRequest.MethodプロパティおよびImapWebRequest.DestinationUriプロパティの値のチェックを、リクエスト実行時ではなく値の設定時に行うようにした</ins>
<ins>---ImapWebRequest.MethodプロパティがFETCHの場合、取得するメッセージのContent-TypeをWebResponse.ContentTypeプロパティに設定するようにした</ins>
<ins>---ImapWebRequest.UsingSaslMechanismsプロパティを追加</ins>
<ins>---ImapWebRequest.ReadWriteTimeoutプロパティを追加</ins>
<ins>---ImapWebRequest.FetchBlockSizeプロパティを追加</ins>
<ins>---WebClient.Download*Asyncメソッドから呼び出されても正しく動作するようにした</ins>
<ins>-修正・改善</ins>
<ins>--LIST/LSUBを発行せずにRENAMEすると例外エラーとなる不具合を修正</ins>
<ins>--ImapSession.ReceiveTimeoutを設定・取得しようとするとImapSession.SendTimeoutが設定・取得されてしまう不具合を修正</ins>
<ins>--タイムアウト関連の実装を整理</ins>
<ins>--タイムアウト・内部例外エラーが発生した場合、セッションを切断・破棄するように変更</ins>
<ins>--WebClients名前空間</ins>
<ins>---名前空間をWebClientからWebClient''s''に変更</ins>
<ins>---Imap*Exceptionなど内部で発生した例外をWebExceptionにラップしてスローするように修正</ins>
<ins>---STARTTLSを発行した後でも、レスポンス・メールボックス等のURLのスキーム部分をimapのままにするように修正</ins>
<ins>---AUTH=*の場合、LOGINDISABLEDが指示されていてもLOGINコマンドを発行してしまう不具合を修正</ins>
<ins>---ImapWebRequest.BeginGetResponseメソッドにコールバックメソッドを指定しても呼び出されない不具合を修正</ins>
<ins>---ImapWebRequest.KeepAliveプロパティがtrueの場合、異なるメールボックスを選択する際にUNSELECTコマンドを使用しないよう変更</ins>
<ins>---ImapWebRequest.MethodプロパティがNOOPの場合、NOOPコマンドが2回発行されてしまう不具合を修正</ins>
<ins>---ImapWebRequest.MethodプロパティがFETCHの場合、該当するメッセージが無い場合にWebExceptionStatus.SuccessのWebExceptionをスローするようにした</ins>
<ins>---ImapWebRequest.MethodプロパティがCOPYの場合、AllowCreateMailboxプロパティに指定されている値と逆の動作になる不具合を修正</ins>
<ins>---その他、HttpWebRequest・FtpWebRequest等と同じような動作となるように改善</ins>
<ins>-その他</ins>
<ins>--WebClients名前空間のテストケースを追加</ins>
<ins>--上記以外の細かい修正など</ins>
<ins />
**0.21
-機能追加
--WebClient名前空間

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.7</del>
<ins>-Mono 2.7</ins>

*制限事項
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|&amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,anchor-text);|THREAD=REFS|&amp;color(green){implemented};||
|RFC|capability name|status|note|f

<del>**SASL mechanisms</del>
<del>サポートするSASL認証メカニズムの一覧です。</del>
<del>|RFC|mechanism name|status|note|h</del>
<del>|&amp;urn2url(urn:ietf:rfc:1731,anchor-text);|KERBEROS_V4|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2195,anchor-text);|CRAM-MD5|&amp;color(green){implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2444,anchor-text);|OTP|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2444,anchor-text);|SKEY|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2595,anchor-text);|PLAIN|&amp;color(green){implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2808,anchor-text);|SECURID|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:2831,anchor-text);|DIGEST-MD5|&amp;color(orange){partially implemented};|realmには対応していません。　また、サーバ側の実装によっては正しく動作しない可能性があります。|</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-RSA-SHA1-ENC|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-RSA-SHA1-ENC|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-DSA-SHA1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-DSA-SHA1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-ECDSA-SHA1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-ECDSA-SHA1|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:4422,anchor-text);|EXTERNAL|&amp;color(gray){not implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:4505,anchor-text);|ANONYMOUS|&amp;color(green){implemented};||</del>
<del>|&amp;urn2url(urn:ietf:rfc:4752,anchor-text);|GSSAPI|&amp;color(gray){not implemented};||</del>
<del>|[[[MS-NLMP:http://msdn.microsoft.com/en-us/library/cc236621(PROT.13).aspx]]] NT LAN Manager{partially implemented};|Mono.Security.dllを使用します。　Mono.Security.dllを動的にロードできない環境では使用できません。　また、サーバ側の実装によっては正しく動作しない可能性があります。|</del>
<del>|RFC|mechanism name|status|note|f</del>
<del />
**commands
サポートするコマンドの一覧です。
|command|RFC|status|note|h
-[[IANA — Protocol Registries:http://www.iana.org/protocols/]]
--[[Internet Message Access Protocol 4 Capabilities Registry:http://www.iana.org/assignments/imap4-capabilities]]
--[[IMAP Response Codes:http://www.iana.org/assignments/imap-response-codes/imap-response-codes.xhtml]]
<del>--[[SIMPLE AUTHENTICATION AND SECURITY LAYER MECHANISMS:http://www.iana.org/assignments/sasl-mechanisms]]</del>
-[[The IMAP Connection -- IMAP Documents: RFCs and Drafts:http://www.imap.org/biblio.html]]
-[[IMAP Server implementations:http://www.melnikov.ca/mel/devel/ServerReference.html]]

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,Smdn.Formats.Mime}
<ins>${smdncms:header_title,Smdn.Formats.Mime}</ins>
${smdncms:keywords,C#,.NET,Mono,MIME,ライブラリ}
C#で書いた.NET Framework/Mono用MIMEメッセージライブラリです。　MIME形式のメッセージの読み込み、デコードが出来ます。

-開発版
--[[anonsvn]]よりチェックアウトできます
-0.1x
<ins>--${smdncms:distfilelink,Smdn.Formats.Mime-0.16.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Formats.Mime-0.15.tar.bz2}
--${smdncms:distfilelink,Smdn.Formats.Mime-0.14.tar.bz2}
--上記以前のバージョン
---[[works/tools/junk/TundereBird]]に含まれているものを使ってください

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

*サンプル
emlファイルを読み込んでヘッダの一覧とボディの内容を表示する例。

*変更履歴

<ins>**0.16</ins>
<ins>-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</ins>
<ins />
**0.15
-機能追加
--添付ファイル・代替メッセージの作成機能、メッセージのエンコード・フォーマット機能を追加(ただしインターフェイスは未確定)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/doc/">Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,ドキュメント・サンプル}</ins>
<ins>${smdncms:keywords,}</ins>
<ins>[[works/libs/Smdn.Net.Pop3]]のドキュメントとサンプルです。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>
<ins />
<ins>*使用例</ins>
<ins>個々のサンプルの詳細については、後述するSmdn.Net.Pop3.WebClients名前空間の説明を参照してください。</ins>
<ins />
<ins>**メッセージのダウンロード</ins>
<ins>WebClientクラスを使って、localhostのメールボックスから1番目のメッセージをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Imap4.WebClients;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    PopSessionManager.RegisterWebRequestPrefix();</ins>
<ins />
<ins>    using {</ins>
<ins>      client.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>      client.DownloadFile("pop://user;AUTH=DIGEST-MD5@localhost/;MSG=1", "sample.eml");</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>**メッセージ一覧の取得</ins>
<ins>WebRequestクラスを使って、Gmailアカウントのメールボックスからメールの一覧を取得し、もっとも最近のメールをダウンロード・表示する例。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Text;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Pop3;</ins>
<ins>using Smdn.Net.Pop3.WebClients;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    PopSessionManager.RegisterWebRequestPrefix();</ins>
<ins>    PopSessionManager.CertificateValidationCallback += delegate {</ins>
<ins>      return true;</ins>
<ins>    };</ins>
<ins />
<ins>    var baseUrl = new Uri("pops://user@pop.gmail.com/");</ins>
<ins>    var credential = new NetworkCredential("user", "pass");</ins>
<ins />
<ins>    var request = WebRequest.Create(baseUrl) as PopWebRequest;</ins>
<ins />
<ins>    request.Credentials = credential;</ins>
<ins>    request.Method = "LIST";</ins>
<ins>    request.KeepAlive = true;</ins>
<ins />
<ins>    PopScanListing[] scanLists;</ins>
<ins />
<ins>    using {</ins>
<ins>      scanLists = response.ScanLists;</ins>
<ins>    }</ins>
<ins />
<ins>    var recentMessageUrl = string.Format("./;MSG={0}", scanLists[scanLists.Length - 1].MessageNumber);</ins>
<ins />
<ins>    request = WebRequest.Create(new Uri(baseUrl, recentMessageUrl)) as PopWebRequest;</ins>
<ins />
<ins>    request.Credentials = credential;</ins>
<ins>    request.Method = "RETR";</ins>
<ins>    request.KeepAlive = false;</ins>
<ins />
<ins>    using {</ins>
<ins>      using {</ins>
<ins>        var reader = new StreamReader(stream, Encoding.GetEncoding("iso-2022-jp"));</ins>
<ins />
<ins>        Console.WriteLine(reader.ReadToEnd());</ins>
<ins>      }</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>*ライブラリの設計と実装の概要</ins>
<ins>このドキュメントは作成中です。</ins>
<ins />
<ins>[[works/libs/Smdn.Net.Imap4]]の[[works/libs/Smdn.Net.Imap4/doc]]を参照してください。　プロトコルに固有な部分をのぞき、設計・実装は[[works/libs/Smdn.Net.Imap4]]と同様です。</ins>
<ins />
<ins>*Smdn.Net.Pop3.WebClients名前空間</ins>
<ins>ここではSmdn.Net.Pop3.WebClients名前空間のクラスの詳細と使い方を紹介します。　基本的にはHttpWebRequest/ResponseやFtpWebRequest/Responseと同様で、</ins>
<ins>+URLを指定してWebRequest.CreateでWebRequestのインスタンスを作成</ins>
<ins>+Method、Credentialsなどのプロパティを指定</ins>
<ins>+WebRequest.GetResponseでリクエストを実行、レスポンスを取得</ins>
<ins>+取得したWebResponseインスタンスを参照、必要に応じてWebResponse.GetResponseStreamメソッドを呼び出す</ins>
<ins />
<ins>の順でPOPコマンドを実行、レスポンスを取得できます。　以下でSmdn.Net.Pop3.WebClientsに固有な部分について解説します。</ins>
<ins />
<ins>**pop, popsスキームの登録</ins>
<ins>Smdn.Net.Pop3.WebClients名前空間のクラスを使う場合には、WebRequestクラスがpopスキームおよびpopsスキームのURLを処理できるようにPopSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</ins>
<ins />
<ins>このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、popスキームおよびpopsスキームに対してPopSessionManagerを関連付けます。</ins>
<ins />
<ins>**リクエストURLと接続時の動作</ins>
<ins>***SSL/TLS・接続ポート</ins>
<ins>リクエストURLのスキームがpopsの場合は、常にSSL/TLSでの接続を試みます。　スキームがpopの場合は、PopWebRequest.UseTlsIfAvailableプロパティがtrueで、かつサーバがSTLSに対応している場合、認証を開始する前にSSL/TLSを使用した接続にアップグレードします。 URLでポート番号を指定しない場合、デフォルトのポート(popは110、popsは995)に接続します。</ins>
<ins />
<ins>|*リクエストURLの形式と接続動作の例</ins>
<ins>|リクエストURLの形式|接続ポート|SSL/TLS|h</ins>
<ins>|pop://pop.example.net/|110|可能ならSSL/TLSへのアップグレードを試行|</ins>
<ins>|pop://pop.example.net:995/|995|可能ならSSL/TLSへのアップグレードを試行|</ins>
<ins>|pops://pop.example.net/|995|常にSSL/TLSで接続|</ins>
<ins>|pops://pop.example.net:10110/|10143|常にSSL/TLSで接続|</ins>
<ins />
<ins>***認証</ins>
<ins>認証に用いるユーザ名は、リクエストURLから取得します。　パスワードはWebRequest.Credentialsプロパティを参照し、接続しようとしているホスト名・ポート番号および指定された認証メカニズムをもとに適切なものを取得します。　POP URLではFTPやHTTPのURLとは異なり、URLに平文パスワードを含めることが許可されていないので、リクエストURLからはパスワードを取得しません(指定されていても無視します)。</ins>
<ins />
<ins>使用する認証メカニズムもユーザ名同様にURLから取得します。　APOPを使用する場合は、"AUTH=+APOP"を指定してください。　認証メカニズムを省略した場合、もしくは"AUTH=*"が指定されている場合は次の順で認証を試行します。</ins>
<ins>+AUTHコマンド</ins>
<ins>+APOPコマンド</ins>
<ins>+USER/PASSコマンド</ins>
<ins />
<ins>リクエストURLにユーザ名・認証メカニズムの両方とも指定されていない場合は、ANONYMOUS認証を行います。</ins>
<ins />
<ins>|*リクエストURLの形式と認証動作の例</ins>
<ins>|リクエストURLの形式|ユーザ名|使用する認証メカニズム|h</ins>
<ins>|pop://user;AUTH=+APOP@pop.example.net/|user|APOP|</ins>
<ins>|pop://user;AUTH=DIGEST-MD5@pop.example.net/|user|DIGEST-MD5|</ins>
<ins>|pop://;AUTH=DIGEST-MD5@pop.example.net/|WebRequest.Credentialsより取得|DIGEST-MD5|</ins>
<ins>|pop://user;AUTH=*@pop.example.net/&amp;br;pop://user@pop.example.net/|user|サーバ・クライアントが対応しているものを順に試行|</ins>
<ins>|pop://;AUTH=ANONYMOUS@pop.example.net/|匿名ユーザ(anonymous)|ANONYMOUS|</ins>
<ins>|pop://pop.example.net/|匿名ユーザ(anonymous)|ANONYMOUSもしくはUSER/PASSコマンドを使用|</ins>
<ins />
<ins>試行する認証メカニズムを制御するには、後述するPopWebRequest.UsingSaslMechanismsプロパティの値を変更してください。</ins>
<ins />
<ins>**リクエストURLとリクエスト・レスポンスの動作</ins>
<ins>POP URL(&amp;urn2url(urn:ietf:rfc:2384,short);)ではPOPサーバ(メールボックス)を表す形式しか規定されていませんが、本ライブラリでは独自の拡張としてメッセージ番号を指定してリクエストできるようにしてあります。　リクエストURLにメッセージ番号(;MSG=x)が含まれているかどうかでリクエストの対象が変わります。</ins>
<ins>|*リクエストURLの形式とリクエストの対象</ins>
<ins>|リクエストURLの形式|リクエストの対象|h</ins>
<ins>|pop://pop.example.net/|URLで指定されたメールボックス|</ins>
<ins>|pop://pop.example.net/;MSG=1|URLで指定されたメールボックスにあるメッセージのうち、メッセージ番号に該当する特定のメッセージ|</ins>
<ins />
<ins>WebRequest.Createメソッドが返すWebRequestインスタンスのMethodプロパティにデフォルトで設定される値は、リクエストURLの形式によって決まります。</ins>
<ins />
<ins>PopWebRequest.GetResponseの動作は、リクエストURLで表されるリクエストの対象と、WebRequest.Methodプロパティに設定する値によって変わります。　以下でリクエストURLの形式とMethodプロパティに指定可能な値、リクエストとレスポンスについて解説します。　PopWebRequestクラスのプロパティのうち、リクエストに影響するその他のプロパティについては別項で説明します。</ins>
<ins />
<ins>***メールボックスに対するリクエスト</ins>
<ins>リクエストURLがメールボックスを表す場合(pop://pop.example.net/の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|PopWebRequestMethods.List, "LIST"&amp;br;(デフォルト)|LISTコマンドを送信してメールボックスにあるメッセージの一覧を取得します。|-|取得したメッセージの一覧は、PopWebResponse.ScanListsプロパティに設定されます。|</ins>
<ins>|PopWebRequestMethods.Rset, "RSET"|RSETコマンドを送信してDELEコマンドの操作をキャンセルします。|-||</ins>
<ins>|PopWebRequestMethods.Stat, "STAT"|STATコマンドを送信してメールボックスにあるメッセージの数と総サイズを取得します。|-|取得したメッセージ数と総サイズは、PopWebResponse.DropListプロパティに設定されます。|</ins>
<ins>|PopWebRequestMethods.Uidl, "UIDL"|UIDLコマンドを送信してメールボックスにあるメッセージのIDの一覧を取得します。|-|取得したIDの一覧は、PopWebResponse.UniqueIdListsプロパティに設定されます。|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***特定のメッセージに対するリクエスト</ins>
<ins>リクエストURLが特定のメッセージを表す場合(pop://pop.example.net/;MSG=1の形式)のリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|h</ins>
<ins>|PopWebRequestMethods.Retr, "RETR"&amp;br;(デフォルト)|RETRコマンドを送信してメッセージの本文を取得します。|-|メッセージ本文はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。　取得したメッセージのサイズはWebResponse.ContentLengthプロパティに設定されます。|</ins>
<ins>|PopWebRequestMethods.Dele, "DELE"|DELEコマンドを送信してメッセージを削除します。|-|-|</ins>
<ins>|PopWebRequestMethods.List, "LIST"|LISTコマンドを送信してメッセージの番号とサイズを取得します。|-|取得したメッセージ番号とサイズは、PopWebResponse.ScanListsプロパティに設定されます。|</ins>
<ins>|PopWebRequestMethods.Top, "TOP"|TOPコマンドを送信してメッセージをヘッダ部分を取得します。|現時点ではTOPで取得するボディ部分の行数は指定できません(常に0を指定します)。|メッセージのヘッダ部分はWebResponse.GetResponseStreamメソッドが返すStreamから読み込めます。　取得したヘッダ部分のサイズはWebResponse.ContentLengthプロパティに設定されます。|</ins>
<ins>|PopWebRequestMethods.Uidl, "UIDL"|UIDLコマンドを送信してメッセージの番号とIDを取得します。|-|取得したメッセージ番号とIDは、PopWebResponse.UniqueIdListsプロパティに設定されます。|</ins>
<ins>|Methodプロパティ|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***リクエスト対象に制限されないリクエスト</ins>
<ins>リクエストURLの形式によらず使用可能なコマンドのリクエストとレスポンスの動作は次のとおりです。</ins>
<ins />
<ins>|Methodプロパティに指定可能な値|リクエスト|解説|レスポンス|h</ins>
<ins>|PopWebRequestMethods.NoOp, "NOOP"|NOOPコマンドを送信します。|このコマンドは何もしません。　自動ログアウトタイマの更新、セッションの接続性確認などに使います。|-|</ins>
<ins>|Methodプロパティに指定可能な値|リクエスト|解説|レスポンス|f</ins>
<ins />
<ins>***PopWebRequestクラスのプロパティ</ins>
<ins>PopWebRequestクラスにはMethodプロパティ以外にもコマンド送信時の動作を制御するためのプロパティを用意してあります。　プロパティの値によってリクエスト内容と動作が変わります。</ins>
<ins />
<ins>|*PopWebRequestクラスのプロパティ</ins>
<ins>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</ins>
<ins>|KeepAlive|true|全て|リクエストが終了した後もセッションを維持するかどうかを指定します。　trueの場合はリクエストが終了してもセッションは維持し、falseの場合はリクエストの度にセッションを開きリクエスト終了と同時にセッションを閉じます|</ins>
<ins>|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、認証を行う前にTLSを使用した接続にアップグレードします。|</ins>
<ins>|UsingSaslMechanisms|{"DIGEST-MD5", "CRAM-MD5", "NTLM"}|全て(認証時)|認証メカニズムが指定されていない場合に、試行する認証メカニズムとその順番を配列で指定します。　サーバ・クライアントの両方がサポートするメカニズム以外が指定されている場合は無視します。|</ins>
<ins>//|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、エラーレスポンスでもWebExceptionがスローされません。|</ins>
<ins />
<ins>WebRequestクラスから継承されるプロパティのうち、以下のプロパティは使用することができます。</ins>
<ins />
<ins>|*WebRequestクラスから継承されるプロパティ</ins>
<ins>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</ins>
<ins>|Timeout|-1|全て|リクエストを開始してからレスポンスを取得するまでのタイムアウト時間を指定します。|</ins>
<ins>|ReadWriteTimeout|300000|全て|ソケット送受信のタイムアウト時間を指定します。|</ins>
<ins />
<ins>*Smdn.Net.Pop3.Client.Session名前空間</ins>
<ins>Smdn.Net.Pop3.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Pop3.WebClientsの各クラスの実装を参照してください。</ins>
<ins />
<ins>**Gmail</ins>
<ins>Gmailに接続し、メッセージの一覧を取得した後、一番最後のメッセージを取得し、表示するサンプル。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins>using System.Text;</ins>
<ins>using System.Net;</ins>
<ins />
<ins>using Smdn.Net.Pop3;</ins>
<ins>using Smdn.Net.Pop3.Client.Session;</ins>
<ins>using Smdn.Net.Pop3.Protocol.Client;</ins>
<ins />
<ins>class Sample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    PopConnection.CertificateValidationCallback += delegate {</ins>
<ins>      return true;</ins>
<ins>    };</ins>
<ins />
<ins>    using {</ins>
<ins>      session.Credentials = new NetworkCredential("user", "pass");</ins>
<ins />
<ins>      if {</ins>
<ins>        Console.Error.WriteLine("authentication failed");</ins>
<ins>        return;</ins>
<ins>      }</ins>
<ins />
<ins>      PopScanListing[] scanLists;</ins>
<ins />
<ins>      session.List(out scanLists);</ins>
<ins />
<ins>      PopMessage message;</ins>
<ins />
<ins>      session.Retr(scanLists[scanLists.Length - 1].MessageNumber, out message);</ins>
<ins />
<ins>      var reader = new StreamReader(message.Body, Encoding.GetEncoding("iso-2022-jp"));</ins>
<ins />
<ins>      Console.WriteLine(reader.ReadToEnd());</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Pop3/">Works/Libraries/Smdn.Net.Pop3</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,Smdn.Net.Pop3}
<ins>${smdncms:header_title,Smdn.Net.Pop3}</ins>
${smdncms:keywords,C#,.NET,Mono,POP,POP3}
C#で書いた.NET Framework/Mono用POP3クライアントライブラリです。　POPサーバからのメールボックスのステータス取得、メッセージのダウンロード・削除が出来ます。

<del>*機能</del>
<del>現在対応している機能の一覧です。　部分的に対応しているものも含みます。</del>
<del>-認証</del>
<del>--APOP</del>
<del>--AUTH</del>
<del>--USER/PASS</del>
<del>--STLS</del>
<del>-コマンド</del>
<del>--STAT, LIST, RETR, DELE, NOOP, RSET, TOP, UIDL, QUIT</del>
<del>--CAPA</del>
<del>-その他</del>
<del>--RFC 2384 POP URL Scheme</del>
<del />
<del>RFC 1939で規定されているコマンドは概ね実装が完了しています。</del>
<ins>-姉妹品</ins>
<ins>--[[works/libs/Smdn.Net.Imap4]]</ins>
<ins>-関連ライブラリ</ins>
<ins>--[[works/libs/Smdn.Security.Authentication.Sasl]]</ins>
<ins>--[[works/libs/Smdn.Formats.Mime]]</ins>

<del>*ダウンロード</del>
<del>#googleadunit</del>
<del>[[works/tools/junk/TundereBird]]に含まれているものを使ってください。</del>
<ins>*機能</ins>
<ins>使用可能なコマンド</ins>
<ins>:認証系コマンド|USER, PASS, QUIT, APOP, AUTH(&amp;urn2url(urn:ietf:rfc:5034,short);)</ins>
<ins>::SASL認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</ins>
<ins>SASLの実装は[[works/libs/Smdn.Security.Authentication.Sasl]]に含まれています</ins>
<ins>:メッセージ操作系コマンド|STAT, LIST, RETR, DELE, TOP, UIDL, RSET</ins>
<ins>:その他のコマンド|NOOP, CAPA(&amp;urn2url(urn:ietf:rfc:2449,short);), STLS(&amp;urn2url(urn:ietf:rfc:2595,short);)</ins>
<ins />
<ins>実装しているクライアントは次の二種類です。</ins>
<ins>:PopSessionクラス|POPコマンドと1対1に対応するメソッドを持つクライアント</ins>
<ins>:PopWebRequest/PopWebResponseクラス|WebRequest/WebResponseクラスから派生し、POP URL(&amp;urn2url(urn:ietf:rfc:2384,short);)での操作に対応したクライアント</ins>

<del>*サンプル</del>
<del>本ライブラリを使用して、GMail POPサーバからメールをダウンロードして本文を表示したあと、サーバ上のメールを削除する例です。</del>
<ins>*使い方・サンプルコード</ins>
<ins>もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとPOP URLを使ったメッセージのダウンロード方法を例示します。　Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。</ins>
#code(cs){{
using System;
<del>using Smdn.Protocols.Pop3;</del>
<del>using Smdn.Protocols.Pop3.Client;</del>
<ins>using System.Net;</ins>

<del>public class GmailRetrieveSample {</del>
<del>  public static void Main(string[] args) {</del>
<del>    using {</del>
<del>      agent.Initialize();</del>
<del>      agent.ServerCertificateValidationCallback = delegate {</del>
<del>        return true;</del>
<del>      };</del>
<ins>using Smdn.Net.Pop3.WebClients;</ins>

<del>      var client = agent.CreateClient();</del>
<ins>class GpopRetrieveExample {</ins>
<ins>  public static void Main()</ins>
<ins>  {</ins>
<ins>    PopSessionManager.RegisterWebRequestPrefix();</ins>
<ins>    PopSessionManager.CertificateValidationCallback += delegate {</ins>
<ins>      return true;</ins>
<ins>    };</ins>
<ins />
<ins>    using {</ins>
<ins>      client.Credentials = new NetworkCredential("username", "password");</ins>
<ins>      client.DownloadFile("pops://username@pop.gmail.com/;MSG=1", "message.eml");</ins>
<ins>    }</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>

<del>      client.HostUri = new PopUri("pop://username;AUTH=*@pop.gmail.com:995/");</del>
<del>      client.Password = "password";</del>
<del>      client.UseSsl = true;</del>
<ins>この例で使用している修飾子(;MSG=1)はPOP URLに対する独自の拡張です。　詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Pop3/doc]]およびデモ用アプリケーション[[works/tools/junk/TundereBird]]をご覧ください。</ins>

<del>      client.Login();</del>
<ins>*ダウンロード</ins>
<ins>#googleadunit</ins>
<ins>0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。</ins>

<del>      foreach {</del>
<del>        client.Retrieve(message);</del>
<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
<ins>-0.2x</ins>
<ins>--${smdncms:distfilelink,Smdn.Net.Pop3.Client-0.22.tar.bz2}</ins>
<ins>-0.1x</ins>
<ins>--[[works/tools/junk/TundereBird]]に含まれているものを使ってください</ins>

<del>        Console.WriteLine(message.Body);</del>
<ins>*不具合・要望・質問等</ins>
<ins>不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

<del>        client.Delete(message);</del>
<del>      }</del>
<ins>*変更履歴</ins>
<ins>**0.22</ins>
<ins>-[[works/libs/Smdn.Net.Imap4]]をベースに再実装</ins>
<ins>-PopWebRequest/PopWebResponseクラスの実装を追加</ins>
<ins>-アセンブリ名・名前空間をSmdn.Protocols.Pop3からSmdn.Net.Pop3に改名</ins>
<ins />
<ins>**0.13</ins>
<ins>-STLSコマンドによるTLSへのアップグレードに対応</ins>
<ins>-取得したメッセージの改行文字が環境によって変わってしまう不具合を修正</ins>

<del>      client.Logout();</del>
<del>    }</del>
<del>  }</del>
<del>}</del>
<del>}}</del>
<ins>**0.12</ins>
<ins>-HMACMD5アルゴリズムの実装を独自の実装からライブラリ標準のクラスを用いたものに変更</ins>

<del>本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もご覧ください。</del>
<ins>**0.11</ins>
<ins>-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</ins>

<del>*変更履歴</del>
<del>:0.13|STLSコマンドによるTLSへのアップグレードに対応</del>
<del>取得したメッセージの改行文字が環境によって変わってしまう不具合を修正</del>
<del>:0.12|HMACMD5アルゴリズムの実装を独自の実装からライブラリ標準のクラスを用いたものに変更</del>
<del>:0.11|[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</del>
<del>:0.10|初版</del>
<ins>**0.10</ins>
<ins>-初版</ins>

*動作状況
<del>以下のPOPサーバに対して動作することを確認済みです。</del>
<del>-Gpop(GMail)</del>
<del>-Dovecot</del>
<del>--1.0.rc17</del>
<ins>以下のPOPサーバに対して概ね問題なく動作することを確認済みです。</ins>
<ins>-GMail</ins>
<ins>-Dovecot</ins>

以下の環境で動作することを確認済みです。
<del>-.NET Framework 2.0.50727</del>
<del>-Mono 1.2.6</del>
<del>-Mono 1.9</del>
<del />
<del>*対応予定</del>
<del>今後対応する予定の機能です。</del>
<del>-RFC 3206 The SYS and AUTH POP Response Codes</del>
<del>-[[works/libs/Smdn.Net.Imap4]]と統合したバージョンの作成</del>
<ins>-.NET Framework 3.5</ins>
<ins>-Mono 2.7</ins>

<del>*注意</del>
<ins>*制限事項</ins>
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
<del>-本ライブラリはトレースにログを出力します。　ログにはパスワードを含む送受信内容を解読可能な状態で書き出します。　不要な場合はTrace.csを削除するか、TRACEオプションおよびDUMPオプションを外してリビルドしてください。</del>
<del>-タイムアウト処理を実装してありますが、タイムアウトさせると内部状態がおかしくなるので使わない方がいいです。</del>

*参考文献
#amazon(4873110289,left,content)
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Security.Authentication.Sasl/">Works/Libraries/Smdn.Security.Authentication.Sasl</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,Smdn.Security.Authentication.Sasl}</ins>
<ins>${smdncms:header_title,Smdn.Security.Authentication.Sasl}</ins>
<ins>${smdncms:keywords,Smdn.Security.Authentication.Sasl,SASL,DIGEST-MD5,CRAM-MD5,C#,.NET,ライブラリ}</ins>
<ins>C#で書いた.NET Framework/Mono用SASLクライアントライブラリです。　IMAP4クライアントライブラリ[[works/libs/Smdn.Net.Imap4]]およびPOP3クライアントライブラリ[[works/libs/Smdn.Net.Pop3]]にてSASLによる認証処理で使用しています。</ins>
<ins />
<ins>*機能概要</ins>
<ins>サポートするSASLメカニズムの一覧です。</ins>
<ins />
<ins>|RFC|mechanism name|status|note|h</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:1731,anchor-text);|KERBEROS_V4|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2195,anchor-text);|CRAM-MD5|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2444,anchor-text);|OTP|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2444,anchor-text);|SKEY|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2595,anchor-text);|PLAIN|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2808,anchor-text);|SECURID|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:2831,anchor-text);|DIGEST-MD5|&amp;color(orange){partially implemented};|realmには対応していません。　また、サーバ側の実装によっては正しく動作しない可能性があります。|</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-RSA-SHA1-ENC|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-RSA-SHA1-ENC|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-DSA-SHA1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-DSA-SHA1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-U-ECDSA-SHA1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:3163,anchor-text);|9798-M-ECDSA-SHA1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:4422,anchor-text);|EXTERNAL|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:4505,anchor-text);|ANONYMOUS|&amp;color(green){implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:rfc:4752,anchor-text);|GSSAPI|&amp;color(gray){not implemented};||</ins>
<ins>|[[[MS-NLMP:http://msdn.microsoft.com/en-us/library/cc236621(PROT.13).aspx]]] NT LAN Manager{partially implemented};|Mono.Security.dllを使用します。　Mono.Security.dllを動的にロードできない環境では使用できません。　また、サーバ側の実装によっては正しく動作しない可能性があります。|</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-*|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1|&amp;color(gray){not implemented};||</ins>
<ins>|&amp;urn2url(urn:ietf:id:ietf-sasl-scram-10,anchor-text);|SCRAM-SHA-1-PLUS|&amp;color(gray){not implemented};||</ins>
<ins>|RFC|mechanism name|status|note|f</ins>
<ins />
<ins>使い方・実装は[[works/libs/Smdn.Net.Imap4]]および[[works/libs/Smdn.Net.Pop3]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>
<ins />
<ins>*ダウンロード</ins>
<ins>#googleadunit</ins>
<ins>すべてMIT X11ライセンスでのリリースとなります。</ins>
<ins />
<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
<ins>-0.2x</ins>
<ins>--${smdncms:distfilelink,Smdn.Security.Authentication.Sasl-0.22.tar.bz2}</ins>
<ins />
<ins>*不具合・要望・質問等</ins>
<ins>不具合の報告、ライブラリに対する要望や提案、使い方の質問などは[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>
<ins />
<ins>**0.22</ins>
<ins>-[[works/libs/Smdn.Net.Imap4]], [[works/libs/Smdn.Net.Pop3]]バージョンアップに伴うリリース</ins>
<ins />
<ins>**0.21</ins>
<ins>-[[works/libs/Smdn.Net.Imap4]]より分離</ins>
<ins />
<ins>**関連するページ</ins>
<ins>-[[programming/mono/Mono.Security.Protocol.Ntlm]]</ins>
<ins>-[[programming/tips/cram_md5]]</ins>
<ins />
<ins>**関連リンク</ins>
<ins>-[[IANA — Protocol Registries:http://www.iana.org/protocols/]]</ins>
<ins>--[[SIMPLE AUTHENTICATION AND SECURITY LAYER MECHANISMS:http://www.iana.org/assignments/sasl-mechanisms]]</ins>
<ins />
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Ini/">Works/Libraries/Smdn.Formats.Ini</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,Smdn.Formats.Ini}
<ins>${smdncms:header_title,Smdn.Formats.Ini}</ins>
${smdncms:keywords,C#,.NET,Mono,Ini,ライブラリ}
C#で書いた.NET Framework/Mono用INIファイル読み込み/保存ライブラリです。

-開発版
--[[anonsvn]]よりチェックアウトできます
-0.1x
<ins>--${smdncms:distfilelink,Smdn.Formats.Ini-0.16.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Formats.Ini-0.15.tar.bz2}
--${smdncms:distfilelink,Smdn.Formats.Ini-0.14.tar.bz2}
--上記以前のバージョン
---[[works/tools/junk/TundereBird]]に含まれているものを使ってください

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

*サンプル
本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
}}

*変更履歴
<ins>**0.16</ins>
<ins>-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</ins>
<ins />
**0.15
-機能追加
--任意の型変換用デリゲート(Converter&lt;string, TOutput&gt;)を指定して値を取得できるようにした
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1264257421</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2010-01-23T23:37:01+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.22をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.22をリリース 「Works/Libraries/Smdn.Net.Pop3」 version 0.22をリリース 「Works/Libraries/Smdn.Security.Authentication.Sasl」 version 0.22をリリース 「Works/Libraries/Smdn.Formats.Mime」 version 0.16をリリース 「Works/Libraries/Smdn.Formats.Ini」 version 0.16をリリース 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新 「Works/Libraries/Smdn.Net.Pop3/ドキュメント・サンプル」を追加</title>
    <updated>2010-01-23T23:37:01+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/softwares/subversion/">Softwares/Subversion</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/softwares/subversion/">Softwares/Subversion</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
cp -ipr repo_old/conf/* repo_old/conf/*
}}

<ins>**リポジトリの一部分を切り出す</ins>
<ins>ダンプファイルからリポジトリツリーの一部分を取り出したり除外したりするにはsvndumpfilterを使う。</ins>
<ins>#code{{</ins>
<ins>/</ins>
<ins>|-- mod_foo/</ins>
<ins>`-- mod_bar/</ins>
<ins>}}</ins>
<ins>例えば、上記のような構成のリポジトリから、mod_fooだけを切り出して一つのリポジトリを作成するには次のようにする。</ins>
<ins />
<ins>まずリポジトリのダンプファイルを作成する。</ins>
<ins>#code(sh){{</ins>
<ins>svnadmin dump repo &gt; repo.dump</ins>
<ins>}}</ins>
<ins>続いて、このダンプファイルから、mod_fooだけを含むようにsvndumpfilterでフィルタする。</ins>
<ins>#code(sh){{</ins>
<ins>svndumpfilter include mod_foo/ --drop-empty-revs --renumber-revs &lt; repo.dump &gt; mod_foo.dump</ins>
<ins>}}</ins>
<ins>後は、出来上がったmod_foo.dumpを新しいリポジトリにロードすることで、mod_fooだけを含むリポジトリを作成できる。</ins>
<ins>#code(sh){{</ins>
<ins>svnadmin create mod_foo</ins>
<ins>svnadmin load mod_foo &lt; mod_foo.dump</ins>
<ins>}}</ins>
<ins />
<ins>svndumpfilterで指定できるオプションは次のとおり。</ins>
<ins>:include|指定したパスを''含む''変更をフィルタして切り出す</ins>
<ins>:exclude|指定したパスを''除く''変更をフィルタして切り出す</ins>
<ins>:--drop-empty-revs|フィルタした結果、切り出すサブツリーに関係する変更がないリビジョンはダンプファイルに含めない</ins>
<ins>:--renumber-revs|フィルタした結果に、新しくリビジョン番号を振り直す</ins>
<ins>:--preserve-revprops|もとのリビジョン属性を維持する(リビジョン属性はフィルタしない)</ins>
<ins />
**異なるバージョン間でのリポジトリ移動
あるバージョンのSubversionで管理されているリポジトリを、別のバージョンのSubversionで管理されている環境に移動する場合は、svnadmin dump/loadを使い次の手順で行う。
+バージョンAのsvnadminでリポジトリをダンプする
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1262530505</id>
    <link href="http://smdn.invisiblefulmoon.net/softwares/subversion/" rel="alternate" />
    <published>2010-01-03T23:55:05+09:00</published>
    <title type="text">「Softwares/Subversion」を更新</title>
    <updated>2010-01-03T23:55:05+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/">Works/Tools/東方シリーズ音楽抜き出し機</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/">Works/Tools/東方シリーズ音楽抜き出し機</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
**最新版
#googleadunit
-パッケージ
<del>--安定版 ${smdncms:distfilelink,ThbgmExtractor-1.4.2.lzh,version 1.4.2 パッケージ}</del>
<del>--プレビュー版 ${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.lzh,version 1.5.0pre パッケージ}</del>
<ins>--安定版 ${smdncms:distfilelink,ThbgmExtractor-1.4.3.lzh,version 1.4.3 パッケージ}</ins>
<ins>--プレビュー版 ${smdncms:distfilelink,ThbgmExtractor-1.5.0-beta1.lzh,version 1.5.0 beta1 パッケージ}</ins>
-ソース
--開発版は[[anonsvn]]からチェックアウトできます
<del>--${smdncms:distfilelink,ThbgmExtractor-1.4.2.tar.bz2,version 1.4.2 ソース}</del>
<del>--${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.tar.bz2,version 1.5.0pre ソース}</del>
<ins>--${smdncms:distfilelink,ThbgmExtractor-1.4.3.tar.bz2,version 1.4.3 ソース}</ins>
<ins>--${smdncms:distfilelink,ThbgmExtractor-1.5.0-beta1.tar.bz2,version 1.5.0 beta1 ソース}</ins>
--ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります

各バージョンのパッケージに含まれる曲目ファイルは下記のとおりです。　表に無い作品、または×が付いている作品の音楽を抜き出す場合は別途曲目ファイルを用意してください。
**過去のバージョン
-パッケージ
--version 1.5系
<del>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.lzh,version 1.5.0pre パッケージ}</del>
<del>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev253.lzh,version 1.5.0pre パッケージ}</del>
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.lzh,version 1.5.0pre}</ins>
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.lzh,version 1.5.0pre}</ins>
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev253.lzh,version 1.5.0pre}</ins>
--version 1.4系
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.4.2.lzh,version 1.4.2}</ins>
---${smdncms:distfilelink,ThbgmExtractor-1.4.1.lzh,version 1.4.1}
---${smdncms:distfilelink,ThbgmExtractor-1.4.lzh,version 1.4}
---${smdncms:distfilelink,ThbgmExtractor-1.4-beta2.lzh,version 1.4 beta2}
---${smdncms:distfilelink,thbgmextractor_exe.lzh,version 1.0}
-ソース
--version 1.5系(ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります)
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.tar.bz2,version 1.5.0pre}</ins>
---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.tar.bz2,version 1.5.0pre}
---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev253.tar.bz2,version 1.5.0pre}
--version 1.4系(ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります)
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.4.2.tar.bz2,version 1.4.2}</ins>
---${smdncms:distfilelink,ThbgmExtractor-1.4.1.tar.bz2,version 1.4.1}
---${smdncms:distfilelink,ThbgmExtractor-1.4.tar.bz2,version 1.4}
---${smdncms:distfilelink,ThbgmExtractor-1.4-beta2.tar.bz2,version 1.4 beta2}
---${smdncms:distfilelink,thbgmextractor_src.lzh,version 1.0}

**曲目ファイル
<del>上記のパッケージに含まれていない曲目ファイルは、以下からダウンロードしてください。　曲目ファイルはexeファイルと同じ位置にコピーしてください。</del>
<del>-製品版用曲目ファイル</del>
<del>--${smdncms:distfilelink,titles_th10.txt,「東方風神録」用曲目ファイル}</del>
<del>--${smdncms:distfilelink,titles_th09.txt,「東方花映塚」用曲目ファイル}</del>
<del>--${smdncms:distfilelink,titles_th08.txt,「東方永夜抄」用曲目ファイル}</del>
<del>--${smdncms:distfilelink,titles_th07.txt,「東方妖々夢」用曲目ファイル}</del>
<del>-体験版用曲目ファイル</del>
<del>--${smdncms:distfilelink,titles_th10tr.txt,「東方風神録 体験版」用曲目ファイル}</del>
<del>--${smdncms:distfilelink,titles_th09tr.txt,「東方花映塚 体験版」用曲目ファイル}</del>
<del>--${smdncms:distfilelink,titles_th08tr.txt,「東方永夜抄 体験版」用曲目ファイル}</del>
<ins>version 1.3以前のパッケージに含まれていない曲目ファイルは、[[anonsvn]]の以下の場所で取得できます。　曲目ファイルはexeファイルと同じ位置にコピーしてください。</ins>
<ins>-http://smdn.invisiblefulmoon.net/anonsvn/tools/ThbgmExtractor/tags/20071027_release-1.3/src/ThbgmExtractor/Titles/</ins>

また、以下のサイトにて公開されている曲目ファイルも使用できます。
:[[Variabler Stern:http://variabler-stern.sakura.ne.jp/]]さん|東方妖々夢以降の作品の曲目ファイルが公開されています。
:[[また〜り不定期日記（仮）:http://www.selena-net.com/~piabrpg/mata-ri/tohotool.html]]さん|東方妖々夢体験版以降の作品および上海アリス幻樂団以外の作品の曲目ファイルが公開されています。

<del>version 1.4以降の曲目ファイルのフォーマットについては、[[works/libs/Smdn.Formats.Thbgm]]を参照してください。</del>
<ins>version 1.4以降の曲目ファイルのフォーマットについては、[[works/libs/Smdn.Formats.Thbgm]]を参照してください。　最新の曲目ファイルは[[anonsvn]]の以下の場所で取得できます。</ins>
<ins>-http://smdn.invisiblefulmoon.net/anonsvn/libs/Smdn/trunk/Smdn.Formats.Thbgm/</ins>

*必須環境・動作確認済み環境
-必須
--Ubuntu 9.10 + Mono 2.5

*使い方の簡単な説明
<ins>**version 1.5</ins>
<ins>準備中、version 1.4の説明を参照してください。</ins>
<ins />
**version 1.4
設定など気にせずとにかく抜き出せればいいのであれば、thbgm.datをThbgmExtractor.exeにドラッグアンドドロップするだけで抜き出しを開始できます。　Waveファイルの出力先を設定すればデフォルトの設定で抜き出しを開始します。
#ref(thbgmextractor_howto_1_4_fastest.jpg,thbgm.datをThbgmExtractor.exeにドラッグアンドドロップすれば抜き出しを開始します)
英語の翻訳を修正してくれる方、英語以外の言語(主に繁体字中国語・ロシア語あたり)に翻訳してくれる方を募集しています。

*変更履歴
<ins>**version 1.5.0 beta1</ins>
<ins>-機能追加</ins>
<ins>--標準入力を経由してエンコードできるようにした</ins>
<ins>--抜き出し・エンコード後のファイルにタグ付けできるようにした</ins>
<ins>--リスト上でもエフェクトの各値を編集できるようにした</ins>
<ins>--出力ファイル名をトラック毎に編集できるようにした</ins>
<ins>--リスト上で抜き出し・エンコード処理の進捗を表示するようにした</ins>
<ins>-修正・改善</ins>
<ins>--機能追加に伴いデフォルトのEncoders.confの内容を修正</ins>
<ins>--抜き出し・エンコード・タグ付け処理の実装を改良</ins>
<ins>--WAVE出力時、dataチャンクを2048バイト単位でアラインメントためのJUNKチャンクをヘッダに付記するように修正</ins>
<ins>--1.4.3と同様の修正・改善</ins>
<ins />
**version 1.5.0pre
-機能追加
--出力ファイルサイズをリストに表示するようにした
--case sensitiveな環境ではTitles_*.txt, TITLES_*.TXTなどの曲目ファイルを読み込まない不具合を修正
--起動後、読み込んだ曲目ファイルを開いたままになっている不具合を修正

<ins>**version 1.4.3</ins>
<ins>-修正・改善</ins>
<ins>--libasoundのsoファイルのパスを設定ファイル(Smdn.Media.Alsa.dll.config)で変更出来るように改善、デフォルトをlibasound.so.2に変更</ins>
<ins>--波形表示部分を隠そうとした場合にエラーとならないように修正</ins>
<ins>--波形上のアンカーをポイントしたときのカーソルを水平矢印にするように変更</ins>
<ins />
**version 1.4.2
-修正・改善
--LAME等のエンコーダを使用する際に、ダメ文字を含む以下の曲目のエンコードに失敗する不具合を修正(1.3から1.4でのエンバグ)
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1262085661</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/" rel="alternate" />
    <published>2009-12-29T20:21:01+09:00</published>
    <title type="text">「Works/Tools/東方シリーズ音楽抜き出し機」 version 1.4.3, version 1.5.0 beta1をリリース</title>
    <updated>2009-12-29T20:21:01+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/">Works/Tools/東方シリーズ音楽抜き出し機</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/">Works/Tools/東方シリーズ音楽抜き出し機</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
#googleadunit
-パッケージ
--安定版 ${smdncms:distfilelink,ThbgmExtractor-1.4.2.lzh,version 1.4.2 パッケージ}
<del>--プレビュー版 ${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.lzh,version 1.5.0pre パッケージ}</del>
<ins>--プレビュー版 ${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.lzh,version 1.5.0pre パッケージ}</ins>
-ソース
<ins>--開発版は[[anonsvn]]からチェックアウトできます</ins>
--${smdncms:distfilelink,ThbgmExtractor-1.4.2.tar.bz2,version 1.4.2 ソース}
<del>--${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.tar.bz2,version 1.5.0pre ソース}</del>
<ins>--${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev320.tar.bz2,version 1.5.0pre ソース}</ins>
--ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります

各バージョンのパッケージに含まれる曲目ファイルは下記のとおりです。　表に無い作品、または×が付いている作品の音楽を抜き出す場合は別途曲目ファイルを用意してください。
**過去のバージョン
-パッケージ
--version 1.5系
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.lzh,version 1.5.0pre パッケージ}</ins>
---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev253.lzh,version 1.5.0pre パッケージ}
--version 1.4系
---${smdncms:distfilelink,ThbgmExtractor-1.4.1.lzh,version 1.4.1}
---${smdncms:distfilelink,thbgmextractor_exe.lzh,version 1.0}
-ソース
--version 1.5系(ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります)
<ins>---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev290.tar.bz2,version 1.5.0pre}</ins>
---${smdncms:distfilelink,ThbgmExtractor-1.5.0pre-rev253.tar.bz2,version 1.5.0pre}
--version 1.4系(ソース中に含まれる各ライブラリはMIT X11ライセンスでのリリースとなります)
---${smdncms:distfilelink,ThbgmExtractor-1.4.1.tar.bz2,version 1.4.1}
英語の翻訳を修正してくれる方、英語以外の言語(主に繁体字中国語・ロシア語あたり)に翻訳してくれる方を募集しています。

*変更履歴
<ins>**version 1.5.0pre</ins>
<ins>-機能追加</ins>
<ins>--出力ファイルサイズをリストに表示するようにした</ins>
<ins>--全トラックの合計値・設定値をリストに表示するようにした</ins>
<ins>--選択したトラックを抜き出し・エンコードするメニュー項目を追加した</ins>
<ins>-修正・改善</ins>
<ins>--波形の描画速度を改善</ins>
<ins>--抜き出し中に別の抜き出しを開始できないように修正</ins>
<ins>--保存しても保存されていないと判断される不具合を修正</ins>
<ins />
**version 1.5.0pre
-機能追加
--以下の形式のプレイリストを出力できるようにした
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1261332657</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/ThbgmExtractor/" rel="alternate" />
    <published>2009-12-21T03:10:57+09:00</published>
    <title type="text">「Works/Tools/東方シリーズ音楽抜き出し機」 version 1.5.0pre (rev320)をリリース</title>
    <updated>2009-12-21T03:10:57+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_2.6/">Programming/Mono/Mono 2.6のインストール</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_monodevelop_2.2/">Programming/Mono/MonoDevelop 2.2のインストール</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_2.6/">Programming/Mono/Mono 2.6のインストール</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,Mono 2.6のインストール}</ins>
<ins>${smdncms:keywords,Mono,2.6,ビルド,インストール,Ubuntu 9.10,Fedora 12}</ins>
<ins>[[Mono 2.6:http://www.mono-project.com/Main_Page]]をソースからビルドしてインストールする手順。　検証に使った環境はUbuntu 9.10 DesktopおよびFedora 12 Desktop。</ins>
<ins />
<ins>-リンク</ins>
<ins>--[[Release Notes Mono 2.6 - Mono:http://www.mono-project.com/Release_Notes_Mono_2.6]]</ins>
<ins>--[[Download - Mono:http://www.go-mono.com/mono-downloads/download.html]]</ins>
<ins>-関連するページ</ins>
<ins>--[[programming/mono/install_trunk]]</ins>
<ins>--[[programming/mono]]</ins>
<ins />
<ins>ここで紹介する手順は[[MonoDevelop 2.2&gt;programming/mono/install_monodevelop_2.2]]を動作させるために必要なアセンブリ一式をインストールするためのもの。　ディストリビューションが提供しているバージョンのMonoと共存できるようにするため、/opt/monoにインストールする。</ins>
<ins />
<ins>1つの環境に複数のMonoをインストールする方法については[[Parallel Mono Environments - Mono:http://www.mono-project.com/Parallel_Mono_Environments]]で詳しく解説されている。</ins>
<ins />
<ins>ビルドにはgcc、libtool、autotools、gettext、pkg-config等が必要になるので、あらかじめインストールしておく必要がある。</ins>
<ins />
<ins>#googleadunit</ins>
<ins />
<ins>*libgdiplus</ins>
<ins>**依存するパッケージのインストール</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libcairo2-dev libexif-dev libfreetype6-dev libfontconfig1-dev libglib2.0-dev libjpeg62-dev libpng12-dev \</ins>
<ins>libtiff4-dev libungif4-dev libx11-dev libxrender-dev</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>cairo-devel libexif-devel freetype-devel fontconfig-devel glib-devel libjpeg-devel libpng-devel \</ins>
<ins>libtiff-devel giflib-devel libX11-devel libXrender-devel</ins>
<ins>}}</ins>
<ins />
<ins>**ソースのダウンロードとconfigure</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/libgdiplus/libgdiplus-2.6.tar.bz2</ins>
<ins>tar -xvf libgdiplus-2.6.tar.bz2</ins>
<ins>cd libgdiplus-2.6/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono-2.6</ins>
<ins>   * Cairo = 1.8.8</ins>
<ins>   * Text = cairo</ins>
<ins>   * EXIF tags = yes</ins>
<ins>   * Codecs supported:</ins>
<ins />
<ins>      - TIFF: yes</ins>
<ins>      - JPEG: yes</ins>
<ins>      - GIF: yes</ins>
<ins>      - PNG: yes</ins>
<ins>      NOTE: if any of the above say 'no' you may install the</ins>
<ins>            corresponding development packages for them, rerun</ins>
<ins>            autogen.sh to include them in the build.</ins>
<ins />
<ins>---</ins>
<ins>}}</ins>
<ins />
<ins>**ビルド、インストール</ins>
<ins>configureした結果に問題が無ければmake、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>正しくインストールできたか確認する。</ins>
<ins>#code(sh){{</ins>
<ins>ls -l /opt/mono/lib/libgdiplus*</ins>
<ins>}}</ins>
<ins />
<ins>*Mono本体(コンパイラ、クラスライブラリ)</ins>
<ins>**依存するパッケージのインストール</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>bison</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>bison</ins>
<ins>}}</ins>
<ins />
<ins>**ソースのダウンロードとconfigure</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.6.tar.bz2</ins>
<ins>tar -xvf mono-2.6.tar.bz2</ins>
<ins>cd mono-2.6/</ins>
<ins>./configure --prefix=/opt/mono --with-libgdiplus=installed --with-ikvm-native=no --with-profile2=yes --with-profile4=yes --with-moonlight=no --with-monotouch=no --with-mcs-docs=no</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>        mcs source:    $(top_srcdir)/mcs</ins>
<ins>        olive source:  </ins>
<ins />
<ins>	GC:	       included</ins>
<ins>	GLIB:	       system</ins>
<ins>	TLS:           __thread</ins>
<ins>	SIGALTSTACK:   yes</ins>
<ins>	Engine:        Building and using the JIT</ins>
<ins>	2.0 Profile:   yes</ins>
<ins>	Moon Profile:  no</ins>
<ins>	4.0 Alpha:     yes</ins>
<ins>	MonoTouch:     no</ins>
<ins>	JNI support:   </ins>
<ins>	libgdiplus:    assumed to be installed</ins>
<ins>	zlib:          system zlib</ins>
<ins>	oprofile:      no</ins>
<ins>	BigArrays:     no</ins>
<ins>	DTrace:        no</ins>
<ins>	Parallel Mark: yes</ins>
<ins>	LLVM Back End: no</ins>
<ins>}}</ins>
<ins />
<ins>-コンパイルオプションに関するドキュメント</ins>
<ins>--[[Advanced Mono Compile Options - Mono:http://www.mono-project.com/Advanced_Mono_Compile_Options]]</ins>
<ins>--[[Unsupported Advanced Mono Compile Options - Mono:http://www.mono-project.com/Unsupported_Advanced_Mono_Compile_Options]]</ins>
<ins />
<ins>**ビルド、インストール</ins>
<ins>コンパイルする環境にMonoおよびmcsがない場合は、makeする前に最新のMonoLite([[Mono Daily Packages:http://mono.ximian.com/daily/]])を取得しておく。</ins>
<ins>#code(sh){{</ins>
<ins>make get-monolite-latest</ins>
<ins>}}</ins>
<ins />
<ins>準備が整ったら、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>-コンパイルに関するドキュメント</ins>
<ins>--[[Compiling Mono From Tarball - Mono:http://www.mono-project.com/Compiling_Mono_From_Tarball]]</ins>
<ins />
<ins>**動作確認</ins>
<ins>***新しくMonoをインストールした場合</ins>
<ins>mono -Vでmonoが動作することを確認する。</ins>
<ins>#prompt{{</ins>
<ins>$ mono -V</ins>
<ins>Mono JIT compiler version 2.6</ins>
<ins>Copyright 2002-2008 Novell, Inc and Contributors. www.mono-project.com</ins>
<ins>	TLS:           __thread</ins>
<ins>	GC:            Included Boehm</ins>
<ins>	SIGSEGV:       altstack</ins>
<ins>	Notifications: epoll</ins>
<ins>	Architecture:  x86</ins>
<ins>	Disabled:      none</ins>
<ins>}}</ins>
<ins />
<ins>***既に別のバージョンのMonoが存在する環境にインストールした場合</ins>
<ins>新しく/opt/monoにインストールしたMonoを参照できるように、環境変数を設定するスクリプトを用意しておく。　参考: [[Parallel Mono Environments - Mono:http://www.mono-project.com/Parallel_Mono_Environments]]</ins>
<ins>#code(sh,mono-2.6-env){{</ins>
<ins>#!/bin/bash</ins>
<ins>MONO_PREFIX=/opt/mono</ins>
<ins>export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH</ins>
<ins>export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH</ins>
<ins>export C_INCLUDE_PATH=$MONO_PREFIX/include</ins>
<ins>export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal</ins>
<ins>export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig</ins>
<ins>PATH=$MONO_PREFIX/bin:$PATH</ins>
<ins>}}</ins>
<ins />
<ins>まずmono -Vで先にインストールされていたmonoが動作することを確認する。</ins>
<ins>#prompt(Ubuntuでの実行例){{</ins>
<ins>$ which mono</ins>
<ins>/usr/bin/mono</ins>
<ins>$ mono -V</ins>
<ins>Mono JIT compiler version 2.4.2.3</ins>
<ins>Copyright 2002-2008 Novell, Inc and Contributors. www.mono-project.com</ins>
<ins>	TLS:           __thread</ins>
<ins>	GC:            Included Boehm</ins>
<ins>	SIGSEGV:       altstack</ins>
<ins>	Notifications: epoll</ins>
<ins>	Architecture:  x86</ins>
<ins>	Disabled:      none</ins>
<ins>}}</ins>
<ins />
<ins>#prompt(Fedoraでの実行例){{</ins>
<ins>$ which mono</ins>
<ins>/usr/bin/mono</ins>
<ins>$ mono -V</ins>
<ins>Mono JIT compiler version 2.4.2.3</ins>
<ins>Copyright 2002-2008 Novell, Inc and Contributors. www.mono-project.com</ins>
<ins>	TLS:           __thread</ins>
<ins>	GC:            Included Boehm</ins>
<ins>	SIGSEGV:       altstack</ins>
<ins>	Notifications: epoll</ins>
<ins>	Architecture:  x86</ins>
<ins>	Disabled:      none</ins>
<ins>}}</ins>
<ins />
<ins>続いて、先ほど用意したスクリプトを読み込んだあとでmono -Vを実行し、新しくインストールしたmonoが動作することを確認する。</ins>
<ins>#prompt{{</ins>
<ins>$ source mono-2.6-env</ins>
<ins>$ which mono</ins>
<ins>/opt/mono/bin/mono</ins>
<ins>$ mono -V</ins>
<ins>Mono JIT compiler version 2.6</ins>
<ins>Copyright 2002-2008 Novell, Inc and Contributors. www.mono-project.com</ins>
<ins>	TLS:           __thread</ins>
<ins>	GC:            Included Boehm</ins>
<ins>	SIGSEGV:       altstack</ins>
<ins>	Notifications: epoll</ins>
<ins>	Architecture:  x86</ins>
<ins>	Disabled:      none</ins>
<ins>}}</ins>
<ins />
<ins>***GAC</ins>
<ins>gacutil -lでアセンブリがGACに登録されていることを確認する。　GACのパスを明示的に指定する場合は-rootオプションで指定する(例えばgacutil -l -root /opt/mono/lib/など)。</ins>
<ins>#prompt{{</ins>
<ins>$ gacutil -l </ins>
<ins>The following assemblies are installed into the GAC:</ins>
<ins>  :</ins>
<ins>System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>  :</ins>
<ins>}}</ins>
<ins />
<ins>***gmcs</ins>
<ins>gmcs --aboutでgmcsのバージョンを確認する。</ins>
<ins>#prompt{{</ins>
<ins>$ gmcs --about</ins>
<ins>The Mono C# compiler is Copyright 2001-2008, Novell, Inc.</ins>
<ins />
<ins>The compiler source code is released under the terms of the </ins>
<ins>MIT X11 or GNU GPL licenses</ins>
<ins />
<ins>For more information on Mono, visit the project Web site</ins>
<ins>   http://www.mono-project.com</ins>
<ins />
<ins>The compiler was written by Miguel de Icaza, Ravi Pratap, Martin Baulig, Marek Safar, Raja R Harinath, Atushi Enomoto</ins>
<ins>}}</ins>
<ins />
<ins>***dmcs</ins>
<ins>C# 4.0よりサポートされる機能を含むコードがコンパイル出来るかどうか試す。</ins>
<ins>#code(cs,test.cs){{</ins>
<ins>using System;</ins>
<ins />
<ins>class Test {</ins>
<ins>  static void Print(int x = 1, int y = 2, int z = 3)</ins>
<ins>  {</ins>
<ins>    Console.WriteLine("x: {0}", x);</ins>
<ins>    Console.WriteLine("y: {0}", y);</ins>
<ins>    Console.WriteLine("z: {0}", z);</ins>
<ins>    Console.WriteLine();</ins>
<ins>  }</ins>
<ins />
<ins>  public static void Main()</ins>
<ins>  {</ins>
<ins>    Print(x: 17, z: 23);</ins>
<ins>    Print();</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>#prompt(実行結果){{</ins>
<ins>$ dmcs test.cs &amp;&amp; mono test.exe</ins>
<ins>x: 17</ins>
<ins>y: 2</ins>
<ins>z: 23</ins>
<ins />
<ins>x: 1</ins>
<ins>y: 2</ins>
<ins>z: 3</ins>
<ins />
<ins>}}</ins>
<ins />
<ins>***csharp(C#シェル)</ins>
<ins>csharpシェルが動作するか確認する。</ins>
<ins>#prompt{{</ins>
<ins>$ csharp </ins>
<ins>Mono C# Shell, type "help;" for help</ins>
<ins />
<ins>Enter statements below.</ins>
<ins>csharp&gt; Console.WriteLine(Environment.Version);</ins>
<ins>2.0.50727.1433</ins>
<ins>csharp&gt; Console.WriteLine(Environment.OSVersion);</ins>
<ins>Unix 2.6.31.6</ins>
<ins>csharp&gt; quit;</ins>
<ins>null</ins>
<ins>}}</ins>
<ins />
<ins>*その他のアセンブリ・ライブラリ</ins>
<ins>**gluezilla</ins>
<ins>依存するパッケージのインストール。</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libgtk2.0-dev libnss3-dev libnspr4-dev libxul-dev</ins>
<ins># libxul-devはxulrunner-devでも可</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>gtk2-devel nss-devel nspr-devel xulrunner-devel-unstable</ins>
<ins>}}</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/gluezilla/gluezilla-2.6.tar.bz2</ins>
<ins>tar -xvf gluezilla-2.6.tar.bz2</ins>
<ins>cd gluezilla-2.6/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>checking Gtk+ 2.0... found</ins>
<ins>checking Mono... found</ins>
<ins>checking Mozilla NSPR... nspr</ins>
<ins>checking Mozilla NSS... nss</ins>
<ins>checking Mozilla XPCOM &gt; 1.8... libxul-embedding-unstable</ins>
<ins>  :</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>***gluezillaの動作テスト</ins>
<ins>gluezillaが動作するかテストしたい場合は、tests/browser/にあるテスト用のアプリケーションをビルド・起動して動作を確認できる。</ins>
<ins />
<ins>まず、ldconfigでライブラリのリンク・キャッシュを再構成する。</ins>
<ins>#code(sh){{</ins>
<ins>sudo ldconfig</ins>
<ins />
<ins>}}</ins>
<ins />
<ins>次に、テスト用のMakefileで指定されているアセンブリ参照の誤りを修正する。</ins>
<ins>#prompt{{</ins>
<ins>$ cd tests/browser/</ins>
<ins>$ cp Makefile Makefile.org</ins>
<ins>$ sed 's/Mono.Mozilla.dll/Mono.WebBrowser.dll/g' Makefile.org &gt; Makefile</ins>
<ins>$ diff Makefile.org Makefile</ins>
<ins>348c348</ins>
<ins>&lt; 	gmcs -debug -pkg:dotnet -r:Mono.Mozilla.dll -target:exe -out:$@ $(test_build_sources)</ins>
<ins>---</ins>
<ins>&gt; 	gmcs -debug -pkg:dotnet -r:Mono.WebBrowser.dll -target:exe -out:$@ $(test_build_sources)</ins>
<ins>}}</ins>
<ins />
<ins>修正後、make testでテスト用のアプリケーションが起動する。　起動するとウィンドウが開くので、アドレスバーに適当なURLを入れてページが表示されるか確認する。</ins>
<ins />
<ins>**gtk-sharp-2.0</ins>
<ins>依存するパッケージのインストール。</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libglade2-dev libgtk2.0-dev libpango1.0-dev</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>libglade2-devel gtk2-devel pango-devel</ins>
<ins>}}</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/gtk-sharp212/gtk-sharp-2.12.9.tar.bz2</ins>
<ins>tar -xvf gtk-sharp-2.12.9.tar.bz2</ins>
<ins>cd gtk-sharp-2.12.9/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono</ins>
<ins>   * C# compiler: /opt/mono/bin/mcs  -define:GTK_SHARP_2_6 -define:GTK_SHARP_2_8 -define:GTK_SHARP_2_10 -define:GTK_SHARP_2_12 </ins>
<ins />
<ins>   Optional assemblies included in the build:</ins>
<ins />
<ins>      * glade-sharp.dll: yes</ins>
<ins>      * gtk-dotnet.dll: yes </ins>
<ins>      * Mono.Cairo.dll: using system assembly</ins>
<ins />
<ins>      NOTE: if any of the above say 'no' you may install the</ins>
<ins>            corresponding development packages for them, rerun</ins>
<ins>            autogen.sh to include them in the build.</ins>
<ins />
<ins>   * Documentation build enabled: yes </ins>
<ins>---</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**Mono.Addins</ins>
<ins>-依存するアセンブリ</ins>
<ins>--gtk-sharp-2.0</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/mono-addins/mono-addins-0.4.zip</ins>
<ins>unzip mono-addins-0.4.zip </ins>
<ins>cd mono-addins-0.4/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono</ins>
<ins>   * gui support: yes</ins>
<ins>   * unit tests: no</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**gnome-sharp-2.0</ins>
<ins>-依存するアセンブリ</ins>
<ins>--gtk-sharp-2.0</ins>
<ins />
<ins>依存するパッケージのインストール。</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libgnome2-dev libgnomecanvas2-dev libgnomeui-dev</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>libgnome-devel libgnomecanvas-devel libgnomeui-devel</ins>
<ins>}}</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/gnome-sharp2/gnome-sharp-2.24.1.tar.bz2</ins>
<ins>tar -xvf gnome-sharp-2.24.1.tar.bz2</ins>
<ins>cd gnome-sharp-2.24.1/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono</ins>
<ins>   * C# compiler: /opt/mono/bin/mcs  -define:GTK_SHARP_2_6 -define:GTK_SHARP_2_8 -define:GNOME_SHARP_2_16 -define:GNOME_SHARP_2_20 -define:GNOME_SHARP_2_24</ins>
<ins />
<ins>   Optional assemblies included in the build:</ins>
<ins />
<ins>      * art-sharp.dll: yes</ins>
<ins>      * gnomevfs-sharp.dll: yes</ins>
<ins>      * gnome-sharp.dll: yes</ins>
<ins />
<ins>      NOTE: if any of the above say 'no' you may install the</ins>
<ins>            corresponding development packages for them, rerun</ins>
<ins>            autogen.sh to include them in the build.</ins>
<ins />
<ins>            gnome-sharp.dll requires libgnomecanvas, libgnome,</ins>
<ins>            and libgnomeui.</ins>
<ins>---</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**gecko-sharp</ins>
<ins>-依存するアセンブリ</ins>
<ins>--gtk-sharp-2.0</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/gecko-sharp2/gecko-sharp-2.0-0.13.tar.bz2</ins>
<ins>tar -xvf gecko-sharp-2.0-0.13.tar.bz2 </ins>
<ins>cd gecko-sharp-2.0-0.13/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix: /opt/mono</ins>
<ins>   * compiler: /opt/mono/bin/mcs</ins>
<ins>   * Documentation: yes</ins>
<ins />
<ins>---</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**gnome-desktop-sharp</ins>
<ins>-依存するアセンブリ</ins>
<ins>--gtk-sharp-2.0</ins>
<ins>--gnome-sharp-2.0</ins>
<ins />
<ins>依存するパッケージのインストール。</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libgtksourceview2.0-dev libgnomeprint2.2-dev libgnomeprintui2.2-dev libgtkhtml3.14-dev libnautilus-burn-dev \</ins>
<ins>libpanel-applet2-dev librsvg2-dev libvte-dev libwnck-dev</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>gtksourceview2-devel libgnomeprint22-devel libgnomeprintui22-devel gnome-panel-devel gtkhtml3-devel \</ins>
<ins>librsvg2-devel vte-devel libwnck-devel</ins>
<ins>}}</ins>
<ins />
<ins>Fedora 12ではnautilus-cd-burnerが見つからなかったのでnautilusburn-sharp.dllはインストールせずに進める。</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/gnome-desktop-sharp2/gnome-desktop-sharp-2.24.0.tar.bz2</ins>
<ins>tar -xvf gnome-desktop-sharp-2.24.0.tar.bz2</ins>
<ins>cd gnome-desktop-sharp-2.24.0/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono</ins>
<ins>   * C# compiler: /opt/mono/bin/mcs  </ins>
<ins />
<ins>   Optional assemblies included in the build:</ins>
<ins />
<ins>      * gnome-panel-sharp.dll: yes</ins>
<ins>      * gnome-print-sharp.dll: yes</ins>
<ins>      * gtkhtml-sharp.dll: yes</ins>
<ins>      * gtksourceview2-sharp.dll: yes</ins>
<ins>      * nautilusburn-sharp.dll: no</ins>
<ins>      * rsvg-sharp.dll: yes</ins>
<ins>      * vte-sharp.dll: yes</ins>
<ins>      * wnck-sharp.dll: yes</ins>
<ins />
<ins>      NOTE: if any of the above say 'no' you may install the</ins>
<ins>            corresponding development packages for them, rerun</ins>
<ins>            autogen.sh to include them in the build.</ins>
<ins />
<ins>---</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**mono-tools</ins>
<ins>-依存するアセンブリ</ins>
<ins>--gtk-sharp-2.0</ins>
<ins>--gnome-sharp-2.0</ins>
<ins>-オプションで参照されるアセンブリ</ins>
<ins>--gecko-sharp</ins>
<ins>--gtkhtml-sharp</ins>
<ins>--webkit-sharp</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/mono-tools/mono-tools-2.6.tar.bz2</ins>
<ins>tar -xvf mono-tools-2.6.tar.bz2 </ins>
<ins>cd mono-tools-2.6/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果例。</ins>
<ins>#prompt{{</ins>
<ins>---</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /opt/mono</ins>
<ins>   * Using Gecko = yes</ins>
<ins>   * Using GtkHtml = yes</ins>
<ins>   * Using Mono.WebBrowser = yes</ins>
<ins>   * Using WebKit = no</ins>
<ins />
<ins>      NOTE: if any of the above say 'no' you may install the</ins>
<ins>            corresponding development packages for them, rerun</ins>
<ins>            autogen.sh to include them in the build.</ins>
<ins>}}</ins>
<ins />
<ins>問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>**mono-debugger</ins>
<ins>依存するパッケージのインストール。</ins>
<ins>#code(sh,Ubuntuの場合){{</ins>
<ins>sudo apt-get install \</ins>
<ins>libncurses5-dev</ins>
<ins>}}</ins>
<ins>#code(sh,Fedoraの場合){{</ins>
<ins>yum install \</ins>
<ins>ncurses-devel</ins>
<ins>}}</ins>
<ins />
<ins>ソースのダウンロードとconfigure。</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/mono-debugger/mono-debugger-2.6.tar.bz2</ins>
<ins>tar -xvf mono-debugger-2.6.tar.bz2</ins>
<ins>cd mono-debugger-2.6/</ins>
<ins>./configure --prefix=/opt/mono</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果に問題が無ければ、make、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
<ins>}}</ins>
<ins />
<ins>*インストールされるアセンブリ</ins>
<ins>ここまでの手順でインストールされるアセンブリの一覧は以下の通り。</ins>
<ins>#prompt{{</ins>
<ins>$ gacutil -l -root /opt/mono/lib/</ins>
<ins>The following assemblies are installed into the GAC:</ins>
<ins>Accessibility, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Accessibility, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>ByteFX.Data, Version=0.7.6.1, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>ByteFX.Data, Version=0.7.6.2, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Commons.Xml.Relaxng, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Commons.Xml.Relaxng, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Commons.Xml.Relaxng, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>CustomMarshalers, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>CustomMarshalers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>FirebirdSql.Data.Firebird, Version=1.7.1.0, Culture=neutral, PublicKeyToken=0706f5520aae4ff4</ins>
<ins>I18N, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.CJK, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.CJK, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.CJK, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.MidEast, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.MidEast, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.MidEast, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Other, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Other, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Other, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Rare, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Rare, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.Rare, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.West, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.West, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>I18N.West, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>IBM.Data.DB2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7c307b91aa13d208</ins>
<ins>ICSharpCode.SharpZipLib, Version=0.6.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73</ins>
<ins>ICSharpCode.SharpZipLib, Version=0.84.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73</ins>
<ins>ICSharpCode.SharpZipLib, Version=2.6.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73</ins>
<ins>ICSharpCode.SharpZipLib, Version=2.84.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73</ins>
<ins>Microsoft.Build.Engine, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Engine, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Utilities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.JScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.JScript, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.JScript, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.VisualC, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.VisualC, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.VisualC, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Vsa, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Vsa, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Microsoft.Vsa, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>Mono.Addins, Version=0.4.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Addins.CecilReflector, Version=0.4.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Addins.Gui, Version=0.4.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Addins.Setup, Version=0.4.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.C5, Version=1.1.0.0, Culture=neutral, PublicKeyToken=ba07f434b1c35cbd</ins>
<ins>Mono.CSharp, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Cairo, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Cairo, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Cecil, Version=0.6.9.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Cecil.Mdb, Version=0.2.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.CompilerServices.SymbolWriter, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.CompilerServices.SymbolWriter, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.CompilerServices.SymbolWriter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.Sqlite, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SqliteClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SqliteClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SqliteClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SybaseClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SybaseClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.SybaseClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.Tds, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.Tds, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.Tds, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.TdsClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.TdsClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Data.TdsClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Debugger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Debugger.Frontend, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Debugger.Soft, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Debugger.SymbolWriter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.GetOptions, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.GetOptions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.GetOptions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Http, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging.RabbitMQ, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Messaging.RabbitMQ, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Posix, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security.Win32, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security.Win32, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Security.Win32, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Simd, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Simd, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Tasklets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Tasklets, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Mono.WebBrowser, Version=0.5.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Novell.Directory.Ldap, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Novell.Directory.Ldap, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Novell.Directory.Ldap, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>Npgsql, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7</ins>
<ins>Npgsql, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7</ins>
<ins>Npgsql, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7</ins>
<ins>OpenSystem.C, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>OpenSystem.C, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>OpenSystem.C, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>PEAPI, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>PEAPI, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>PEAPI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>RabbitMQ.Client, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>RabbitMQ.Client, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>RabbitMQ.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Data.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.DirectoryServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Dynamic, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.EnterpriseServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.IdentityModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.IdentityModel.Selectors, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.IdentityModel.Selectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Management, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Messaging, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Runtime.Remoting, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Runtime.Serialization.Formatters.Soap, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Runtime.Serialization.Formatters.Soap, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Runtime.Serialization.Formatters.Soap, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Security, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.ServiceProcess, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.DynamicData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>System.Web.Services, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Xml, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ins>
<ins>WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ins>
<ins>art-sharp, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>cscompmgd, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>cscompmgd, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>cscompmgd, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</ins>
<ins>gconf-sharp, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gconf-sharp-peditors, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gecko-sharp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=ccf7d78a55e9f021</ins>
<ins>glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gnome-panel-sharp, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gnome-print-sharp, Version=2.18.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gnome-sharp, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gnome-vfs-sharp, Version=2.24.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gnomedesktop-sharp, Version=2.20.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gtk-dotnet, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gtkhtml-sharp, Version=3.16.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>gtksourceview2-sharp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>monodoc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>nautilusburn-sharp, Version=2.20.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>nunit-console-runner, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.core, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.core.extensions, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.core.interfaces, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.framework.extensions, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.mocks, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>nunit.util, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77</ins>
<ins>pango-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.0.2.Mono.Addins, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.2.Mono.Addins.CecilReflector, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.2.Mono.Addins.Gui, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.2.Mono.Addins.Setup, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.3.Mono.Addins, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.3.Mono.Addins.CecilReflector, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.3.Mono.Addins.Gui, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.0.3.Mono.Addins.Setup, Version=0.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756</ins>
<ins>policy.2.10.atk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.gdk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.glade-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.glib-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.gtk-dotnet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.gtk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.10.pango-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.16.art-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.16.gconf-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.16.gconf-sharp-peditors, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.16.gnome-vfs-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.20.art-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.20.gconf-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.20.gconf-sharp-peditors, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.20.gnome-vfs-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.art-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.atk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gconf-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gconf-sharp-peditors, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gdk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.glade-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.glib-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gnome-vfs-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gtk-dotnet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.gtk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.4.pango-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.art-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.atk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gconf-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gconf-sharp-peditors, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gdk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.glade-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.glib-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gnome-vfs-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gtk-dotnet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.gtk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.6.pango-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.art-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.atk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gconf-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gconf-sharp-peditors, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gdk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.glade-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.glib-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gnome-vfs-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gtk-dotnet, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.gtk-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>policy.2.8.pango-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>rsvg2-sharp, Version=2.18.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>vte-sharp, Version=0.16.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>wnck-sharp, Version=2.20.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f</ins>
<ins>Number of items = 326</ins>
<ins>}}</ins>
<ins />
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_monodevelop_2.2/">Programming/Mono/MonoDevelop 2.2のインストール</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,MonoDevelop 2.2のインストール}
<del>${smdncms:keywords,MonoDevelop,2.2,ビルド,インストール}</del>
<del>Ubuntu 9.10に[[MonoDevelop 2.2:http://monodevelop.com/]]をソースからビルドしてインストールする手順。</del>
<ins>${smdncms:keywords,MonoDevelop,2.2,ビルド,インストール,Ubuntu 9.10,Fedora 12}</ins>
<ins>[[MonoDevelop 2.2:http://monodevelop.com/]]をソースからビルドしてインストールする手順。　検証に使った環境はUbuntu 9.10 DesktopおよびFedora 12 Desktop。</ins>

-リンク
--[[MonoDevelop 2.2 Released - MonoDevelop:http://monodevelop.com/Download/MonoDevelop_2.2_Released]]

*MonoDevelop本体
**MonoDevelopが必要とするアセンブリのインストール
<del>MonoDevelopが必要とするアセンブリをあらかじめインストールしておく。　必要になるものは以下のアセンブリ。</del>
<del>-MonoDevelopが必要とするアセンブリ</del>
<ins>MonoDevelopが必要とするアセンブリをあらかじめインストールしておく。　必要になるものは以下のアセンブリ。　各アセンブリのインストール方法については[[programming/mono/install_2.6]]を参照のこと。</ins>
<ins>-MonoDevelopが必要とするアセンブリ・パッケージ</ins>
--Mono Addins
--gtk-sharp
--monodoc
--gecko-sharp
--gtksourceview-sharp
<ins>--mono-debugger</ins>

**ソースのダウンロードとconfigure
#code(sh){{

インストールするには、make installする。
#code(sh){{
<del>sudo make install</del>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
}}

インストールが完了したら、monodevelop -Vでmonodevelopの出力を確認する。

*デバッガ
**Mono Debugger support
<del>-依存するパッケージ類</del>
<del>--mono-debugger</del>
<del />
***ソースのダウンロードとconfigure
#code(sh){{
wget http://ftp.novell.com/pub/mono/sources/monodevelop-debugger-mdb/monodevelop-debugger-mdb-2.2.tar.bz2

インストールするには、make installする。
#code(sh){{
<del>sudo make install</del>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
}}

**GDB Debugger support

インストールするには、make installする。
#code(sh){{
<del>sudo make install</del>
<ins>sudo make install # Ubuntuの場合</ins>
<ins>su -c 'make install' # Fedoraの場合</ins>
}}

**デバッガの動作確認
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1261145461</id>
    <link href="http://smdn.invisiblefulmoon.net/programming/mono/install_2.6/" rel="alternate" />
    <published>2009-12-18T23:11:01+09:00</published>
    <title type="text">「Programming/Mono/Mono 2.6のインストール」を追加 「Programming/Mono/MonoDevelop 2.2のインストール」を更新、Fedora 12での検証結果を追記</title>
    <updated>2009-12-18T23:11:01+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_monodevelop_2.2/">Programming/Mono/MonoDevelop 2.2のインストール</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/programming/mono/install_monodevelop_2.2/">Programming/Mono/MonoDevelop 2.2のインストール</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,MonoDevelop 2.2のインストール}</ins>
<ins>${smdncms:keywords,MonoDevelop,2.2,ビルド,インストール}</ins>
<ins>Ubuntu 9.10に[[MonoDevelop 2.2:http://monodevelop.com/]]をソースからビルドしてインストールする手順。</ins>
<ins />
<ins>-リンク</ins>
<ins>--[[MonoDevelop 2.2 Released - MonoDevelop:http://monodevelop.com/Download/MonoDevelop_2.2_Released]]</ins>
<ins>--[[Download - MonoDevelop:http://monodevelop.com/Download]]</ins>
<ins>--[[What's new in MonoDevelop 2.2 - MonoDevelop:http://monodevelop.com/index.php?title=Download/What%27s_new_in_MonoDevelop_2.2]]</ins>
<ins>-関連するページ</ins>
<ins>--[[programming/mono/install_monodevelop_trunk]]</ins>
<ins>--[[programming/mono]]</ins>
<ins />
<ins>*MonoDevelop本体</ins>
<ins>**MonoDevelopが必要とするアセンブリのインストール</ins>
<ins>MonoDevelopが必要とするアセンブリをあらかじめインストールしておく。　必要になるものは以下のアセンブリ。</ins>
<ins>-MonoDevelopが必要とするアセンブリ</ins>
<ins>--Mono Addins</ins>
<ins>--gtk-sharp</ins>
<ins>--monodoc</ins>
<ins>--gecko-sharp</ins>
<ins>--gtksourceview-sharp</ins>
<ins />
<ins>**ソースのダウンロードとconfigure</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/monodevelop/monodevelop-2.2.tar.bz2</ins>
<ins>tar -xvf monodevelop-2.2.tar.bz2 </ins>
<ins>cd monodevelop-2.2/</ins>
<ins>./configure</ins>
<ins>}}</ins>
<ins />
<ins>configureの結果を確認する。</ins>
<ins />
<ins>#prompt{{</ins>
<ins>Configuration summary</ins>
<ins />
<ins>   * Installation prefix = /usr/local</ins>
<ins>   * C# compiler = /usr/local/bin/gmcs</ins>
<ins>   * Mono class library development extensions: yes</ins>
<ins>   * Version control support: yes</ins>
<ins>   *   Providers:</ins>
<ins>   *     Subversion: yes</ins>
<ins>   * C/C++ project support: yes</ins>
<ins>   * Platform bindings: GNOME </ins>
<ins>   * Unit tests: no</ins>
<ins>   * Mozilla location: </ins>
<ins>}}</ins>
<ins />
<ins>**ビルド、インストール</ins>
<ins>問題が無ければ、makeする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>}}</ins>
<ins />
<ins>ビルドしたものをインストールせずすぐに実行したければmake runする。</ins>
<ins>#code(sh){{</ins>
<ins>make run</ins>
<ins>}}</ins>
<ins />
<ins>インストールするには、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>sudo make install</ins>
<ins>}}</ins>
<ins />
<ins>インストールが完了したら、monodevelop -Vでmonodevelopの出力を確認する。</ins>
<ins>#prompt{{</ins>
<ins>MonoDevelop Ide  2.2.0.0 - LGPL</ins>
<ins>The MonoDevelop IDE application.</ins>
<ins />
<ins>http://monodevelop.com</ins>
<ins>Authors: MonoDevelop Team</ins>
<ins>}}</ins>
<ins />
<ins>*デバッガ</ins>
<ins>**Mono Debugger support</ins>
<ins>-依存するパッケージ類</ins>
<ins>--mono-debugger</ins>
<ins />
<ins>***ソースのダウンロードとconfigure</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/monodevelop-debugger-mdb/monodevelop-debugger-mdb-2.2.tar.bz2</ins>
<ins>tar -xvf monodevelop-debugger-mdb-2.2.tar.bz2 </ins>
<ins>cd monodevelop-debugger-mdb-2.2/</ins>
<ins>./configure </ins>
<ins>}}</ins>
<ins />
<ins>configureの結果を確認する。</ins>
<ins />
<ins>#prompt{{</ins>
<ins>monodevelop-debugger-mdb has been configured with </ins>
<ins>        prefix = /usr/local</ins>
<ins>        config = DEBUG</ins>
<ins>}}</ins>
<ins />
<ins>***ビルド、インストール</ins>
<ins>問題が無ければ、makeする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>}}</ins>
<ins />
<ins>インストールするには、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>sudo make install</ins>
<ins>}}</ins>
<ins />
<ins>**GDB Debugger support</ins>
<ins>***ソースのダウンロードとconfigure</ins>
<ins>#code(sh){{</ins>
<ins>wget http://ftp.novell.com/pub/mono/sources/monodevelop-debugger-gdb/monodevelop-debugger-gdb-2.2.tar.bz2</ins>
<ins>tar -xvf monodevelop-debugger-gdb-2.2.tar.bz2 </ins>
<ins>cd monodevelop-debugger-mdb-2.2/</ins>
<ins>./configure </ins>
<ins>}}</ins>
<ins />
<ins>configureの結果を確認する。</ins>
<ins />
<ins>#prompt{{</ins>
<ins>monodevelop-debugger-gdb has been configured with </ins>
<ins>        prefix = /usr/local</ins>
<ins>        config = DEBUG</ins>
<ins>}}</ins>
<ins />
<ins>***ビルド、インストール</ins>
<ins>問題が無ければ、makeする。</ins>
<ins>#code(sh){{</ins>
<ins>make</ins>
<ins>}}</ins>
<ins />
<ins>インストールするには、make installする。</ins>
<ins>#code(sh){{</ins>
<ins>sudo make install</ins>
<ins>}}</ins>
<ins />
<ins>**デバッガの動作確認</ins>
<ins>[ツール]メニューの[アドインマネージャ]を開き、Debuggingの下に「MDB support for Mono.Debugging」がリストされていることを確認する。</ins>
<ins>#ref(addin-manager.png,アドインマネージャ)</ins>
<ins>次に、プロジェクトを開き適当な場所にブレークポイントを設定したあと、[実行]メニューの[デバッグ]を使って実行する。　正しく動作すれば、このようにブレークポイントで停止し、カーソルをポイントすれば変数の内容が表示される。</ins>
<ins>#ref(debugger.png,変数の内容を表示しているところ)</ins>
<ins />
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1260967672</id>
    <link href="http://smdn.invisiblefulmoon.net/programming/mono/install_monodevelop_2.2/" rel="alternate" />
    <published>2009-12-16T21:47:52+09:00</published>
    <title type="text">「Programming/Mono/MonoDevelop 2.2のインストール」を追加</title>
    <updated>2009-12-16T21:47:52+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a>
          </li>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Ini/">Works/Libraries/Smdn.Formats.Ini</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/">Works/Tools/Junk/TundereBird</a></h3>
        <p>
          <pre>​<code xml:space="preserve">

*ダウンロード
#googleadunit
<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
-0.2x
<ins>--${smdncms:distfilelink,TundereBird-0.21.tar.bz2}</ins>
<ins>---下記ライブラリのソースを同梱しています</ins>
<ins>---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.21</ins>
<ins>---[[works/libs/Smdn.Formats.Mime]] 0.15</ins>
<ins>---[[works/libs/Smdn.Formats.Ini]] 0.15</ins>
--${smdncms:distfilelink,TundereBird-0.20.tar.bz2}
---下記ライブラリのソースを同梱しています
---[[Smdn.Protocols.Imap4&gt;works/libs/Smdn.Net.Imap4]] 0.20
---[[works/libs/Smdn.Formats.Ini]] 0.10

*使い方
<del>tunderebird.iniを開いてアカウント情報を記入してから起動してください。</del>
<ins>+tunderebird.iniを開いてアカウント情報を記入してから起動してください。</ins>
<ins>+Visual Studioではログ出力により動作が遅くなる場合があります。　遅くなる場合は、tunderebird.exe.configを編集してログを出力しないようにしてください。</ins>
<ins />
<ins>*不具合・要望・質問等</ins>
<ins>ライブラリに関する不具合・要望・質問は[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*変更履歴
<del>**0.2x</del>
<del>:0.20|POP3のサポートを削除</del>
<del>メッセージのアップロード・ダウンロード機能を追加</del>
<del>IMAPサーバの情報を表示するタブを追加</del>
<del />
<del>**0.1x</del>
<del>:0.13|ライブラリのバージョンアップに伴うリリース</del>
<del>:0.12|ライブラリのバージョンアップに伴うリリース</del>
<del>:0.11|POP3に対応</del>
<del>:0.10|初版</del>
<ins>**0.21</ins>
<ins>-機能追加</ins>
<ins>--設定ファイルにメールボックスの選択時にSELECTとEXAMINEのどちらを使用するか指定するReadOnlyキーを追加</ins>
<ins>--メールボックス・メッセージに対する各種操作(作成・削除・フラグの設定など)を行えるようにした</ins>
<ins>-修正・改善</ins>
<ins>--メールボックス一覧取得時などのUI周りの動作を改善</ins>
<ins />
<ins>**0.20</ins>
<ins>-POP3のサポートを削除</ins>
<ins>-メッセージのアップロード・ダウンロード機能を追加</ins>
<ins>-IMAPサーバの情報を表示するタブを追加</ins>
<ins />
<ins>**0.13</ins>
<ins>-ライブラリのバージョンアップに伴うリリース</ins>
<ins />
<ins>**0.12</ins>
<ins>-ライブラリのバージョンアップに伴うリリース</ins>
<ins />
<ins>**0.11</ins>
<ins>-POP3に対応</ins>
<ins />
<ins>**0.10</ins>
<ins>-初版</ins>

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/doc/">Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
${smdncms:title,ドキュメント・サンプル}
${smdncms:keywords,}
<del>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。</del>
<ins>[[works/libs/Smdn.Net.Imap4]]のドキュメントとサンプルです。　ご質問などありましたら[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

<del>*ライブラリの設計と実装の概要</del>
<del>**クライアント</del>
<del>クライアントの実装は2種類あります。　一つはSmdn.Protocols.Imap4.Client.Session名前空間のImapSessionクラス、もう一つはSmdn.Protocols.Imap4.WebClient名前空間のImapWebRequest/ImapWebResponseクラスです。　Smdn.Protocols.Imap4.WebClient名前空間のクライアントは、System.Net.WebRequest/System.Net.WebResponseを継承したもので、内部でImapSessionクラスを使用しています。</del>
<del />
<del>二つのクライアントのモデルと概要は次の通りです。</del>
<del />
<del>:ImapSessionクラス|IMAPのコマンドとほぼ1対1で対応するメソッドを持つクラスです。　IMAPの操作は抽象化していません。　仕様と1対1で対応するような実装にしてあります。</del>
<del>切断する/されるまで選択済みメールボックス・メールボックス毎のフラグ・サーバの能力・名前空間等のセッションの状態を保持します。</del>
<del>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、読み込みのみの操作に関しては送信されるIMAPコマンドを意識せずに扱えます。</del>
<del>ImapWebRequest.KeepAliveプロパティでリクエスト毎にセッションを切断するか、ログイン状態を維持するかどうか設定できます。　また、送信するコマンドはImapWebRequest.Methodプロパティで変更できます。</del>
<del />
<del>**認証</del>
<del>認証時に必要なユーザ名・パスワードはSystem.Net.ICredentialsByHostインターフェイスを通して取得します。　ICredentialsインターフェイスではなく、ICredentialsByHostインターフェイスを実装していて、GetCredentialメソッドが適切なSystem.Net.NetworkCredentialを返すクラスなら何でも設定できます。</del>
<del />
<del>ImapWebRequest.Credentialsプロパティは、WebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、同時にICredentialsByHostを実装していない場合は例外をスローします。</del>
<del />
<del>**証明書の選択と検証</del>
<del>認証時に使用する証明書はX509Certificate2Collectionで設定できます。　また、証明書の選択と検証にはRemoteCertificateValidationCallbackデリゲートとLocalCertificateSelectionCallbackデリゲートを使用できます。</del>
<del />
<del>|*証明書に関する型と該当するメンバ(いずれもクラス・プロパティ)</del>
<del>|~証明書に関する型|&gt;|~該当するメンバ|</del>
<del>|~|~Smdn.Protocols.Imap4.Client.Connection名前空間|~Smdn.Protocols.Imap4.WebClient名前空間|</del>
<del>|X509Certificate2Collection|ImapConnection.CertCollection|ImapSessionManager.CertCollection|</del>
<del>|RemoteCertificateValidationCallback|ImapConnection.CertificateValidationCallback|ImapSessionManager.CertificateValidationCallback|</del>
<del>|LocalCertificateSelectionCallback|ImapConnection.CertificateSelectionCallback|ImapSessionManager.CertificateSelectionCallback|</del>
<del />
<del>**操作とデータ構造</del>
<del>ImapSessionクラスには、IMAPコマンドと1対1に対応するメソッドが用意されています。　また、すべてのコマンドの引数とレスポンスのデータ構造は、それに対応する型が定義されています。　これらの型は出来る限り仕様と1対1で対応するように実装してあり、IMAPの詳細が分からなくても使えることを目的とするような抽象化はしていません。</del>
<ins>*使用例</ins>
<ins>個々のサンプルの詳細については、後述するSmdn.Net.Imap4.WebClient名前空間の説明を参照してください。</ins>

<del>**メールボックスのインスタンス</del>
<del>メールボックスの情報はImapMailboxクラスに保持されます。　このクラスのインスタンスは、LISTコマンド等により作成された後は、ログアウトするまでライブラリ側で管理されます。　同じメールボックスに対してSELECTしたりRENAMEした場合はインスタンスの値のみが更新され、常に同じインスタンスが返されます。</del>
<del />
<del>**ログ</del>
<del>シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。　ログにはパスワードを含む送受信内容を解読可能な状態で出力します。　ログの出力が不要な場合はTrace.csを削除するか、TRACEを無効にしてリビルドしてください。</del>
<del />
<del>|*ログ出力に使用するTraceSourceの名前と出力内容</del>
<del>|TraceSource|出力内容|h</del>
<del>|Smdn.Protocols.Imap4|サーバとの送受信内容とセッション毎の動作ログを出力します。|</del>
<del>|Smdn.Protocols.Imap4#Connection|サーバとの送受信内容のみを出力します。|</del>
<del />
<del>*Smdn.Protocols.Imap4.WebClient名前空間</del>
<del>Smdn.Protocols.Imap4.WebClient名前空間のクラスの使い方。</del>
<del />
<del>**簡単なサンプル</del>
<del>WebClientクラスを使って、localhostのINBOXメールボックスからUIDが1のメールをダウンロードし、sample.emlとして保存するサンプル。</del>
<ins>**メッセージのダウンロード</ins>
<ins>WebClientクラスを使って、localhostのINBOXメールボックスからUIDが1のメールをダウンロードし、sample.emlとして保存するサンプル。　ログインユーザ名にuser、パスワードにpassを使用し、認証方式にDIGEST-MD5を使用。</ins>
#code(cs){{
using System;
using System.Net;

<del>using Smdn.Protocols.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClient;</ins>

class Sample {
  public static void Main(string[] args)
}
}}

<ins>**メッセージのアップロード</ins>
WebClientクラスを使って、localhostのINBOXメールボックスにsample.emlをアップロードするサンプル。
#code(cs){{
using System;
using System.IO;
using System.Net;

<del>using Smdn.Protocols.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClient;</ins>

class Sample {
  public static void Main(string[] args)
}
}}

<ins>**メッセージの検索</ins>
WebRequestクラスを使って、Gmailアカウントのメールボックスからタイトルに[Mono-dev]を含むメールの一覧を取得する例。
#code(cs){{
using System;
using System.Net;

<del>using Smdn.Protocols.Imap4.WebClient;</del>
<ins>using Smdn.Net.Imap4.WebClient;</ins>

class Sample {
  public static void Main(string[] args)
}
}}

<ins>*ライブラリの設計と実装の概要</ins>
<ins>**クライアント</ins>
<ins>クライアントの実装は2種類あります。　一つはSmdn.Net.Imap4.Client.Session名前空間のImapSessionクラス、もう一つはSmdn.Net.Imap4.WebClient名前空間のImapWebRequest/ImapWebResponseクラスです。　Smdn.Net.Imap4.WebClient名前空間のクライアントは、System.Net.WebRequest/System.Net.WebResponseを継承したもので、内部でImapSessionクラスを使用しています。</ins>
<ins />
<ins>二つのクライアントのモデルと概要は次の通りです。</ins>
<ins />
<ins>:ImapSessionクラス|IMAPのコマンドとほぼ1対1で対応するメソッドを持つクラスです。　IMAPの操作は抽象化していません。　仕様と1対1で対応するような実装にしてあります。</ins>
<ins>切断する/されるまで選択済みメールボックス・メールボックス毎のフラグ・サーバの能力・名前空間等のセッションの状態を保持します。</ins>
<ins>:ImapWebRequest/ImapWebResponseクラス|IMAP URL(&amp;urn2url(urn:ietf:rfc:5092,short);)を用いたクライアントの実装です。　IMAP URLの形式でIMAPの操作を行うので、読み込みのみの操作に関しては送信されるIMAPコマンドを意識せずに扱えます。</ins>
<ins>ImapWebRequest.KeepAliveプロパティでリクエスト毎にセッションを切断するか、ログイン状態を維持するかどうか設定できます。　また、送信するコマンドはImapWebRequest.Methodプロパティで変更できます。</ins>
<ins />
<ins>**認証</ins>
<ins>認証時に必要なユーザ名・パスワードはSystem.Net.ICredentialsByHostインターフェイスを通して取得します。　ICredentialsインターフェイスではなく、ICredentialsByHostインターフェイスを実装していて、GetCredentialメソッドが適切なSystem.Net.NetworkCredentialを返すクラスなら何でも設定できます。</ins>
<ins />
<ins>ImapWebRequest.Credentialsプロパティは、WebRequestから継承しているためICredentialsインターフェイスを実装していることを要求しますが、同時にICredentialsByHostを実装していない場合は例外をスローします。</ins>
<ins />
<ins>**証明書の選択と検証</ins>
<ins>認証時に使用する証明書はX509Certificate2Collectionで設定できます。　また、証明書の選択と検証にはRemoteCertificateValidationCallbackデリゲートとLocalCertificateSelectionCallbackデリゲートを使用できます。</ins>
<ins />
<ins>|*証明書に関する型と該当するメンバ(いずれもクラス・プロパティ)</ins>
<ins>|~証明書に関する型|&gt;|~該当するメンバ|</ins>
<ins>|~|~Smdn.Net.Imap4.Protocol.Client名前空間|~Smdn.Net.Imap4.WebClient名前空間|</ins>
<ins>|X509Certificate2Collection|ImapConnection.CertCollection|ImapSessionManager.CertCollection|</ins>
<ins>|RemoteCertificateValidationCallback|ImapConnection.CertificateValidationCallback|ImapSessionManager.CertificateValidationCallback|</ins>
<ins>|LocalCertificateSelectionCallback|ImapConnection.CertificateSelectionCallback|ImapSessionManager.CertificateSelectionCallback|</ins>
<ins />
<ins>**操作とデータ構造</ins>
<ins>ImapSessionクラスには、IMAPコマンドと1対1に対応するメソッドが用意されています。　また、すべてのコマンドの引数とレスポンスのデータ構造は、それに対応する型が定義されています。　これらの型は出来る限り仕様と1対1で対応するように実装してあり、IMAPの詳細が分からなくても使えることを目的とするような抽象化はしていません。</ins>
<ins />
<ins>**メールボックスのインスタンス</ins>
<ins>メールボックスの情報はImapMailboxクラスに保持されます。　このクラスのインスタンスは、LISTコマンド等により作成された後は、ログアウトするまでライブラリ側で管理されます。　同じメールボックスに対してSELECTしたりRENAMEした場合はインスタンスの値のみが更新され、常に同じインスタンスが返されます。</ins>
<ins />
<ins>**ログ</ins>
<ins>シンボルTRACEを有効にしてビルドした場合、トレースにログを出力します。　ログにはパスワードを含む送受信内容を解読可能な状態で出力します。　ログの出力が不要な場合はTrace.csを削除するか、TRACEを無効にしてリビルドしてください。</ins>
<ins />
<ins>|*ログ出力に使用するTraceSourceの名前と出力内容</ins>
<ins>|TraceSource|出力内容|h</ins>
<ins>|Smdn.Net.Imap4.Client|サーバとの送受信内容とセッション毎の動作ログを出力します。|</ins>
<ins>|Smdn.Net.Imap4.Client#Connection|サーバとの送受信内容のみを出力します。|</ins>
<ins />
<ins>*Smdn.Net.Imap4.WebClient名前空間</ins>
<ins>Smdn.Net.Imap4.WebClient名前空間のクラスの使い方。</ins>
<ins />
**imap, imapsスキームの登録
<del>Smdn.Protocols.Imap4.WebClient名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</del>
<ins>Smdn.Net.Imap4.WebClient名前空間のクラスを使う場合には、WebRequestクラスがimapスキームおよびimapsスキームのURLを処理できるようにImapSessionManager.RegisterWebRequestPrefixメソッドを呼び出しておく必要があります。</ins>

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

|ImapWebRequestMethods.Thread|THREADコマンドを送信して検索クエリに該当するメッセージの一覧をスレッド形式で取得します。|スレッド形式のアルゴリズムはImapWebRequest.ThreadingAlgorithmプロパティで指定します。　また、取得したスレッド形式の一覧は、ImapWebResponse.ThreadTreeプロパティに設定されます。&amp;br;''サーバがTHREAD=* extensionをサポートしない場合、WebExceptionをスローします。''|
|ImapWebRequestMethods.Sort|SORTコマンドを送信して検索クエリに該当するメッセージの一覧をソート済みの形式で取得します。|ソート方法はImapWebRequest.SortCriteriaプロパティで指定します。　また、取得したメッセージの一覧は、ImapWebResponse.Messagesプロパティに設定されます。&amp;br;''サーバがSORT=* extensionをサポートしない場合、WebExceptionをスローします。''|

<del>IMAP URLに関するその他の事柄。</del>
<del>-HTTPなどのURLと同様にUriクラスを用いることができますが、ライブラリにはIMAP URLに対応したImapUriクラスを用意してあります。</del>
<ins>***IMAP URLに関する注意事項など</ins>
<ins>-現時点では検索クエリに日本語等非ASCII文字を含めることはできません。　URLエンコードした文字列を検索クエリに含めた場合でも、エンコードした結果に非ASCII文字が含まれるような場合はリクエスト時にWebExceptionをスローします。</ins>
-UIDVALIDITYを含むIMAP URLも扱えますが、無視します。　現時点ではUIDVALIDITYが指定されていない場合と同様に扱います。

<del>*Smdn.Protocols.Imap4.Client.Session名前空間</del>
<del>Smdn.Protocols.Imap4.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Protocols.Imap4.WebClientの各クラスの実装を参照してください。</del>
<ins>**ImapWebRequestクラスのプロパティ</ins>
<ins>ImapWebRequestクラスにはコマンド送信時の動作を制御するためのプロパティを用意してあります。　プロパティの値によってリクエスト内容と動作が変わります。</ins>
<ins />
<ins>|*ImapWebRequestクラスのプロパティ</ins>
<ins>|プロパティ|デフォルト|対象となるコマンド|リクエスト内容と動作|h</ins>
<ins>|KeepAlive|true|全て|リクエストが終了した後もログイン状態を維持するかどうかを指定します。|</ins>
<ins>|AllowLoginRedirect|true|全て(認証時)|認証時にサーバがレスポンスコードREFERRALを返した場合、レスポンスコードで指定されたURLで再度ログインを試みるかどうかを指定します。(この機能は未テストです。　期待する動作となるかどうかは分かりません)</ins>
<ins>|UseTlsIfAvailable|true|全て(認証時)|サーバがサポートしている場合、TLSを使用した接続に変更します。|</ins>
<ins>|UseDeflateIfAvailable|false|全て|サーバがサポートしている場合、DEFLATE圧縮アルゴリズムを使用した接続に変更します。　(この機能は現在動作しません。　trueにした場合、NotImplementedExceptionがスローされます)|</ins>
<ins>|ExpectedErrorResponseCodes|null|全て|サーバから返されることが予期されるエラーレスポンスコードの配列を指定します。　サーバからこれらのレスポンスコードが返された場合は、WebExceptionがスローされません。|</ins>
<ins>|ReadOnly|false|FETCH, SEARCH等|メールボックスを選択する際に、SELECTコマンドの代わりにEXAMINEコマンドを送信するかどうかを指定します。　メッセージに対する操作を行うコマンドを送信する場合に有効になります。　EXAMINEコマンドで選択したメールボックスのメッセージに対する操作の結果はサーバの実装によります。　ReadOnlyがtrueでもDELETEなどのコマンドには影響しません。|</ins>
<ins>|SearchCriteriaEncoding|Encoding.UTF8|SEARCH等|検索クエリのエンコードに使用する文字コードを指定します。　サーバがサポートしていない文字コードを指定した場合はエラーとなります。　(この機能は現在動作しません。　将来のバージョンで検索クエリにASCII文字以外も含められるようにした時点で機能します。)|</ins>
<ins>|AllowCreateMailbox|true|COPY|COPYコマンドを送信した際にサーバがレスポンスコードTRYCREATEを返した場合、自動的にメールボックスを作成するかどうかを指定します。|</ins>
<ins>|DestinationUri|null|COPY, RENAME|COPYの場合はメッセージのコピー先、RENAMEの場合は変更後のメールボックス名を含むURLを指定します。　URLはコピー元・変更前と同一サーバ、同一ユーザである必要があります。　それ以外の場合、InvalidOperationExceptionをスローします。|</ins>
<ins>|StoreDataItem|null|STORE|STOREコマンドでメッセージに追加・削除・設定するフラグを指定します。|</ins>
<ins>|SortCriteria|null|SORT|SORTコマンドで使用するソート方法を指定します。|</ins>
<ins>|ThreadingAlgorithm|null|THREAD|THREADコマンドで使用するスレッド形式のアルゴリズムを指定します。|</ins>
<ins />
<ins>**サンプル</ins>
<ins>***メッセージのコピー</ins>
<ins>INBOXにあるメッセージすべてをINBOX.backupにコピーする例。　AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.WebClient;</ins>
<ins>  :</ins>
<ins />
<ins>var request = WebRequest.Create("imap://user@localhost/INBOX/?ALL") as ImapWebRequest;</ins>
<ins />
<ins>request.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>request.Method = ImapWebRequestMethods.Copy;</ins>
<ins>request.AllowCreateMailbox = true;</ins>
<ins>request.DestinationUri = new Uri("imap://user@localhost/INBOX.backup/");</ins>
<ins />
<ins>using {</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>***メールボックスの削除</ins>
<ins>メールボックスINBOX.oldを削除する例。　ExpectedErrorResponseCodesプロパティにImapResponseCode.NonExistentを指定しておくことで、メールボックスが存在しない場合(サーバがレスポンスコードNONEXISTENTを返した場合)でもWebExceptionをスローしないようにします。</ins>
<ins />
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Protocol.Client;</ins>
<ins>using Smdn.Net.Imap4.WebClient;</ins>
<ins>  :</ins>
<ins />
<ins>var request = WebRequest.Create("imap://user@localhost/INBOX.old/") as ImapWebRequest;</ins>
<ins />
<ins>request.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>request.Method = ImapWebRequestMethods.Delete;</ins>
<ins>request.ExpectedErrorResponseCodes = new[] {ImapResponseCode.NonExistent};</ins>
<ins />
<ins>using {</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>***メールボックスの作成</ins>
<ins>メールボックスINBOX.newを作成する例。　先の例と同様に、メールボックスがすでに存在する場合(サーバがレスポンスコードALREADYEXISTSを返した場合)でもWebExceptionをスローしないようにします。</ins>
<ins />
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Protocol.Client;</ins>
<ins>using Smdn.Net.Imap4.WebClient;</ins>
<ins>  :</ins>
<ins />
<ins>var request = WebRequest.Create("imap://user@localhost/INBOX.new/") as ImapWebRequest;</ins>
<ins />
<ins>request.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>request.Method = ImapWebRequestMethods.Create;</ins>
<ins>request.ExpectedErrorResponseCodes = new[] {ImapResponseCode.AlreadyExists};</ins>
<ins />
<ins>using {</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>***メッセージへのフラグの設定</ins>
<ins>fromにspammer.example.comを含むメッセージをすべて既読にし、Thunderbirdの迷惑メールのマーク(Junk)を設定する例。　ImapStoreDataItem.ReplaceFlagsメソッドを使って新しく置き換える(設定する)フラグを作成し、StoreDataItemプロパティにしています。</ins>
<ins />
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.Net;</ins>
<ins>using System.Text;</ins>
<ins />
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Protocol.Client;</ins>
<ins>using Smdn.Net.Imap4.WebClient;</ins>
<ins>  :</ins>
<ins />
<ins>var request = WebRequest.Create("imap://user@localhost/INBOX/?from spammer.example.com") as ImapWebRequest;</ins>
<ins />
<ins>request.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>request.Method = ImapWebRequestMethods.Store;</ins>
<ins>request.StoreDataItem = ImapStoreDataItem.ReplaceFlags(new[] {"Junk"}, ImapMessageFlag.Seen);</ins>
<ins />
<ins>using {</ins>
<ins>  :</ins>
<ins>  :</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>*Smdn.Net.Imap4.Client.Session名前空間</ins>
<ins>Smdn.Net.Imap4.Client.Session名前空間のクラスの使い方。　このドキュメントは作成中です。　[[works/tools/junk/TundereBird]]およびSmdn.Net.Imap4.WebClientの各クラスの実装を参照してください。</ins>

<del>**簡単なサンプル</del>
<ins>**サンプル</ins>
<ins>***ログインと各種コマンド送信の例</ins>
IDLEでメールボックス(INBOX)を監視し、新着メッセージが着たらサブジェクトを表示するサンプル。

#code(cs){{
using System;
using System.Net;

<del>using Smdn.Protocols.Imap4;</del>
<del>using Smdn.Protocols.Imap4.Client;</del>
<del>using Smdn.Protocols.Imap4.Client.Protocol;</del>
<del>using Smdn.Protocols.Imap4.Client.Session;</del>
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Client;</ins>
<ins>using Smdn.Net.Imap4.Client.Session;</ins>

class Sample {
  public static void Main()

      ImapMessage[] messages;

<del>      session.UidFetch(matched, ImapFetchDataItem.All, out messages);</del>
<ins>      session.Fetch(matched, ImapFetchDataItem.All, out messages);</ins>

      foreach {
        Console.WriteLine(message.Envelope.Subject);
}
}}

<ins>***Gmail</ins>
Gmailに接続し、スター付きのメールにThunderbirdのTo Doタグを付けるサンプル。
#code(cs){{
using System;
using System.Net;

<del>using Smdn.Protocols.Imap4;</del>
<del>using Smdn.Protocols.Imap4.Client;</del>
<del>using Smdn.Protocols.Imap4.Client.Protocol;</del>
<del>using Smdn.Protocols.Imap4.Client.Session;</del>
<ins>using Smdn.Net.Imap4;</ins>
<ins>using Smdn.Net.Imap4.Client;</ins>
<ins>using Smdn.Net.Imap4.Client.Session;</ins>
<ins>using Smdn.Net.Imap4.Protocol.Client;</ins>

class Sample {
  public static void Main()
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/">Works/Libraries/Smdn.Net.Imap4</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
C#で書いた.NET Framework/Mono用IMAP4rev1クライアントライブラリです。　IMAPサーバからのメールボックスの管理(作成・削除・ステータスの取得など)、メッセージの検索・取得・アップロードなどが出来ます。

*機能概要
<del>-使用可能なコマンド</del>
<del>--認証系コマンド</del>
<del>---AUTHENTICATE(DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS), LOGIN, LOGOUT, STARTTLS</del>
<del>--メールボックス操作系コマンド</del>
<del>---標準コマンド: CREATE, RENAME, DELETE, CLOSE, SELECT, EXAMINE, LIST, LSUB, STATUS, SUBSCRIBE, UNSUBSCRIBE</del>
<del>---拡張コマンド: RLIST, RLSUB, UNSELECT, NAMESPACE</del>
<del>--メッセージ操作系コマンド</del>
<del>---標準コマンド: APPEND,SEARCH, EXPUNGE</del>
<del>---拡張コマンド:, UID EXPUNGE</del>
<del>--その他のコマンド</del>
<del>---標準コマンド: NOOP, CHECK, CAPABILITY</del>
<del>---拡張コマンド: ENABLE, COMPRESS, IDLE, ID</del>
<del>-クライアント機能</del>
<del>--IMAPコマンドと1対1に対応するメソッドを持つクライアント</del>
<del>--WebRequest/WebResponseクラスから派生しIMAP URLでの操作に対応したクライアント</del>
<ins>使用可能なコマンド</ins>
<ins>:認証系コマンド|LOGIN, AUTHENTICATE, LOGOUT, STARTTLS</ins>
<ins>::認証方式|DIGEST-MD5, CRAM-MD5, NTLM, PLAIN, LOGIN, ANONYMOUS</ins>
<ins>:メールボックス操作系コマンド|</ins>
<ins>::標準コマンド|CREATE, RENAME, DELETE, CLOSE, SELECT, EXAMINE, LIST, LSUB, STATUS, SUBSCRIBE, UNSUBSCRIBE</ins>
<ins>::拡張コマンド|RLIST, RLSUB, UNSELECT, NAMESPACE</ins>
<ins>:メッセージ操作系コマンド|</ins>
<ins>::標準コマンド|APPEND,SEARCH, EXPUNGE</ins>
<ins>::拡張コマンド|(UID)SORT,, UID EXPUNGE</ins>
<ins>:その他のコマンド|</ins>
<ins>::標準コマンド|NOOP, CHECK, CAPABILITY</ins>
<ins>::拡張コマンド|ENABLE, COMPRESS, IDLE, ID</ins>
<ins />
<ins>実装しているクライアントは次の二種類です。</ins>
<ins>:ImapSessionクラス|IMAPコマンドと1対1に対応するメソッドを持つクライアント</ins>
<ins>:ImapWebRequest/ImapWebResponseクラス|WebRequest/WebResponseクラスから派生し、IMAP URLでの操作に対応したクライアント</ins>

<del>機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]、使い方・サンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</del>
<ins>使い方・サンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]、機能の詳細は[[works/libs/Smdn.Net.Imap4/feature]]をご覧ください。　またデモ用アプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>

*ダウンロード
#googleadunit
0.20以降はMIT X11ライセンスでのリリースとなります。　0.20より前のバージョンについては特に使用条件を定めていません。

<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
-0.2x
<ins>--${smdncms:distfilelink,Smdn.Net.Imap4.Client-0.21.tar.bz2}</ins>
--${smdncms:distfilelink,Smdn.Protocols.Imap4-0.20.tar.bz2}
-0.1x
--[[works/tools/junk/TundereBird]]に含まれているものを使ってください

<ins>*不具合・要望・質問等</ins>
<ins>不具合・要望・使い方の質問は[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>
<ins />
*変更履歴
<del>**0.2x</del>
<del>:0.20|ライセンスをMIT X11に変更</del>
<del>コマンド・リクエストの処理をセッションに共通スレッドからセッション毎のスレッドプールを使用するように変更</del>
<del>リクエストの処理速度を改善</del>
<del>&amp;urn2url(urn:ietf:rfc:4315){UIDPLUS};、&amp;urn2url(urn:ietf:rfc:4731){ESEARCH};、&amp;urn2url(urn:ietf:rfc:5182){SEARCHRES};などの拡張に対応</del>
<del>DIGEST-MD5およびNTLM認証に対応</del>
<del />
<del>**0.1x</del>
<del>:0.13|STARTTLSコマンドによるTLSへのアップグレードに対応</del>
<del>不正な形式のModified UTF-7文字列のデコードで例外となる場合の対処を追加</del>
<del>PREAUTH応答のグリーティングメッセージからのcapability dataの取得に失敗する不具合を修正</del>
<del>FETCHリクエストを10240オクテット毎にpartial fetchするように改善</del>
<del>未知の種類のBODYSTRUCTUREの場合でも解析を継続するように改善</del>
<del>:0.12|Modified UTF-7(日本語等非ASCII文字を含むメールボックス名)に対応</del>
<del>レスポンス解析処理のバグを修正</del>
<del>IDLE後のレスポンス処理が即座に行われない不具合を修正</del>
<del>HMACMD5アルゴリズムの実装を独自の実装からライブラリ標準のクラスを用いたものに変更</del>
<del>:0.11|グリーティングメッセージからのcapability dataの取得に失敗する不具合を修正</del>
<del>セッションのステートチェック処理の誤りを修正</del>
<del>AUTHENTICATEで使用できる認証方法がない場合の動作を変更</del>
<del>:0.10|初版</del>
<ins>**0.21</ins>
<ins>-機能追加</ins>
<ins>--WebClient名前空間</ins>
<ins>---ImapWebRequest.ReadOnlyプロパティを追加</ins>
<ins>---ImapWebRequest.AllowCreateMailboxプロパティを追加</ins>
<ins>---ImapWebRequest.ExpectedErrorResponseCodesプロパティを追加</ins>
<ins>-修正・改善</ins>
<ins>--DIGEST-MD5認証時にOverflowExceptionとなる不具合を修正(Windowsのみ)</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:4978){COMPRESS=DEFLATE};の実装を無効化</ins>
<ins>--ImapUriクラスを廃止、IMAP URL関連の実装を修正</ins>
<ins>--WebClient名前空間</ins>
<ins>---検索条件にマッチするメッセージが無い場合に例外エラーとなる不具合を修正</ins>
<ins>---CREATE/RENAME後にLSUBでメールボックスの属性を更新するように改善</ins>
<ins>-その他</ins>
<ins>--アセンブリ名・名前空間をSmdn.Protocols.Imap4からSmdn.Net.Imap4に改名</ins>
<ins>--アセンブリ構成を変更</ins>
<ins />
<ins>**0.20</ins>
<ins>-機能追加</ins>
<ins>--DIGEST-MD5およびNTLM認証に対応</ins>
<ins>--&amp;urn2url(urn:ietf:rfc:4315){UIDPLUS};、&amp;urn2url(urn:ietf:rfc:4731){ESEARCH};、&amp;urn2url(urn:ietf:rfc:5182){SEARCHRES};などの拡張に対応</ins>
<ins>-修正・改善</ins>
<ins>--コマンド・リクエストの処理をセッションに共通スレッドからセッション毎のスレッドプールを使用するように変更</ins>
<ins>--リクエストの処理速度を改善</ins>
<ins>-その他</ins>
<ins>--ライセンスをMIT X11に変更</ins>
<ins />
<ins>**0.13</ins>
<ins>-STARTTLSコマンドによるTLSへのアップグレードに対応</ins>
<ins>-不正な形式のModified UTF-7文字列のデコードで例外となる場合の対処を追加</ins>
<ins>-PREAUTH応答のグリーティングメッセージからのcapability dataの取得に失敗する不具合を修正</ins>
<ins>-FETCHリクエストを10240オクテット毎にpartial fetchするように改善</ins>
<ins>-未知の種類のBODYSTRUCTUREの場合でも解析を継続するように改善</ins>
<ins />
<ins>**0.12</ins>
<ins>-Modified UTF-7(日本語等非ASCII文字を含むメールボックス名)に対応</ins>
<ins>-レスポンス解析処理のバグを修正</ins>
<ins>-IDLE後のレスポンス処理が即座に行われない不具合を修正</ins>
<ins>-HMACMD5アルゴリズムの実装を独自の実装からライブラリ標準のクラスを用いたものに変更</ins>
<ins />
<ins>**0.11</ins>
<ins>-グリーティングメッセージからのcapability dataの取得に失敗する不具合を修正</ins>
<ins>-セッションのステートチェック処理の誤りを修正</ins>
<ins>-AUTHENTICATEで使用できる認証方法がない場合の動作を変更</ins>
<ins />
<ins>**0.10</ins>
<ins>-初版</ins>

*動作状況
以下のIMAPサーバに対して概ね問題なく動作することを確認済みです。
-GMail
<del>-Dovecot</del>
<ins>-Dovecot</ins>

以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.4</del>
<ins>-Mono 2.7</ins>

*制限事項
-MIMEメッセージのデコード機能は含んでいません。　デコード機能が必要な場合は他のライブラリか、[[works/libs/Smdn.Formats.Mime]]を使ってください。
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Net.Imap4/feature/">Works/Libraries/Smdn.Net.Imap4/機能一覧</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
|&amp;urn2url(urn:ietf:rfc:4551,anchor-text);|CONDSTORE|&amp;color(orange){partially implemented};||
|&amp;urn2url(urn:ietf:rfc:4731,anchor-text);|ESEARCH|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:4959,anchor-text);|SASL-IR|&amp;color(gray){not implemented};||
<del>|&amp;urn2url(urn:ietf:rfc:4978,anchor-text);|COMPRESS=DEFLATE|&amp;color(red){not tested};||</del>
<ins>|&amp;urn2url(urn:ietf:rfc:4978,anchor-text);|COMPRESS=DEFLATE|&amp;color(gray){not implemented};||</ins>
|&amp;urn2url(urn:ietf:rfc:5032,anchor-text);|WITHIN|&amp;color(green){implemented};||
|&amp;urn2url(urn:ietf:rfc:5092,anchor-text);|-|&amp;color(orange){partially implemented};|URLAUTHは未実装です。　URLにUIDVALIDITYが指定されていてもUIDの検証は行いません。　[独自拡張]URLのスキームがimapsの場合、デフォルトポートとして993を使用し、SSLによる接続を試みます。|
|&amp;urn2url(urn:ietf:rfc:5161,anchor-text);|ENABLE|&amp;color(green){implemented};||
|EXAMINE with CONDSTORE parameter|&amp;urn2url(urn:ietf:rfc:4551,#3.7,short);|&amp;color(green){implemented};||
|SEARCH with RETURN result specifier|&amp;urn2url(urn:ietf:rfc:4731,#3.1,short); &amp;urn2url(urn:ietf:rfc:5182,#2.1,short); &amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,#3.5,short);|&amp;color(green){implemented};||
|SORT with RETURN result specifier|&amp;urn2url(urn:ietf:rfc:4731,#3.1,short); &amp;urn2url(urn:ietf:rfc:5182,#2.1,short); &amp;urn2url(urn:ietf:id:ietf-morg-inthread-00,#3.5,short);|&amp;color(green){implemented};||
<del>|COMPRESS|&amp;urn2url(urn:ietf:rfc:4978,#3,short);|&amp;color(red){not tested};||</del>
<ins>|COMPRESS|&amp;urn2url(urn:ietf:rfc:4978,#3,short);|&amp;color(gray){not implemented};||</ins>
|ENABLE|&amp;urn2url(urn:ietf:rfc:5161,#3.1,short);|&amp;color(green){implemented};||
|LANGUAGE|&amp;urn2url(urn:ietf:rfc:5255,#3.2,short);|&amp;color(gray){not implemented};||
|COMPARATOR|&amp;urn2url(urn:ietf:rfc:5255,#4.7,short);|&amp;color(gray){not implemented};||
</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Mime/">Works/Libraries/Smdn.Formats.Mime</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
#googleadunit
0.14以降はMIT X11ライセンスでのリリースとなります。　0.14より前のバージョンについては特に使用条件を定めていません。

<del>-${smdncms:distfilelink,Smdn.Formats.Mime-0.14.tar.bz2}</del>
<del>-以前のバージョン</del>
<del>--[[works/tools/junk/TundereBird]]に含まれているものを使ってください</del>
<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
<ins>-0.1x</ins>
<ins>--${smdncms:distfilelink,Smdn.Formats.Mime-0.15.tar.bz2}</ins>
<ins>--${smdncms:distfilelink,Smdn.Formats.Mime-0.14.tar.bz2}</ins>
<ins>--上記以前のバージョン</ins>
<ins>---[[works/tools/junk/TundereBird]]に含まれているものを使ってください</ins>
<ins />
<ins>*不具合・要望・質問等</ins>
<ins>不具合・要望・使い方の質問は[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*サンプル
emlファイルを読み込んでヘッダの一覧とボディの内容を表示する例。
#code(cs){{
using System;
<del>using System.IO;</del>
using Smdn.Formats.Mime;

public class ReadMail {
  public static void Main(string[] args) {
<del>    using {</del>
<del>      var message = MimeMessage.Create(reader);</del>
<del>      Dump(message);</del>
<del>    }</del>
<ins>    var message = MimeMessage.Load("/home/smdn/Desktop/sample.eml");</ins>
<ins />
<ins>    Dump(message, 0);</ins>
  }

<del>  private static void Dump(MimeMessage message)</del>
<ins>  private static void Dump(MimeMessage message, int nest)</ins>
  {
<del>    DumpHeaders(message);</del>
<ins>    var indent = new string(' ', nest * 4);</ins>
<ins />
<ins>    DumpHeaders(message, indent);</ins>
<ins />
<ins>    Console.Write(indent);</ins>

<del>    Console.WriteLine(message.Body);</del>
<ins>    if</ins>
<ins>      Console.WriteLine(message.ReadContentAsText());</ins>
<ins>    else</ins>
<ins>      Console.WriteLine(message.MimeType);</ins>

    foreach {
<del>      Dump(part);</del>
<ins>      Console.WriteLine();</ins>
<ins />
<ins>      Dump(part, nest + 1);</ins>
    }
  }

<del>  private static void DumpHeaders(MimeMessage message)</del>
<ins>  private static void DumpHeaders(MimeMessage message, string indent)</ins>
  {
    foreach {
<del>      Console.Write("{0}: ", header.Key);</del>
<del>      foreach {</del>
<del>        Console.WriteLine(val);</del>
<del>      }</del>
<ins>      Console.WriteLine("{0}{1}: {2}", indent, header.Name, header.Value);</ins>
    }
  }
}
}}

<del>本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もご覧ください。</del>
<ins>本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>

*変更履歴
<del>**0.1x</del>
<del>:0.14|ライセンスをMIT X11に変更</del>
<del>拡張子およびファイル内容からのMIMEタイプの判定処理を追加</del>
<del>Content-Transfer-Encodingヘッダの値が;で終端する場合にデコードできない不具合を修正</del>
<del>:0.13|コメントを含む場合等にMIME-Versionヘッダの値を正しく認識できない不具合を修正</del>
<del>改行・空白を含まずに連続するencoded-wordsを正しくデコードできない不具合を修正</del>
<del>ヘッダを含まないmultipartメッセージ等で解析に失敗する不具合を修正</del>
<del>:0.12|元のメッセージの改行文字を保持するように修正</del>
<del>Q-Encodeされた文字列を正しくデコードしない不具合を修正</del>
<del>Q-EncodeおよびB-Encodeされた文字列を正しく認識できない場合がある不具合を修正</del>
<del>メッセージの解析時に入力ストリームの8ビット目が損失する不具合を修正</del>
<del>Quoted-Printableのデコード処理の不具合を修正</del>
<del>:0.11|stringからインスタンスをコンストラクトできるようにした</del>
<del>:0.10|初版</del>
<ins />
<ins>**0.15</ins>
<ins>-機能追加</ins>
<ins>--添付ファイル・代替メッセージの作成機能、メッセージのエンコード・フォーマット機能を追加(ただしインターフェイスは未確定)</ins>
<ins>-修正・改善</ins>
<ins>--エンコーディングにutf8, shift-jisなど正式な名称とは異なる値が指定されている場合に解析に失敗する不具合を修正</ins>
<ins>--インターフェイスを修正</ins>
<ins>-その他</ins>
<ins>--アセンブリ構成を変更</ins>
<ins />
<ins>**0.14</ins>
<ins>-ライセンスをMIT X11に変更</ins>
<ins>-拡張子およびファイル内容からのMIMEタイプの判定処理を追加</ins>
<ins>-Content-Transfer-Encodingヘッダの値が;で終端する場合にデコードできない不具合を修正</ins>
<ins />
<ins>**0.13</ins>
<ins>-コメントを含む場合等にMIME-Versionヘッダの値を正しく認識できない不具合を修正</ins>
<ins>-改行・空白を含まずに連続するencoded-wordsを正しくデコードできない不具合を修正</ins>
<ins>-ヘッダを含まないmultipartメッセージ等で解析に失敗する不具合を修正</ins>
<ins />
<ins>**0.12</ins>
<ins>-元のメッセージの改行文字を保持するように修正</ins>
<ins>-Q-Encodeされた文字列を正しくデコードしない不具合を修正</ins>
<ins>-Q-EncodeおよびB-Encodeされた文字列を正しく認識できない場合がある不具合を修正</ins>
<ins>-メッセージの解析時に入力ストリームの8ビット目が損失する不具合を修正</ins>
<ins>-Quoted-Printableのデコード処理の不具合を修正</ins>
<ins />
<ins>**0.11</ins>
<ins>-stringからインスタンスをコンストラクトできるようにした</ins>
<ins />
<ins>**0.10</ins>
<ins>-初版</ins>

*動作状況
以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.4</del>
<ins>-Mono 2.7</ins>

version 0.13の時点では、手元にある計9,189通のメール(スパム、メーリングリスト・メールマガジンから、携帯から、添付ファイル付きなどを含む)を解析した結果、ほぼ正常に解析できています。　ただし解析した結果が「読める」かどうかまでは検証していません。　またMono 1.9ではJISからのデコードが出来ない場合があるようです。

</code></pre>
        </p>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/works/libs/Smdn.Formats.Ini/">Works/Libraries/Smdn.Formats.Ini</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
*機能
現在対応している機能の一覧です。　部分的に対応しているものも含みます。
-セクションが指定されていないキー=値のペアの読み込み
<del>-;および#で記述されるコメント行</del>
<ins>-;および#で記述されるコメント行の読み込み</ins>
<ins>-セクション名・キー名の前後に空白が含まれている形式の読み込み</ins>
<ins>-セクション名・キー名の比較に任意のIEqualityComparer&lt;string&gt;を指定可能</ins>
<ins>-任意のConverter&lt;string, TOutput&gt;を指定することで任意の型に変換した上でキーの値を取得可能</ins>
<ins>-非Windows環境でも使用可(GetPrivateProfile*系のWin32 APIは使用していません)</ins>

*ダウンロード
#googleadunit
0.14以降はMIT X11ライセンスでのリリースとなります。　0.14より前のバージョンについては特に使用条件を定めていません。

<del>-${smdncms:distfilelink,Smdn.Formats.Ini-0.14.tar.bz2}</del>
<del>-以前のバージョン</del>
<del>--[[works/tools/junk/TundereBird]]に含まれているものを使ってください</del>
<ins>-開発版</ins>
<ins>--[[anonsvn]]よりチェックアウトできます</ins>
<ins>-0.1x</ins>
<ins>--${smdncms:distfilelink,Smdn.Formats.Ini-0.15.tar.bz2}</ins>
<ins>--${smdncms:distfilelink,Smdn.Formats.Ini-0.14.tar.bz2}</ins>
<ins>--上記以前のバージョン</ins>
<ins>---[[works/tools/junk/TundereBird]]に含まれているものを使ってください</ins>
<ins />
<ins>*不具合・要望・質問等</ins>
<ins>不具合・要望・使い方の質問は[[掲示板&gt;misc/forum/libs]]へどうぞ。</ins>

*サンプル
<del>本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]をご覧ください。</del>
<ins>本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。</ins>
<ins />
<ins>**読み込み</ins>
<ins>Sambaの設定ファイルと同様の形式のテキストを読み込み、値を表示する例。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins>using System.IO;</ins>
<ins />
<ins>using Smdn.Formats.Ini;</ins>
<ins />
<ins>class IniSample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    var ini = @"</ins>
<ins>[global]</ins>
<ins># Change this to the workgroup/NT-domain name your Samba server will part of</ins>
<ins>   workgroup = WORKGROUP</ins>
<ins />
<ins># This will prevent nmbd to search for NetBIOS names through DNS.</ins>
<ins>   dns proxy = no</ins>
<ins />
<ins># The specific set of interfaces / networks to bind to</ins>
<ins># This can be either the interface name or an IP address/netmask;</ins>
<ins># interface names are normally preferred</ins>
<ins>;   interfaces = 127.0.0.0/8 eth0</ins>
<ins />
<ins>[printers]</ins>
<ins>   comment = All Printers</ins>
<ins>   browseable = no</ins>
<ins>   path = /var/spool/samba</ins>
<ins>   printable = yes</ins>
<ins>   guest ok = no</ins>
<ins>   read only = yes</ins>
<ins>   create mask = 0700</ins>
<ins>";</ins>
<ins />
<ins>    var config = IniDocument.Load(new StringReader(ini));</ins>
<ins />
<ins>    Console.WriteLine("[global]");</ins>
<ins>    // キーの値をstringで取得</ins>
<ins>    Console.WriteLine("workgroup: {0}", config["global"]["workgroup"]);</ins>
<ins>    // yesならtrue、それ以外はfalseとして値を取得</ins>
<ins>    Console.WriteLine("dns proxy: {0}", config["global"].Get("dns proxy",;</ins>
<ins>    // キーが存在しない場合のデフォルトを指定して取得</ins>
<ins>    Console.WriteLine("interfaces: {0}", config["global"].Get("interfaces", "(default interface)"));</ins>
<ins>    // 同じくデフォルトを指定してbool型の値として取得</ins>
<ins>    Console.WriteLine("wins support: {0}", config["global"].Get("wins support", false,;</ins>
<ins />
<ins>    // 条件にマッチするセクションを取得(config["printers"]と同じ)</ins>
<ins>    var printers = config.Find((section) =&gt; section.Name == "printers");</ins>
<ins />
<ins>    Console.WriteLine("[printers]");</ins>
<ins />
<ins>    // デフォルトでは大文字小文字を無視してキー名を比較する</ins>
<ins>    //</ins>
<ins>    Console.WriteLine("read only: {0}", printers.Get("READ Only",;</ins>
<ins>    Console.WriteLine("guest ok: {0}", printers.Get("guest ok",;</ins>
<ins>    Console.WriteLine("path: {0}", printers.Get("path",;</ins>
<ins>    Console.WriteLine("create mask: 0b{0}", Convert.ToString(printers.Get("create mask",;</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>#prompt(実行結果){{</ins>
<ins>[global]</ins>
<ins>workgroup: WORKGROUP</ins>
<ins>dns proxy: False</ins>
<ins>interfaces:</ins>
<ins>wins support: False</ins>
<ins>[printers]</ins>
<ins>read only: True</ins>
<ins>guest ok: False</ins>
<ins>path: /var/spool/samba</ins>
<ins>create mask: 0b111000000</ins>
<ins>}}</ins>
<ins />
<ins>**書き込み</ins>
<ins>desktop.iniを作成、ファイルとコンソールに出力する例。</ins>
<ins>#code(cs){{</ins>
<ins>using System;</ins>
<ins />
<ins>using Smdn.Formats.Ini;</ins>
<ins />
<ins>class IniSample {</ins>
<ins>  public static void Main(string[] args)</ins>
<ins>  {</ins>
<ins>    var desktopIni = new IniDocument();</ins>
<ins />
<ins>    // .ShellClassInfoセクションを作成・取得</ins>
<ins>    var shellClassInfo = desktopIni[".ShellClassInfo"];</ins>
<ins />
<ins>    // それぞれのキーと値を設定</ins>
<ins>    shellClassInfo["InfoTip"] = "hoge";</ins>
<ins>    shellClassInfo["IconFile"] = @"%SystemRoot%\system32\mydocs.dll";</ins>
<ins>    shellClassInfo["IconIndex"] = "-101";</ins>
<ins />
<ins>    desktopIni.Save(@"D:\test\desktop.ini");</ins>
<ins>    desktopIni.Save(Console.Out);</ins>
<ins>  }</ins>
<ins>}</ins>
<ins>}}</ins>
<ins />
<ins>#prompt(コンソールおよびD:\test\desktop.iniの出力結果){{</ins>
<ins />
<ins>[.ShellClassInfo]</ins>
<ins>InfoTip=hoge</ins>
<ins>IconFile=%SystemRoot%\system32\mydocs.dll</ins>
<ins>IconIndex=-101</ins>
<ins />
<ins>}}</ins>

*変更履歴
<del>**0.1x</del>
<del>:0.14|ライセンスをMIT X11に変更</del>
<del>:0.13|[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</del>
<del>:0.12|[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</del>
<del>:0.11|行頭に空白およびタブを含むセクション・エントリを読み込めるようにした</del>
<del>:0.10|初版</del>
<ins>**0.15</ins>
<ins>-機能追加</ins>
<ins>--任意の型変換用デリゲート(Converter&lt;string, TOutput&gt;)を指定して値を取得できるようにした</ins>
<ins>--セクション名・キー名の比較に任意のIEqualityComparer&lt;string&gt;を指定できるようにした</ins>
<ins>--セクションを削除できるようにした</ins>
<ins>-修正・改善</ins>
<ins>--ファイルの上書き時に以前の内容が残る場合がある不具合を修正</ins>
<ins>--個々のセクションの間に改行を入れて保存するように修正</ins>
<ins>--クラス名を変更</ins>
<ins />
<ins>**0.14</ins>
<ins>-ライセンスをMIT X11に変更</ins>
<ins />
<ins>**0.13</ins>
<ins>-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</ins>
<ins />
<ins>**0.12</ins>
<ins>-[[works/tools/junk/TundereBird]]バージョンアップに伴うリリース</ins>
<ins />
<ins>**0.11</ins>
<ins>-行頭に空白およびタブを含むセクション・エントリを読み込めるようにした</ins>
<ins />
<ins>**0.10</ins>
<ins>-初版</ins>

*動作状況
以下の環境で動作することを確認済みです。
-.NET Framework 3.5
<del>-Mono 2.4</del>
<ins>-Mono 2.7</ins>

*対応予定
今後対応する予定の機能です。
-元のフォーマット・コメントを維持した保存機能
<del>-大文字小文字を無視した読み込み機能</del>
<ins>-インデント・改行などのフォーマットを指定した保存機能</ins>
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1260920080</id>
    <link href="http://smdn.invisiblefulmoon.net/works/tools/junk/TundereBird/" rel="alternate" />
    <published>2009-12-16T08:34:40+09:00</published>
    <title type="text">「Works/Tools/Junk/TundereBird」 version 0.21をリリース 「Works/Libraries/Smdn.Net.Imap4」 version 0.21をリリース 「Works/Libraries/Smdn.Formats.Mime」 version 0.15をリリース 「Works/Libraries/Smdn.Formats.Ini」 version 0.15をリリース 「Works/Libraries/Smdn.Net.Imap4/ドキュメント・サンプル」を更新 「Works/Libraries/Smdn.Net.Imap4/機能一覧」を更新</title>
    <updated>2009-12-16T08:34:40+09:00</updated>
  </entry>
  <entry>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <h2>modified pages</h2>
        <ul>
          <li>
            <a href="http://smdn.invisiblefulmoon.net/programming/netfx2/System.Net.Mail.SmtpClient/">Programming/.NET Framework 2.0/System.Net.Mail.SmtpClient</a>
          </li>
        </ul>
        <h3>diff of <a href="http://smdn.invisiblefulmoon.net/programming/netfx2/System.Net.Mail.SmtpClient/">Programming/.NET Framework 2.0/System.Net.Mail.SmtpClient</a></h3>
        <p>
          <pre>​<code xml:space="preserve">
<ins>${smdncms:title,System.Net.Mail.SmtpClient}</ins>
<ins>${smdncms:keywords,System.Net.Mail,SmtpClient,MailMessage}</ins>
<ins />
<ins>System.Net.Mail.SmtpClientの使い方、メールの送信方法など。</ins>
<ins />
<ins>#googleadunit</ins>
<ins />
<ins>*SmtpClientとMailMessageの使い方</ins>
<ins>**基本・メールを送信する</ins>
<ins>本文・ヘッダともにiso-2022-jpを使用してメールを送信する例。　コメントにあるように、ヘッダのエンコーディングにiso-2022-jpなどを指定しても正しいQエンコーディング文字列にはならないので、代わりに自前でBエンコードするようにする。</ins>
<ins />
<ins>#code(cs){{</ins>
<ins>private static string GetBEncoded(string str, Encoding encoding)</ins>
<ins>{</ins>
<ins>  return string.Format("=?{0}?B?{1}?=", encoding.HeaderName, Convert.ToBase64String(encoding.GetBytes(str)));</ins>
<ins>}</ins>
<ins />
<ins>public static void Main()</ins>
<ins>{</ins>
<ins>  var message = new MailMessage("from@mail.example.com", "to@mail.example.net");</ins>
<ins />
<ins>  message.Body = "本文";</ins>
<ins>  message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");</ins>
<ins />
<ins>  /*</ins>
<ins>   * http://support.microsoft.com/kb/933866/ja</ins>
<ins>   * NET Framework 2.0 ベースのアプリケーションで MailMessage を使ってメッセージを送信すると送受信者名、件名が文字化けする</ins>
<ins>   */</ins>
<ins>  message.Subject = GetBEncoded("件名", Encoding.GetEncoding("iso-2022-jp"));</ins>
<ins />
<ins>  var client = new SmtpClient("localhost", 25);</ins>
<ins />
<ins>  client.Send(message);</ins>
<ins>}}</ins>
<ins />
<ins>**ヘッダの長さと折り返し</ins>
<ins>SubjectプロパティやHeadersプロパティでヘッダの内容を指定する場合、長さなどは制限されない上、折り返しもされない模様。</ins>
<ins>#code(cs){{</ins>
<ins>var message = new MailMessage(...);</ins>
<ins />
<ins>// 送信されるメッセージのSubjectヘッダには360文字のxが折り返されずに指定される</ins>
<ins>message.Subject = new string('x', 360);</ins>
<ins>}}</ins>
<ins />
<ins>また、改行やタブなどを含む文字列を指定することもできないので、無理矢理折り返させることも出来ない。</ins>
<ins>#code(cs){{</ins>
<ins>message.Subject = "line1\r\n\tline2\r\n\tline3";  // ArgumentException</ins>
<ins>message.Subject = "line1\r\n line2\r\n line3";    // ArgumentException</ins>
<ins>message.Subject = "line1\n line2\n line3";        // ArgumentException</ins>
<ins>message.Headers["Subject"] = "line1\r\n\tline2\r\n\tline3"; // FormatException</ins>
<ins>message.Headers["Subject"] = "line1\r\n line2\r\n line3";   // FormatException</ins>
<ins>message.Headers["Subject"] = "line1\n line2\n line3";       // FormatException</ins>
<ins>}}</ins>
<ins />
<ins>*SmtpClientインスタンスの作成</ins>
<ins>**SMTPサーバとしてGMailを使用する</ins>
<ins>GMail SMTPサーバでは認証とSSLでの接続が必要になるため、CredentialsとEnableSsl設定する必要がある。</ins>
<ins>#code(cs){{</ins>
<ins>/*</ins>
<ins> * 前略</ins>
<ins> */</ins>
<ins />
<ins>var client = new SmtpClient("smtp.gmail.com", 587);</ins>
<ins />
<ins>client.DeliveryMethod = SmtpDeliveryMethod.Network;</ins>
<ins>client.Credentials = new NetworkCredential("user", "pass");</ins>
<ins>client.EnableSsl = true;</ins>
<ins />
<ins>client.Send(message);</ins>
<ins>}}</ins>
<ins />
<ins>**SMTPサーバの設定にアプリケーション構成ファイルを使用する</ins>
<ins>SmtpClientのHost, Port, Credentailsなどのプロパティは、コンストラクタ等で明示的に指定しない場合、アプリケーション構成ファイルから設定が読み込まれる。　SMTPサーバが不変の場合などは、アプリケーション構成ファイルを使うことができる。</ins>
<ins />
<ins>前項のGMailを使用する場合の例をアプリケーション構成ファイルを使って記述すると次のようになる。</ins>
<ins>#code(xml,test.exe.config){{</ins>
<ins>&lt;?xml version="1.0" encoding="utf-8" ?&gt;</ins>
<ins>&lt;configuration&gt;</ins>
<ins>  &lt;system.net&gt;</ins>
<ins>    &lt;mailSettings&gt;</ins>
<ins>      &lt;smtp deliveryMethod="network"&gt;</ins>
<ins>        &lt;network</ins>
<ins>          host     = "smtp.gmail.com"</ins>
<ins>          port     = "587"</ins>
<ins>          userName = "user"</ins>
<ins>          password = "pass"</ins>
<ins>        /&gt;</ins>
<ins>      &lt;/smtp&gt;</ins>
<ins>    &lt;/mailSettings&gt;</ins>
<ins>  &lt;/system.net&gt;</ins>
<ins>&lt;/configuration&gt;</ins>
<ins>}}</ins>
<ins />
<ins>ただし、EnableSslプロパティはアプリケーション構成ファイルでは指定できないので、コード中で指定するほかない。</ins>
<ins>#code(cs){{</ins>
<ins>/*</ins>
<ins> * 前略</ins>
<ins> */</ins>
<ins />
<ins>var client = new SmtpClient();</ins>
<ins />
<ins>client.EnableSsl = true;</ins>
<ins />
<ins>client.Send(message);</ins>
<ins>}}</ins>
<ins />
<ins>.NET Framework 4からはアプリケーション構成ファイルで指定できる項目が増え、EnableSslプロパティに相当する属性も指定出来るようになる模様。</ins>
<ins />
</code></pre>
        </p>
      </div>
    </content>
    <id>http://smdn.invisiblefulmoon.net/stats/history/#1260120522</id>
    <link href="http://smdn.invisiblefulmoon.net/programming/netfx2/System.Net.Mail.SmtpClient/" rel="alternate" />
    <published>2009-12-07T02:28:42+09:00</published>
    <title type="text">「Programming/.NET Framework 2.0/System.Net.Mail.SmtpClient」を追加</title>
    <updated>2009-12-07T02:28:42+09:00</updated>
  </entry>
</feed>