Select e-mail from list using UID

Visual Basic Code | ASP Code

This sample demonstrates using Unique-ID's (UID's) to reliably identify messages.

First section of the code (DisplayList procedure in Visual Basic sample and DisplayList.asp file in ASP sample) displays the list of all messages in the mailbox. Each item in the list corresponds to a message. For each message in the list, Unique-ID value is remembered.

Second section of the code (DisplayEmail procedure in Visual Basic sample and DisplayEmail.asp file in ASP sample) displays body of the message, given its Unique-ID value.

Visual Basic sample also assumes the application's main form contains List1 control of ListBox class.
Since Unique-ID values persist accross sessions, they are often more reliable way to identify messages on the mail server.

Persisting of Unique-ID values is especially important in web environments where multiple users can simultaneously access shared mail account. Assume the following scenario:
  • Bob requests message list of the shared mailbox to be displayed and sees something interesting in the subject of e-mail #3
  • Alice deletes e-mail #2 in the shared mailbox. Message numbers starting from #3 shift by -1, i.e. e-mail #3 becomes e-mail #2, e-mail #4 becomes e-mail #3, etc.
  • Bob requests message #3 to be displayed. However, the message expected by Bob is e-mail #2 now, i.e. message list went out of sync. Bob actually receives message next to the one he is interested in
The scenario above would not be a problem when using Unique-IDs since their values never shift. They are tightly linked to the messages.

[Visual Basic]:

' IMAP4 object
Dim objIMAP4

' Stores Unique-ID for each message in the Inbox
Dim arrUIDs

' Connects to server, logs in email account
' and selects Inbox.
' Returns True if succeeded, otherwise False
Function GetInbox()
  GetInbox = False

  ' Set IMAP4 server name
  objIMAP4.ServerName = "mail.server.com"

  ' Set user credentials
  objIMAP4.UserName = "username"
  objIMAP4.Password = "password"

  ' Connect to the server and
  ' log in email account
  If objIMAP4.Connect Then
    ' Select Inbox folder
    If objIMAP4.SelectMailbox("Inbox") Then
      ' Successully logged in and selected Inbox
      GetInbox = True
    Else
      ' Display error information
      MsgBox "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  Else
    ' Display error information
    MsgBox "Error #" & objIMAP4.ErrCode
    MsgBox "Server response: " & objIMAP4.ServerResponse
  End If
End Function

' Fills ListBox control with "Subject:" field
' of each message in the Inbox and remembers
' Unique-ID's of all messages in arrUIDs array
Sub DisplayList()
  Dim objEnvelopes, objEnvelope

  ' Try to login
  If GetInbox Then

    ' Fill array with Unique-ID values of all
    ' messages in the mailbox
    arrUIDs = objIMAP4.Search(True)

    ' Get envelopes for all messages in the Inbox
    Set objEnvelopes = objIMAP4.RetrieveEnvelopes(1, objIMAP4.MessageCount, False)

    If Not objIMAP4.IsError Then
      For Each objEnvelope In objEnvelopes
        ' Add each message's "Subject:" to ListBox
        List1.AddItem objEnvelope.Subject
      Next
    Else
      ' Display error information
      MsgBox "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  End If

  ' Disconnect if needed
  If objIMAP4.Connected Then
    objIMAP4.Disconnect
  End If
End Sub

' Display body of an e-mail when this e-mail's
' "Subject:" is clicked in List1 control
Private Sub List1_Click()
  Dim objMsg
  
  ' Try to login
  If GetInbox Then

    ' Get message by Unique-ID stored in arrUIDs array
    Set objMsg = objIMAP4.RetrieveSingleMessage(arrUIDs(List1.ListIndex + 1), True)

    If Not objIMAP4.IsError Then
      ' Display message body
      MsgBox objMsg.BodyText
    Else
      ' Display error information
      MsgBox "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  End If

  ' Disconnect if needed
  If objIMAP4.Connected Then
    objIMAP4.Disconnect
  End If
End Sub

' Display message list on application start
Private Sub Form_Load()

  ' Create and unlock IMAP4 object
  Set objIMAP4 = CreateObject("MailBee.IMAP4")
  objIMAP4.LicenseKey = "put your license key here"

  ' Display messages' subjects and remember messages' Unique-ID's
  DisplayList
End Sub

[ASP]:

DisplayList.asp:

<%
Dim objIMAP4, objEnvelopes, I

' Connects to server, logs in email account
' and selects Inbox.
' Returns True if succeeded, otherwise False.
'
' This function is duplicated in both ASP files.
' In production code, it's better to move duplicates
' into single include file.
Function GetInbox()
  GetInbox = False

  ' Set IMAP4 server name
  objIMAP4.ServerName = "mail.server.com"

  ' Set user credentials
  objIMAP4.UserName = "username"
  objIMAP4.Password = "password"

  ' Connect to the server and
  ' log in email account
  If objIMAP4.Connect Then
    ' Select Inbox folder
    If objIMAP4.SelectMailbox("Inbox") Then
      ' Successully logged in and selected Inbox
      GetInbox = True
    Else
      ' Display error information
      Response.Write "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  Else
    ' Display error information
    Response.Write "Error #" & objIMAP4.ErrCode & "<br>"
    Response.Write "Server response: " & objIMAP4.ServerResponse
  End If
End Function

' Create and unlock IMAP4 object
Set objIMAP4 = CreateObject("MailBee.IMAP4")
objIMAP4.LicenseKey = "put your license key here"

' Try to login
If GetInbox Then

  ' Fill array with Unique-ID values of all
  ' messages in the mailbox
  arrUIDs = objIMAP4.Search(True)

  If Not objIMAP4.IsError Then
    ' Get envelopes for all messages in the Inbox
    Set objEnvelopes = objIMAP4.RetrieveEnvelopes(1, objIMAP4.MessageCount, False)

    If Not objIMAP4.IsError Then
      For I = 1 To objEnvelopes.Count
        ' Print each e-mail's "Subject:" in the form of
        ' "A HREF" link that points to DisplayEmail.asp with UID parameter
        ' set to Unique-ID of the e-mail
        Response.Write "<a href='DisplayEmail.asp?uid=" & arrUIDs(I) & "'>" & objEnvelopes(I).Subject & "</a><br>"
      Next
    Else
      ' Display error information
      Response.Write "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  Else
    ' Display error information
    Response.Write "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
  End If
End If

' Disconnect if needed
If objIMAP4.Connected Then
  objIMAP4.Disconnect
End If
%>




DisplayEmail.asp:

<%
Dim objIMAP4, objMsg, I

' Connects to server, logs in email account
' and selects Inbox.
' Returns True if succeeded, otherwise False.
'
' This function is duplicated in both ASP files.
' In production code, it's better to move duplicates
' into single include file.
Function GetInbox()
  GetInbox = False

  ' Set IMAP4 server name
  objIMAP4.ServerName = "mail.server.com"

  ' Set user credentials
  objIMAP4.UserName = "username"
  objIMAP4.Password = "password"

  ' Connect to the server and
  ' log in email account
  If objIMAP4.Connect Then
    ' Select Inbox folder
    If objIMAP4.SelectMailbox("Inbox") Then
      ' Successully logged in and selected Inbox
      GetInbox = True
    Else
      ' Display error information
      Response.Write "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
    End If
  Else
    ' Display error information
    Response.Write "Error #" & objIMAP4.ErrCode & "<br>"
    Response.Write "Server response: " & objIMAP4.ServerResponse
  End If
End Function

' Create and unlock IMAP4 object
Set objIMAP4 = CreateObject("MailBee.IMAP4")
objIMAP4.LicenseKey = "put your license key here"

' Try to login
If GetInbox Then

  ' Get message by Unique-ID taken from Request variable
  Set objMsg = objIMAP4.RetrieveSingleMessage(Request.QueryString("uid"), True)

  If Not objIMAP4.IsError Then
      ' Display message body
      Response.Write objMsg.BodyText
  Else
    ' Display error information
    Response.Write "Error #" & objIMAP4.ErrCode & ", " & objIMAP4.ErrDesc
  End If
End If

' Disconnect if needed
If objIMAP4.Connected Then
  objIMAP4.Disconnect
End If
%>
See Also:
Envelope.UID Property

 


Send feedback to AfterLogic
Copyright � 2002-2022, AfterLogic Corporation. All rights reserved.