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

Applies to

The information in this topic applies only to the specified Visual Studio Tools for Office projects and versions of Microsoft Office.

Project type

  • Application-level projects

Microsoft Office version

  • Outlook 2003

  • Outlook 2007

For more information, see Features Available by Application and Project Type.

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.

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
                    MessageBox.Show(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
        MessageBox.Show(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