Dart.Mail 名前空間 > Imap クラス : Update イベント |
<CategoryAttribute("Progress")> Public Event Update As EventHandler(Of ImapUpdateEventArgs)
[Category("Progress")] public event EventHandler<ImapUpdateEventArgs> Update
イベント ハンドラが、このイベントに関連するデータを含む、ImapUpdateEventArgs 型の引数を受け取りました。次の ImapUpdateEventArgs プロパティには、このイベントの固有の情報が記載されます。
プロパティ | 解説 |
---|---|
Messages | 更新の影響を受けるメッセージを表すImapMessageの配列を取得します。 |
Response | IMAPサーバーからの応答をカプセル化するImapResponseを取得します。 |
/// <summary> /// サーバー上のメッセージの現在の状態を反映して更新されるコレクション /// (ListView.Itemsコレクションなど)の代用として使用します。 /// </summary> Dictionary<string, ImapMessage> independentImapMessageCollection = new Dictionary<string, ImapMessage>(); private void button1_Click(object sender, EventArgs e) { // サーバーとアカウントの情報を設定します。 imap1.Session.RemoteEndPoint = new Dart.Mail.IPEndPoint(myServer, Imap.GetDefaultPort(imap1.Session)); imap1.Session.Username = myUsername; imap1.Session.Password = myPassword; // ワーカースレッドを開始します。 //This allows the function to execute without blocking the UI imap1.Start(listenForUpdates, null); } private void button2_Click(object sender, EventArgs e) { // サーバーとアカウントの情報を設定します。 smtp1.Session.RemoteEndPoint = new Dart.Mail.IPEndPoint(mySmtpServer, Smtp.GetDefaultPort(smtp1.Session)); smtp1.Session.Username = myUsername; smtp1.Session.Password = myPassword; // EXISTS更新をトリガーするためのメッセージを送信します。 smtp1.Send(myEmail, myEmail, "Test Message", "Test Message"); } private void listenForUpdates(object state) { // この関数はワーカースレッドで実行されます。 // 接続してアカウントにログインします。 imap1.Connect(); imap1.Authenticate(); // 現在のメールボックスをINBOXに設定します。 imap1.SelectedMailbox = imap1.Mailboxes["INBOX"]; // メールボックスにあるすべてのメッセージを取得します。 imap1.SelectedMailbox.Get(); // 取得したメッセージを、ImapMessageの独立したコレクションに追加します。 foreach (ImapMessage message in imap1.SelectedMailbox.ToArray()) independentImapMessageCollection.Add(message.Uid, message); // Idleを開始してサーバーからの新しい更新を待ちます。 imap1.Idle(); // クライアントが(別のスレッドで)サーバーとの通信を開始すると、Idle()は戻ります。 System.Diagnostics.Debug.WriteLine("DONE IDLING"); } private void imap1_Update(object sender, ImapUpdateEventArgs e) { switch (e.Response.Operation) { case "EXPUNGE": // 独立して実装されたコレクションからメッセージを削除します。 foreach (ImapMessage msg in e.Messages) independentImapMessageCollection.Remove(msg.Uid); break; case "EXISTS": // ワーカースレッドで新しいメッセージを取得します。 imap1.Start(getMessages, e.Messages); break; } } /// <summary> /// サーバーからクライアントに新しいメッセージの通知が届いたときに、それらのメッセージをダウンロードします(これにより、IDLEは中止されます)。 /// </summary> void getMessages(object msgs) { // これはワーカースレッドで実行されるので、UIメッセージは遮断されません。 // msgsをImapMessageの配列にキャストし戻します。 ImapMessage[] messages = msgs as ImapMessage[]; // サーバーから新しいメッセージを取得します。 This interrupts IDLE. imap1.SelectedMailbox.Get(messages, ImapMessageInfo.Message); // 独立コレクションを更新します。 foreach (ImapMessage message in messages) independentImapMessageCollection.Add(message.Uid, message); // Idleを再開してサーバーからの新しい更新を待ちます。 imap1.Idle(); // クライアントが(別のスレッドで)サーバーとの通信を開始すると、Idle()は戻ります。 System.Diagnostics.Debug.WriteLine("DONE IDLING"); }
''' <summary> ''' サーバー上のメッセージの現在の状態を反映して更新されるコレクション ''' (ListView.Itemsコレクションなど)の代用として使用します。 ''' </summary> Private independentImapMessageCollection As New Dictionary(Of String, ImapMessage)() Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click ' サーバーとアカウントの情報を設定します。 imap1.Session.RemoteEndPoint = New Dart.Mail.IPEndPoint(myServer, Imap.GetDefaultPort(imap1.Session)) imap1.Session.Username = myUsername imap1.Session.Password = myPassword ' ワーカースレッドを開始します。 ' これにより、UIをブロックせずに関数を実行できます。 imap1.Start(AddressOf listenForUpdates, Nothing) End Sub Private Sub button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button2.Click ' サーバーとアカウントの情報を設定します。 smtp1.Session.RemoteEndPoint = New Dart.Mail.IPEndPoint(mySmtpServer, Smtp.GetDefaultPort(smtp1.Session)) smtp1.Session.Username = myUsername smtp1.Session.Password = myPassword ' EXISTS更新をトリガーするためのメッセージを送信します。 smtp1.Send(myEmail, myEmail, "Test Message", "Test Message") End Sub Private Sub listenForUpdates(ByVal state As Object) ' この関数はワーカースレッドで実行されます。 ' 接続してアカウントにログインします。 imap1.Connect() imap1.Authenticate() ' 現在のメールボックスをINBOXに設定します。 imap1.SelectedMailbox = imap1.Mailboxes("INBOX") ' メールボックスにあるすべてのメッセージを取得します。 imap1.SelectedMailbox.Get() ' 取得したメッセージを、ImapMessageの独立したコレクションに追加します。 For Each message As ImapMessage In imap1.SelectedMailbox.ToArray() independentImapMessageCollection.Add(message.Uid, message) Next message ' Idleを開始してサーバーからの新しい更新を待ちます。 imap1.Idle() ' クライアントが(別のスレッドで)サーバーとの通信を開始すると、Idle()は戻ります。 System.Diagnostics.Debug.WriteLine("DONE IDLING") End Sub Private Sub imap1_Update(ByVal sender As Object, ByVal e As ImapUpdateEventArgs) Handles imap1.Update Select Case e.Response.Operation Case "EXPUNGE" ' 独立して実装されたコレクションからメッセージを削除します。 For Each msg As ImapMessage In e.Messages independentImapMessageCollection.Remove(msg.Uid) Next msg Case "EXISTS" ' ワーカースレッドで新しいメッセージを取得します。 imap1.Start(AddressOf getMessages, e.Messages) End Select End Sub ''' <summary> ''' サーバーからクライアントに新しいメッセージの通知が届いたときに、それらのメッセージをダウンロードします(これにより、IDLEは中止されます)。 ''' </summary> Private Sub getMessages(ByVal msgs As Object) ' これはワーカースレッドで実行されるので、UIメッセージは遮断されません。 ' msgsをImapMessageの配列にキャストし戻します。 Dim messages() As ImapMessage = TryCast(msgs, ImapMessage()) ' サーバーから新しいメッセージを取得します。 This interrupts IDLE. imap1.SelectedMailbox.Get(messages, ImapMessageInfo.Message) ' 独立コレクションを更新します。 For Each message As ImapMessage In messages independentImapMessageCollection.Add(message.Uid, message) Next message ' Idleを再開してサーバーからの新しい更新を待ちます。 imap1.Idle() ' クライアントが(別のスレッドで)サーバーとの通信を開始すると、Idle()は戻ります。 System.Diagnostics.Debug.WriteLine("DONE IDLING") End Sub