Share via


How to: Copy an E-Mail Message Using a Custom Menu Command

This example creates the command Copy to Picnic Folder on an e-mail item's shortcut menu if the e-mail message has Picnic in the Subject field. When the user clicks Copy to Picnic Folder, the code creates a copy of the e-mail message and moves it to the Picnic folder.

Applies to: The information in this topic applies to application-level projects for Outlook 2007 and Outlook 2010. For more information, see Features Available by Office Application and Project Type.

Example

Dim WithEvents explorer As Outlook.Explorer = Nothing
Const FOLDER_NAME As String = "Picnic"
Dim selectedItems As New System.Collections.ArrayList()

Private Sub ThisAddIn_Startup(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Startup
    explorer = Me.Application.Explorers.Application.ActiveExplorer
    AddHandler explorer.SelectionChange, _
    AddressOf explorer_SelectionChange
End Sub

Private Sub explorer_SelectionChange() _
    Handles explorer.SelectionChange

    selectedItems.Clear()

    For Each selectedItems As Object In explorer.Selection

        Dim mailItem As Outlook.MailItem = _
            TryCast(selectedItems, Outlook.MailItem)

        If (mailItem IsNot Nothing) Then
            If mailItem.Subject.Contains(FOLDER_NAME) Then
                Dim newAction As Outlook.Action = _
                mailItem.Actions(String.Format _
                ("Copy to {0} Folder", FOLDER_NAME))
                If (newAction Is Nothing) Then
                    newAction = mailItem.Actions.Add()
                    newAction.Name = String.Format _
                        ("Copy to {0} Folder", FOLDER_NAME)
                    newAction.ShowOn = _
                        Outlook.OlActionShowOn.olMenu
                    newAction.Enabled = True
                    mailItem.Save()
                End If
                AddHandler mailItem.CustomAction, _
                    AddressOf mailItem_CustomAction
            End If
        End If
    Next
End Sub

Private Sub mailItem_CustomAction(ByVal Action As Object, _
    ByVal Response As Object, ByRef Cancel As Boolean)
    Try
        Dim mailAction As Outlook.Action = _
            CType(Action, Outlook.Action)

        ' Get the current selection from the explorer and 
        ' copy it to the FOLDER_NAME folder 
        Select Case mailAction.Name
            Case String.Format("Copy to {0} Folder", FOLDER_NAME)
                Dim mailItem As Outlook.MailItem = _
                    TryCast(explorer.Selection(1),  _
                    Outlook.MailItem)
                Dim mailItemCopy As Outlook.MailItem = _
                TryCast(mailItem.Copy, Outlook.MailItem)

                Dim inbox As Outlook.MAPIFolder = _
                    Me.Application.GetNamespace("MAPI"). _
                    GetDefaultFolder( _
                    Outlook.OlDefaultFolders.olFolderInbox)

                Dim folder As Outlook.MAPIFolder = Nothing

                ' If the folder does not exist, create it.
                Try
                    folder = inbox.Folders(FOLDER_NAME)
                Catch ex As  _
                    System.Runtime.InteropServices.COMException
                    '  This exception is thrown 
                    '  when the folder is not found.
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try

                If (folder Is Nothing) Then
                    folder = inbox.Folders.Add(FOLDER_NAME, _
                        Outlook.OlDefaultFolders.olFolderInbox)
                End If

                mailItemCopy.Move(folder)
                ' Do not display the inspector object.
                Cancel = True
        End Select
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Outlook.Explorer explorer = null;
private const string FOLDER_NAME = "Picnic";

System.Collections.ArrayList selectedItems = new
    System.Collections.ArrayList();

private void ThisAddIn_Startup(object sender,
    System.EventArgs e)
{
    explorer = this.Application.Explorers.Application.ActiveExplorer();
    explorer.SelectionChange += new Outlook.
        ExplorerEvents_10_SelectionChangeEventHandler
        (explorer_SelectionChange);
}

void explorer_SelectionChange()
{
    selectedItems.Clear();

    foreach (object selectedItem in explorer.Selection)
    {
        Outlook.MailItem mailItem = selectedItem as Outlook.MailItem;

        if (mailItem != null)
        {
            if (mailItem.Subject.Contains(FOLDER_NAME))
            {
                Outlook.Action newAction = mailItem.Actions[
                    string.Format("Copy to {0} Folder", FOLDER_NAME)];

                if (newAction == null)
                {
                    newAction = mailItem.Actions.Add();
                    newAction.Name = string.Format
                        ("Copy to {0} Folder", FOLDER_NAME);
                    newAction.ShowOn =
                        Outlook.OlActionShowOn.olMenu;
                    newAction.Enabled = true;
                    mailItem.Save();
                }

                mailItem.CustomAction += new Outlook.
                    ItemEvents_10_CustomActionEventHandler
                    (mailItem_CustomAction);

                selectedItems.Add(mailItem);
            }
        }
    }
}

void mailItem_CustomAction(object Action, object Response,
    ref bool Cancel)
{
    try
    {
        Outlook.Action mailAction = (Outlook.Action)Action;
        // Get the current selection from the explorer and 
        // copy it to the FOLDER_NAME folder 
        switch (mailAction.Name)
        {
            case "Copy to " + FOLDER_NAME + " Folder":
                Outlook.MailItem mailItem =
                    explorer.Selection[1] as Outlook.MailItem;
                Outlook.MailItem mailItemCopy =
                    mailItem.Copy() as Outlook.MailItem;

                Outlook.MAPIFolder inbox =
                    this.Application.GetNamespace("MAPI").GetDefaultFolder
                    (Outlook.OlDefaultFolders.olFolderInbox);
                Outlook.MAPIFolder folder = null;

                // If the folder does not exist, Create it.
                try
                {
                    folder = inbox.Folders[FOLDER_NAME];
                }
                catch (System.Runtime.InteropServices.COMException)
                {
                    // This exception is thrown when the folder is not found.
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                if (folder == null)
                {
                    folder = inbox.Folders.Add(FOLDER_NAME,
                        Outlook.OlDefaultFolders.olFolderInbox);
                }

                mailItemCopy.Move(folder);
                // Do not display the inspector object.
                Cancel = true;
                break;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

See Also

Concepts

Working with Mail Items

Getting Started Programming Application-Level Add-Ins