Idle Method


Switches the connection with the server in IDLE mode when the server itself can send notifications to the client about new events.

You can use this method to receive notifications from the server about new messages, changes of message status, and so on without constant polling the mailbox. The server, however, must support IDLE extension.

Prior to calling this method, you should subscribe to OnStatusChange and OnIdle events and set EnableEvents=True. OnStatusChange will raise each time the server sends a notification. OnIdle will raise each 10 milliseconds. Usually, your code will immediately set some flag to False in OnStatusChange event hanlder when a notification arrives from the server. Then, your OnIdle event handler will check this flag and set Proceed argument of the event handler function to False. This will be a signal for Idle method to stop. Then, after you finish processing the mailbox (e.g. download new messages), you can call Idle again.

To avoid disconnecting from the server due to inactivity, it's recommended to re-issue Idle every 10-20 minutes (i.e. set Proceed to False in OnIdle event handler and then call Idle in the main code again). You can remember calculate time elapsed with a timer or rely on the fact that OnIdle event is called every 10 milliseconds (although this is not precise, this is usually not a concern).

This method also updates values of MessageCount and RecentCount properties.

Due to the nature of this method, it can only be used with EnableEvents=True. ASP applications cannot use this too because an ASP page should execute as quickly as possible. Keeping connection for a long time in an ASP application is strongly discouraged.


blnResult = ObjectName.Idle  
Parameters: None 
Return value As Boolean True if successful, False if error has occurred (usually connection failure or IDLE not supported)  
Remarks: IDLE extensions may not be supported by some IMAP servers.

Usage example:

' MailBee.dll must be referenced in Project/References (we need this in order to use events),
' and two buttons must be placed on the form: CommandStart and CommandFinish

' You must declare these variables in the beginning of your VB6 form code
Dim WithEvents IMAP As MailBee.IMAP4
Dim Idling As Boolean
Dim Done As Boolean
Dim GotNews As Boolean
Dim IdleCounter As Long

' Connects to the server and starts idling. Note: nothing will happen until the mailbox
' state changes during idling (such as new messages arrive or old messages change their status).
Private Sub CommandStart_Click()
  Set IMAP = CreateObject("MailBee.IMAP4")
  IMAP.EnableEvents = True

  ' Enable logging for troubleshooting
  IMAP.EnableLogging = True
  IMAP.LogFilePath = "imap4_log.txt"
  IMAP.ClearLog

  Done = False
  GotNews = False
  Idling = False
  IMAP.LicenseKey = "put your license key here"
  If IMAP.Connect("mail.server.com", 143, "jdoe", "password") Then
    If IMAP.SelectMailbox("Inbox") Then
    While Not Done
      Idling = True
      IdleCounter = 0
      If IMAP.Idle Then ' This method call will last for 10 minutes or so unless a notification from the server arrives
        Idling = False
        If GotNews Then
          ' Download new messages or whatever you want (here, we just display the number of recent messages)
          MsgBox IMAP.RecentCount
          GotNews = False
        End If
      Else
        Idling = False
        Done = True
        MsgBox "IDLE failed"
      End If
    Wend
    End If
    IMAP.Disconnect
    MsgBox "Idling finished"
  End If
End Sub

' OnStatusChange fires every time the server sends a notification (regardless if IDLE mode is active or not)
Private Sub IMAP_OnStatusChange(ByVal EventCode As Long, ByVal Message As Long, ByVal Value As Long, Proceed As Boolean)
    If Idling Then ' We check Idling to remember only those notifications which occurred during idling
       GotNews = True
    End If
End Sub

' Stop Idle method if got notification or timeout elapsed (approx. 10 minutes) or user says "Done!"
Private Sub IMAP_OnIdle(Proceed As Boolean)
    If GotNews Or Done Or IdleCounter > 60000 Then Proceed = False
    IdleCounter = IdleCounter + 1
End Sub

' Place a button named Finish to the form. You'll click it to finish idling
Private Sub CommandFinish_Click()
    Done = True
End Sub

' Make sure the application won't hang if the user closes it without clicking Finish button
Private Sub Form_Unload(Cancel As Integer)
  If Not (IMAP Is Nothing) Then IMAP.Abort
End Sub

See Also:

EnableEvents Property
MessageCount Property
RecentCount Property

OnStatusChange Event


Copyright © 2002-2024, AfterLogic Corporation. All rights reserved.