Compartir a través de


Modificar datos adjuntos de un mensaje de correo electrónico de Outlook

En este tema se explica cómo modificar mediante programación datos adjuntos de correo electrónico de Microsoft Outlook sin cambiar el archivo original.

Proporcionado por: Ken Getz, MCW Technologies, LLC

Enviar un mensaje de correo electrónico con uno o más archivos adjuntos es fácil, tanto en la interfaz de Outlook como mediante programación. En algunos casos, no obstante, puede que quiera modificar los datos adjuntos después de asociarlos al elemento de correo sin cambiar el archivo original en el sistema de archivos. En otras palabras, es posible que necesite acceso al contenido de los datos adjuntos de la memoria mediante programación.

Por ejemplo, imagine que la aplicación necesita convertir el texto de todos los datos adjuntos que tengan la extensión .txt en mayúsculas. En un complemento administrado de Outlook, puede controlar fácilmente el evento ItemSend . Realice el trabajo en ese evento antes de enviar el elemento de correo. La parte complicada del escenario es recuperar el contenido de los datos adjuntos para modificar el contenido de cada archivo de texto.

En el código de ejemplo de este tema se muestra cómo resolver este problema concreto mediante los métodos GetProperty(String) y SetProperty(String, Object) de la interfaz Attachment . En cada caso, se proporciona un valor que contiene la propiedad MAPI PidTagAttachDataBinary para obtener (y luego establecer) el contenido de los datos adjuntos.

Nota La representación del espacio de nombres de la propiedad PidTagAttachDataBinary es https://schemas.microsoft.com/mapi/proptag/0x37010102. Para obtener más información sobre cómo usar el objeto PropertyAccessor en las propiedades a las que hace referencia el espacio de nombres, vea Hacer referencia a propiedades por espacio de nombres.

El código de ejemplo controla el evento ItemSend de un elemento de correo. En el controlador de eventos personalizado, para cualquier dato adjunto que tenga una extensión .txt, el código llama al ConvertAttachmentToUpperCase método . ConvertAttachmentToUpperCase toma un objeto Attachment y un objeto MailItem como argumentos de entrada, recupera una matriz de bytes que se rellena con el contenido de los datos adjuntos, convierte la matriz de bytes en una cadena, convierte la cadena en mayúsculas y, a continuación, establece el contenido de los datos adjuntos en la cadena convertida como una matriz de bytes.

Los siguientes ejemplos de código administrado están escritos en C# y Visual Basic. Para ejecutar un ejemplo de código administrado de .NET Framework que necesita llamar un modelo de objetos componentes (COM), debe utilizar un ensamblado de interoperabilidad que defina y asigne interfaces administradas a los objetos COM de la biblioteca de tipos de modelos de objetos. Para Outlook, puede utilizar Visual Studio y el ensamblado de interoperabilidad primario (PIA) de Outlook. Antes de ejecutar ejemplos de código administrado para Outlook 2013, compruebe que tiene el PIA de Outlook 2013 instalado y que ha añadido una referencia al componente biblioteca de objetos de Microsoft Outlook 15.0 en Visual Studio.

Debe usar los siguientes ejemplos de código en la ThisAddIn clase de un complemento de Outlook (con Office Developer Tools para Visual Studio). El objeto Application del código debe ser un objeto Application de Outlook de confianza proporcionado por ThisAddIn.Globals. Si desea más información sobre el uso del PIA de Outlook para desarrollar soluciones de Outlook administradas, consulte Outlook 2013 Primary Interop Assembly Reference en MSDN.

El siguiente código muestra cómo modificar mediante programación un adjunto de correo electrónico de Outlook sin cambiar el archivo original. Para demostrar esta funcionalidad, en Visual Studio, cree un nuevo complemento administrado de Outlook denominado ModifyAttachmentAddIn. Sustituya el código de ThisAddIn.cs o ThisAddIn.vb por el código siguiente.

Nota Para tener acceso a los datos adjuntos, el elemento de correo debe guardarse mediante el método MailItem.Save .

using Outlook = Microsoft.Office.Interop.Outlook;
 
namespace ModifyAttachmentAddIn
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
        }
 
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
 
 
        void Application_ItemSend(object Item, ref bool Cancel)
        {
            Outlook.MailItem mailItem = Item as Outlook.MailItem;
 
            if (mailItem != null)
            {
                var attachments = mailItem.Attachments;
                // If the attachment a text file, convert its text to all uppercase.
                foreach (Outlook.Attachment attachment in attachments)
                {

                    ConvertAttachmentToUpperCase(attachment, mailItem);
                }
            }
        }
 
        private void ConvertAttachmentToUpperCase(Outlook.Attachment attachment, Outlook.MailItem mailItem)
        {
            const string PR_ATTACH_DATA_BIN =
                "https://schemas.microsoft.com/mapi/proptag/0x37010102";
 
            // Confirm that the attachment is a text file.
            if (System.IO.Path.GetExtension(attachment.FileName) == ".txt")
            {
                // There are other heuristics you could use to determine whether the 
                // the attachment is a text file. For now, keep it simple: Only
                // run this code for *.txt.
 
                // Retrieve the attachment as an array of bytes.
                var attachmentData =
                    attachment.PropertyAccessor.GetProperty(
                    PR_ATTACH_DATA_BIN);
 
                // Convert the byte array into a Unicode string.
                string data = System.Text.Encoding.Unicode.GetString(attachmentData);
                // Convert to upper case.
                data = data.ToUpper();
                // Convert the data back to an array of bytes.
                attachmentData = System.Text.Encoding.Unicode.GetBytes(data);
 
                //Set PR_ATTACH_DATA_BIN to attachmentData.
                attachment.PropertyAccessor.SetProperty(PR_ATTACH_DATA_BIN,
                    attachmentData);
            }
        }
 
        #region VSTO generated code
 
        /// <summary>
        /// Required method for Designer support - don't modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
 
        #endregion
    }
}
Public Class ThisAddIn
 
 
    Private Sub ThisAddIn_Startup() Handles Me.Startup
 
    End Sub
 
    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
 
    End Sub
 
    Private Sub Application_ItemSend(ByVal Item As Object, _
        ByRef Cancel As Boolean) Handles Application.ItemSend
 
        Dim mailItem As Outlook.MailItem = TryCast(Item, Outlook.MailItem)
 
        If mailItem IsNot Nothing Then
            Dim attachments = mailItem.Attachments
            For Each attachment As Outlook.Attachment In attachments
                ' If the attachment is a text file, convert to uppercase.
                ConvertAttachmentToUpperCase(attachment, mailItem)
            Next attachment
        End If
    End Sub
 
    Private Sub ConvertAttachmentToUpperCase(ByVal attachment As Outlook.Attachment, _
        ByVal mailItem As Outlook.MailItem)
        Const PR_ATTACH_DATA_BIN As String = "https://schemas.microsoft.com/mapi/proptag/0x37010102"
 
        ' Confirm that the attachment is a text file.
        If System.IO.Path.GetExtension(attachment.FileName) = ".txt" Then
 
            ' There are other heuristics you could use to determine whether the 
            ' the attachment is a text file. For now, keep it simple: Only
            ' run this code for *.txt.
 
            ' Retrieve the attachment as an array of bytes.
            Dim attachmentData = attachment.PropertyAccessor.GetProperty(PR_ATTACH_DATA_BIN)
 
            ' Convert the byte array into a Unicode string.
            Dim data As String = System.Text.Encoding.Unicode.GetString(attachmentData)
            ' Convert to upper case.
            data = data.ToUpper()
            ' Convert the data back to an array of bytes.
            attachmentData = System.Text.Encoding.Unicode.GetBytes(data)
 
            'Set PR_ATTACH_DATA_BIN to attachmentData.
            attachment.PropertyAccessor.SetProperty(PR_ATTACH_DATA_BIN, attachmentData)
         End If
    End Sub
 
End Class

Consulte también

Adjuntar un archivo a un elemento de correo

Adjuntar un elemento de contacto de Outlook a un mensaje de correo electrónico

Limitar el tamaño de los datos adjuntos de un mensaje de correo electrónico de Outlook

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.