イベント ハンドラが、このイベントに関連するデータを含む、ImapUpdateEventArgs 型の引数を受け取りました。次の ImapUpdateEventArgs プロパティには、このイベントの固有の情報が記載されます。
以下のサンプルコードは、IdleメソッドとUpdateイベントの使用方法を示します。
/// <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