The procedure documented in this section first demonstrates the old way to copy message properties using the Messages collection's Add method, and then demonstrates how to take advantage of the newer CopyTo method of the Message object.
Note With versions of CDO Library previous to 1.1, the Message object's Sender property and other read-only properties of the Message object were not preserved during the first part of the procedure in this section. To preserve these properties using the old procedure, you had to append their text fields to read/write properties, such as the Message object's Text property.
With the CopyTo method, every property that is set on a Message object is automatically copied to the new Message object, regardless of whether it has read-only or read/write access. The access capability of every property is also preserved across the copy.
– Or –
Call the source Message object's CopyTo method.
The hierarchy of objects is as follows:
Session object
Folder object (Inbox or Outbox)
Messages collection
Message object
InfoStores collection
InfoStore object
Folder object
Messages collection
Message object
To obtain the source message that you want to copy, first obtain its folder, then obtain the message within the folder's Messages collection. For more information about finding messages, see Searching for a Message.
To obtain the destination folder, you can use the following approaches:
For more information about finding folders, see Searching for a Folder.
The following example copies the first two messages in the given folder to the Inbox. They could as easily be copied to any folder with a known identifier and therefore accessible using the Session object's GetFolder method. The example uses the old procedure to copy the first message and the new CopyTo method to copy the second.
This code fragment assumes that the application has already created the Session object variable objSession and successfully called the Session object's Logon method, as described in Starting a CDO Session.
'/********************************/
' Function: Util_CopyMessage
' Purpose: Utility functions that demonstrates code to copy a message
' See documentation topic: Copying A Message To Another Folder
Function Util_CopyMessage()
' obtain the source messages to copy
' for this sample, just copy the first two messages to the Inbox
' assume session object already created, validated, and logged on
Dim objMsgColl As Messages ' given folder's Messages collection
Dim objThisMsg As Message ' original message from given folder
Dim objInbox As Folder ' destination folder is Inbox
Dim objCopyMsg As Message ' new message that is the copy
Dim objOneRecip As Recipient ' single message recipient being copied
Dim strRecipName As String ' recipient name from original message
Dim i As Integer ' loop counter
On Error GoTo error_olemsg
If objGivenFolder Is Nothing Then
MsgBox "Must supply a valid folder"
Exit Function
End If
Set objMsgColl = objGivenFolder.Messages ' to be reused later
' ( ... then validate the Messages collection before proceeding ... )
Set objThisMsg = objMsgColl.GetFirst() ' filter parameter not needed
If objThisMsg Is Nothing Then
MsgBox "No valid messages in given folder"
Exit Function
End If
' Get Inbox as destination folder
Set objInbox = objSession.Inbox
If objInbox Is Nothing Then
MsgBox "Unable to open Inbox"
Exit Function
Else
MsgBox "Copying first message to Inbox"
End If
' Copy first message using old procedure
Set objCopyMsg = objInbox.Messages.Add _
(Subject:=objThisMsg.Subject, _
Text:=objThisMsg.Text, _
Type:=objThisMsg.Type, _
Importance:=objThisMsg.Importance)
If objCopyMsg Is Nothing Then
MsgBox "Unable to create new message in Inbox"
Exit Function
End If
' Copy all the recipients
For i = 1 To objThisMsg.Recipients.Count Step 1
strRecipName = objThisMsg.Recipients.Item(i).Name
If strRecipName <> "" Then
Set objOneRecip = objCopyMsg.Recipients.Add
If objOneRecip Is Nothing Then
MsgBox "Unable to create recipient in message copy"
Exit Function
End If
objOneRecip.Name = strRecipName
End If
Next i
' Copy other properties; a few listed here as an example
objCopyMsg.Sent = objThisMsg.Sent
objCopyMsg.Text = objThisMsg.Text
objCopyMsg.Unread = objThisMsg.Unread
' Update new message so all changes are saved in MAPI system
objCopyMsg.Update
' If MOVING a message to another folder, delete the original message:
' objThisMsg.Delete
' Move operation implies that the original message is removed
' Now copy second message using new procedure
Set objThisMsg = objMsgColl.GetNext ()
' ( ... then validate the second message before proceeding ... )
Set objCopyMsg = objThisMsg.CopyTo (objInbox.ID)
' Then Update and we're done
objCopyMsg.Update
Exit Function
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
Exit Function ' so many steps to succeed; just exit on error
End Function
Note that the old procedure does not preserve all message properties. The CopyTo method copies all properties with their values and access capabilities (read-only or read/write) unchanged.
Moving a Message to Another Folder