2014-07-09T01:52:15の更新内容

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

current previous
2098,139 2098,6
 

        

        
 
拡張機能を使用するメソッド、拡張機能が使用できない場合の動作等については[[#operation_reference_extension_specs]]を参照してください。
拡張機能を使用するメソッド、拡張機能が使用できない場合の動作等については[[#operation_reference_extension_specs]]を参照してください。
 

        

        
+
****アカウントまたはサーバーをまたがるコピー・移動 [#operation_examples_misc_accrosssession]
+
ImapMessageInfoクラスおよびImapMessageInfoListクラスの[[CopyTo(), MoveTo()メソッド>#operation_reference_message_control]]は、異なるアカウントまたはサーバーにあるメールボックスをコピー先・移動先として指定することもできます。 このメソッドでは、アカウント・サーバーをまたがったメッセージのコピー・移動を行うことができます。
+

          
+
#tabpage(codelang=cs,container-title=アカウントまたはサーバーをまたがるメッセージのコピー)
+
#code{{
+
using (ImapClient clientSource = new ImapClient(new Uri("imap://user@source.imap.example.net/")),
+
                  clientDest   = new ImapClient(new Uri("imap://user@dest.imap.example.net/"))) {
+
  // コピー元アカウントのINBOXを開く
+
  var mailboxSource = clientSource.OpenInbox();
+
  // コピー元INBOXにあるUIDが1のメッセージを取得する
+
  var messageSource = mailboxSource.GetMessageByUid(1L);
+

          
+
  // コピー先アカウントのINBOXを取得する
+
  var mailboxDest = clientDest.GetInbox();
+

          
+
  // メッセージをコピー先アカウントのINBOXにコピーする
+
  messageSource.CopyTo(mailboxDest);
+
}
+
}}
+
#tabpage-end
+

          
+
[[ImapMailboxInfo.MoveToメソッド>#operation_reference_mailbox_control]]は、コピー先として異なるアカウント・サーバーのメールボックスを表すImapMailboxInfoを指定することはできません。 そのようなImapMailboxInfoを指定した場合は例外をスローします。
+

          
+
一方[[ImapClient.CopyMailbox(), MoveMailbox()メソッド>#operation_reference_mailbox_accrosssession]]では、アカウント・サーバーをまたがったメールボックスのコピー・移動を行うことができます。 このメソッドでは、メールボックスと、そのメールボックス内にあるすべてのメッセージをコピー・移動します。 なお、コピー先に全く同一内容のメッセージがある場合でも、上書きはされず別個のメッセージとしてコピーされます。
+

          
+
#tabpage(codelang=cs,container-title=アカウントまたはサーバーをまたがるメールボックスのコピー)
+
#code{{
+
using (ImapClient clientSource = new ImapClient(new Uri("imap://user@source.imap.example.net/")),
+
                  clientDest   = new ImapClient(new Uri("imap://user@dest.imap.example.net/"))) {
+
  // コピー元アカウントのINBOXを取得
+
  var mailboxSource = clientSource.GetInbox();
+
  // コピー元メールボックスが階層を持つ場合、下位のメールボックスも再帰的にコピーするか
+
  bool recursive = true;
+
  // コピー先にメールボックスを作成する必要がある場合、作成と同時にメールボックスを購読するかどうか
+
  bool subscribe = true;
+

          
+
  // コピー元INBOXの内容を、コピー先アカウントのINBOXにコピーする
+
  ImapClient.CopyMailbox(mailboxSource, clientDest, "INBOX", recursive, subscribe);
+
}
+
}}
+
#tabpage-end
+

          
+
上記のサンプルを実行した場合、メールボックスの構造は次のようになります。
+

          
+
#column
+
#preformatted(コピー元アカウントのINBOX){{
+
INBOX
+
|--フォルダ1
+
|  `--サブフォルダ1
+
`--フォルダ2
+
}}
+
#column
+
#preformatted(コピー先アカウントのINBOX){{
+
INBOX
+
|--フォルダ1
+
|--フォルダ2
+
|  `--サブフォルダ2
+
`--フォルダ3
+
}}
+
#column
+
#preformatted(上記サンプル実行後のコピー先アカウントのINBOX){{
+
INBOX
+
|--フォルダ1
+
|  `--サブフォルダ1
+
|--フォルダ2
+
|  `--サブフォルダ2
+
`--フォルダ3
+
}}
+
#column-end
+

          
+
コピー先の''メールボックス名''を指定する代わりに、''ImapMailboxInfo''を指定することもできます。 この場合、コピー元メールボックスはコピー先メールボックスの''下位のメールボックスとして''コピーされます。
+

          
+
#tabpage(codelang=cs,container-title=アカウントまたはサーバーをまたがるメールボックスのコピー)
+
#code{{
+
using (ImapClient clientSource = new ImapClient(new Uri("imap://user@source.imap.example.net/")),
+
                  clientDest   = new ImapClient(new Uri("imap://user@dest.imap.example.net/"))) {
+
  // コピー元アカウントのINBOXを取得
+
  var mailboxSource = clientSource.GetInbox();
+
  // コピー先アカウントのINBOXを取得
+
  var mailboxDest = clientDest.GetInbox();
+
  // コピー元メールボックスが階層を持つ場合、下位のメールボックスも再帰的にコピーするか
+
  bool recursive = true;
+
  // コピー先にメールボックスを作成する必要がある場合、作成と同時にメールボックスを購読するかどうか
+
  bool subscribe = true;
+

          
+
  // コピー元INBOXの内容を、コピー先INBOXの"配下に"コピー
+
  ImapClient.CopyMailbox(mailboxSource, mailboxDest, recursive, subscribe);
+
}
+
}}
+
#tabpage-end
+

          
+
上記のサンプルを実行した場合、コピー元INBOXはコピー先INBOXの''サブフォルダとしてコピーされる''ことになります。 上記サンプル実行後のメールボックスの構造は次のようになります。
+

          
+
#column
+
#preformatted(コピー元アカウントのINBOX){{
+
INBOX
+
|--フォルダ1
+
|  `--サブフォルダ1
+
`--フォルダ2
+
}}
+
#column
+
#preformatted(コピー先アカウントのINBOX){{
+
INBOX
+
`--フォルダ3
+
}}
+
#column
+
#preformatted(上記サンプル実行後のコピー先アカウントのINBOX){{
+
INBOX
+
|--INBOX
+
|  |--フォルダ1
+
|  |  `--サブフォルダ1
+
|  `--フォルダ2
+
`--フォルダ3
+
}}
+
#column-end
+

          
+
[[ImapClient.CopyMailbox()メソッド>#operation_reference_mailbox_accrosssession]]の使用例として、アカウントのすべてのメールボックスとメッセージを、階層構造を維持したまま別のアカウントへコピーするには次のようにします。
+

          
+
#tabpage(codelang=cs,container-title=すべてのメールボックスを別のアカウントへコピーする例)
+
#code{{
+
using (ImapClient clientSource = new ImapClient(new Uri("imap://user@source.imap.example.net/")),
+
                  clientDest   = new ImapClient(new Uri("imap://user@dest.imap.example.net/"))) {
+
  // コピー元アカウントの最上位のメールボックスをすべて取得して列挙
+
  foreach (var mailboxSource in clientSource.GetMailboxes(ImapMailboxListOptions.TopLevelOnly)) {
+
    // コピー元メールボックスを、コピー先アカウントに同名でコピー
+
    // (コピー元メールボックスが階層を持つ場合は下位のメールボックスもコピーする)
+
    ImapClient.CopyMailbox(mailboxSource, clientDest, mailboxSource.Name, true);
+
  }
+
}
+
}}
+
#tabpage-end
+

          
+
なお、現在の実装では異なるImapClientから取得したImapMailboxInfoは、たとえそれが同一アカウントのメールボックスを表す場合でも''異なるアカウントのメールボックス''として扱われます。 同一のImapClientから取得したImapMailboxInfoのみが同一アカウントのメールボックスとして扱われる点に注意してください。
 

        

        
 

        

        
 
**機能別リファレンス [#operation_reference]
**機能別リファレンス [#operation_reference]