Compartir a través de


Adjuntar un elemento de contacto de Outlook a un mensaje de Email

En este tema se describe cómo puede adjuntar mediante programación una copia de un elemento de Microsoft Outlook, como un contacto, un elemento de calendario u otro mensaje de correo electrónico, a un mensaje de correo electrónico antes de enviar el mensaje.

Proporcionado por: Ken Getz, MCW Technologies, LLC

Para adjuntar uno o varios archivos o elementos de Outlook a un mensaje de correo, puede usar la propiedad Attachments del objeto MailItem que representa el correo saliente y llamar al método Add(Object, Object, Object, Object) del objeto Attachments para cada uno de los datos adjuntos. El método Add permite especificar el nombre de archivo y cómo desea asociar los datos adjuntos. Para adjuntar elementos de Outlook, como el elemento de contacto que se muestra en el código de ejemplo de este tema, especifique el parámetroType del método Add como el valor enumerado Outlook.olAttachmentType.olEmbeddedItem .

El SendMailItem procedimiento de ejemplo del ejemplo de código más adelante en este tema acepta lo siguiente:

  • Referencia al objeto Application de Outlook.

  • Cadenas que contienen el asunto y el cuerpo del mensaje.

  • Una lista genérica de cadenas que contienen las direcciones SMTP para los destinatarios del mensaje.

  • Una cadena que contiene la dirección SMTP del remitente.

Después de crear un nuevo elemento de correo, el código recorre en bucle todas las direcciones de destinatario y agrega cada una a la colección Recipients del mensaje. Una vez que el código llama al método ResolveAll() del objeto Recipients , establece las propiedades Subject y Body del elemento de correo. A continuación, el código crea un nuevo objeto ContactItem de Outlook y agrega este nuevo elemento de contacto como datos adjuntos al mensaje de correo, especificando el valor Outlook.olAttachmentType.olEmbeddedItem como parámetro a la llamada al método Add . Antes de enviar realmente el correo electrónico, debe especificar la cuenta desde la que se va a enviar el mensaje. Una técnica para encontrar esta información es usar la dirección SMTP del remitente. La GetAccountForEmailAddress función acepta una cadena que contiene la dirección de correo electrónico SMTP del remitente y devuelve una referencia para el objeto Account correspondiente. Este método compara la dirección SMTP del remitente con la dirección SmtpAddress para cada cuenta de correo electrónico configurada definida para el perfil de la sesión. application.Session.Accounts devuelve una colección Accounts para el perfil actual, haciendo un seguimiento de la información de todas las cuentas, entre ellas las cuentas de Exchange, IMAP y POP3, cada una de las cuales se puede asociar con un almacén de entrega diferente. El objeto Account que tiene un valor de propiedad SmtpAddress asociado que coincide con la dirección SMTP del remitente es la cuenta que se usa para enviar el mensaje de correo electrónico. Después de identificar la cuenta adecuada, el código se completa estableciendo la propiedad SendUsingAccount del elemento de correo en ese objeto Account y, a continuación, llamando al método Send(). 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. En el código siguiente se muestra cómo adjuntar mediante programación una copia de un elemento de contacto a un mensaje de correo. Para mostrar esta funcionalidad, en Visual Studio, cree un nuevo complemento administrado de Outlook denominado EmbedOutlookItemAddIny reemplace el contenido del archivo ThisAddIn.vb o ThisAddIn.cs por el código de ejemplo que se muestra aquí. Modifique el ThisAddIn_Startup procedimiento y actualice las direcciones de correo electrónico correctamente. La dirección SMTP incluida en la llamada al procedimiento SendMailWithAttachments debe corresponder a la dirección SMTP de una de las cuentas de correo electrónico saliente que configuró previamente en Outlook.

using System;
using System.Collections.Generic;
using Outlook = Microsoft.Office.Interop.Outlook;
 
namespace EmbedOutlookItemAddIn
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            List<string> recipients = new List<string>();
            recipients.Add("john@contoso.com");
            recipients.Add("john@example.com");
 
            // Replace the SMTP address for sending.
            SendMailItem(Application, "Outlook started", "Outlook started at " + 
                DateTime.Now, recipients, "john@contoso.com");
        }
 
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
 
        public void SendMailItem(Outlook.Application application, 
            string subject, string body, 
            List<string> recipients, string smtpAddress)
        {
 
            Outlook.MailItem newMail = 
                application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
 
            // Set up all the recipients.
            foreach (var recipient in recipients)
            {
                newMail.Recipients.Add(recipient);
            }
            if (newMail.Recipients.ResolveAll())
            {
                // Set the details.
                newMail.Subject = subject;
                newMail.Body = body;
 
                Outlook.ContactItem contact = (Outlook.ContactItem)(application.CreateItem
                    Outlook.OlItemType.olContactItem));
 
                // Create a new contact. Use an existing contact instead, 
                // if you have one to work with.
                contact.FullName = "Kim Abercrombie";
                contact.LastName = "Kim";
                contact.FirstName = "Abercrombie";
                contact.HomeTelephoneNumber = "555-555-1212";
                contact.Save();
 
                newMail.Attachments.Add(contact, Outlook.OlAttachmentType.olEmbeddeditem);
                newMail.SendUsingAccount = GetAccountForEmailAddress(application, smtpAddress);
                newMail.Send();
             }
          }
 
        public Outlook.Account GetAccountForEmailAddress(Outlook.Application application, 
            string smtpAddress)
        {
            // Loop over the Accounts collection of the current Outlook session.
            Outlook.Accounts accounts = application.Session.Accounts;
            foreach (Outlook.Account account in accounts)
            {
                // When the email address matches, return the account.
                if (account.SmtpAddress == smtpAddress)
                {
                    return account;
                }
             }
             // If you get here, no matching account was found.
             throw new System.Exception(string.Format("No Account with SmtpAddress: {0} exists!",
                 smtpAddress));
        }
    }
 
    #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
        Dim recipients As New List(Of String)
        recipients.Add("john@contoso.com")
        recipients.Add("john@example.com")
     
        ' Replace the SMTP address for sending.
        SendMailItem(Application, "Outlook started",
            "Outlook started at " & DateTime.Now, recipients,
            "john@contoso.com")
    End Sub
 
    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
 
    End Sub
 
    Private Sub SendMailItem(ByVal application As Outlook.Application, _
        ByVal subject As String, ByVal body As String, ByVal recipients As List(Of String), _
        ByVal smtpAddress As String)
 
        Dim newMail As Outlook.MailItem = _
            DirectCast(application.CreateItem(Outlook.OlItemType.olMailItem), _
            Outlook.MailItem)
 
        ' Set up all the recipients.
        For Each recipient In recipients
            newMail.Recipients.Add(recipient)
        Next
        If newMail.Recipients.ResolveAll() Then
          ' Set the details.
          newMail.Subject = subject
          newMail.Body = body
 
          Dim contact As Outlook.ContactItem =_
             DirectCast(application.CreateItem(
             Outlook.OlItemType.olContactItem), Outlook.ContactItem)
 
          ' Create a new contact. Use an existing contact instead, 
          ' if you have one to work with.
          contact.FullName = "Kim Abercrombie"
          contact.LastName = "Kim"
          contact.FirstName = "Abercrombie"
          contact.HomeTelephoneNumber = "555-555-1212"
          contact.Save()
 
          newMail.Attachments.Add(contact, Outlook.OlAttachmentType.olEmbeddeditem)
          newMail.SendUsingAccount = GetAccountForEmailAddress(application, smtpAddress)
          newMail.Send()
        End If
    End Sub
 
    Private Function GetAccountForEmailAddress(ByVal application As Outlook.Application,_
        ByVal smtpAddress As String) As Outlook.Account
        ' Loop over the Accounts collection of the current Outlook session.
        Dim accounts As Outlook.Accounts = application.Session.Accounts
        For Each account In accounts
            ' When the email address matches, return the account.
            If account.SmtpAddress = smtpAddress Then
                Return account
            End If
        Next
        ' If you get here, no matching account was found.
        Throw New System.Exception(_
            String.Format("No Account with SmtpAddress: {0} exists!", smtpAddress))
    End Function
End Class

Consulte también

Adjuntar un archivo a un elemento de correolimita el tamaño de los datos adjuntos a un mensaje de Outlook EmailModificar datos adjuntos de un mensaje Email 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.