GrapeCity Secure Mail for .NET 4.0J
Update イベント
使用例 

非請求データがサーバーから受信されたときに発生します。
シンタックス
<CategoryAttribute("Progress")>
Public Event Update As EventHandler(Of ImapUpdateEventArgs)
[Category("Progress")]
public event EventHandler<ImapUpdateEventArgs> Update
イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、ImapUpdateEventArgs 型の引数を受け取りました。次の ImapUpdateEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ解説
Messages 更新の影響を受けるメッセージを表すImapMessageの配列を取得します。
Response IMAPサーバーからの応答をカプセル化するImapResponseを取得します。
解説
このイベントは、選択したメールボックスのメッセージの数が変更されたときに発生します。
使用例
以下のサンプルコードは、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
参照

参照

Imap クラス
Imap メンバ

 

 


© 2003, GrapeCity inc. All rights reserved.