Compartilhar via


Anexar um arquivo a uma menagem de email do Outlook

Este tópico descreve como anexar programaticamente um ou mais arquivos a uma mensagem de email de saída no Microsoft Outlook.

Fornecido por: Ken Getz, MCW Technologies, LLC

Suporte de modelo de objeto para anexos

No Outlook, a propriedade Anexos do objeto MailItem dá suporte à anexação de um ou mais arquivos a uma mensagem de email. Para anexar um ou mais arquivos a um item de email antes de enviar o item, você chama o método Add(Object, Object, Object, Object) do objeto Attachments para cada um dos arquivos de anexo. O método Add permite especificar o nome do arquivo (o parâmetroSource) e o tipo de anexo (parâmetro TheType) usando a enumeração OlAttachmentType . Para arquivos no sistema de arquivos, especifique o parâmetroType como o valor enumerado Outlook.olAttachmentType.olByValue .

Nota Desde o Microsoft Office Outlook 2007, você sempre usaria esse valor para anexar uma cópia de um arquivo no sistema de arquivos; O Outlook.olAttachmentType.olByReference não tem mais suporte.

Além disso, quando você envia um email no RTF (Rich Text Format), também é possível especificar dois outros parâmetros opcionais: Posição eDisplayName quando você chama o método Add . O parâmetro ThePosition permite especificar a posição no email em que o anexo deve ser exibido. Use um dos seguintes valores para o parâmetroPosition:

  • O valor 0 oculta o anexo no corpo do email.

  • O valor 1 posiciona o anexo antes do primeiro caractere.

  • Um número maior do que o número de caracteres no corpo do item de email posiciona o anexo ao final do texto do corpo.

Para mensagens de email RTF, você também pode especificar o parâmetro DisplayName, que fornece o nome exibido no corpo da mensagem para o anexo. Para mensagens de email de texto sem formatação ou HTML, o anexo só exibe o nome do arquivo.

Enviando uma mensagem com arquivos como anexos

O SendEmailWithAttachments procedimento de exemplo no exemplo de código posteriormente neste tópico aceita o seguinte:

  • Uma referência ao objeto aplicativo do Outlook.

  • Cadeias de caracteres que contenham o assunto e o corpo da mensagem.

  • Uma lista genérica de cadeias de caracteres que contenha uma lista dos endereços SMTP para destinatários da mensagem.

  • Uma cadeia de caracteres que contenha o endereço SMTP do remetente.

  • Uma lista genérica de cadeias de caracteres que contenha os caminhos para os arquivos a serem anexados.

Depois de criar um novo item de email, o código adiciona cada destinatário à propriedade de coleção Destinatários do item de email. Depois que o código chama o método ResolveAll(), ele define as propriedades Assunto e Corpo do item de email antes de fazer loop por cada item na lista fornecida de caminhos de anexo, adicionando cada um à propriedade Anexos do item de email.

Antes de realmente enviar o email, você deverá especificar a conta da qual a mensagem de email será enviada. Uma técnica para descobrir essa informação é ver o endereço SMTP do remetente. A GetAccountForEmailAddress função aceita uma cadeia de caracteres que contém o endereço de email SMTP do remetente e retorna uma referência para o objeto Conta correspondente. Esse método compara o endereço SMTP do remetente com a propriedade SmtpAddress para cada conta de email configurada definida para o perfil da sessão. application.Session.Accounts retorna uma coleção Contas para o perfil atual, acompanhando informações de todas as contas, incluindo contas Exchange, IMAP e POP3, cada uma das quais pode ser associada a um repositório de entrega diferente. O objeto Account com um valor de propriedade SmtpAddress associado que corresponder ao endereço SMTP do remetente será a conta a ser usada no envio da mensagem de email.

Depois de identificar a conta apropriada, o código é concluído definindo a propriedade SendUsingAccount do item de email para esse objeto Account e chamando o método Send().

The following managed code samples are written in C# and Visual Basic. To run a .NET Framework managed code sample that needs to call into a Component Object Model (COM), you must use an interop assembly that defines and maps managed interfaces to the COM objects in the object model type library. For Outlook, you can use Visual Studio and the Outlook Primary Interop Assembly (PIA). Before you run managed code samples for Outlook 2013, ensure that you have installed the Outlook 2013 PIA and have added a reference to the Microsoft Outlook 15.0 Object Library component in Visual Studio. Você deve usar os exemplos de código a ThisAddIn seguir na classe de um suplemento do Outlook (usando ferramentas de desenvolvedor do Office para Visual Studio). The Application object in the code must be a trusted Outlook Application object provided by ThisAddIn.Globals. For more information about using the Outlook PIA to develop managed Outlook solutions, see the Outlook 2013 Primary Interop Assembly Reference on MSDN.

O código a seguir mostra como anexar arquivos programaticamente a uma mensagem de email de saída no Outlook. Para demonstrar essa funcionalidade, no Visual Studio, crie um novo suplemento gerenciado do Outlook chamado AttachFileAddIn, e substitua o conteúdo do arquivo ThisAddIn.vb ou ThisAddIn.cs pelo código de exemplo mostrado aqui. Modifique o ThisAddIn_Startup procedimento para incluir uma referência a um arquivo em seu sistema de arquivos e atualize os endereços de email adequadamente. O endereço SMTP incluído na chamada para o SendMailWithAttachments procedimento deve corresponder ao endereço SMTP de uma das contas de email de saída que você configurou anteriormente no Outlook.

using System.Collections.Generic;
using Outlook = Microsoft.Office.Interop.Outlook;
 
namespace AttachFileAddIn
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            List<string> attachments = new List<string>();
            attachments.Add("c:\\somefile.txt");
 
            List<string> recipients = new List<string>();
            recipients.Add("john@contoso.com");
            recipients.Add("john@example.com");
            SendEmailWithAttachments(Application, "Test", "Body", recipients, "john@example.com", 
              attachments);
        }
 
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
 
        private void SendEmailWithAttachments(Outlook.Application application, 
            string subject, string body, List<string> recipients, 
            string smtpAddress, List<string> attachments)
        {
 
            // Create a new MailItem and set the To, Subject, and Body properties.
            var 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())
            {
                newMail.Subject = subject;
                newMail.Body = body;
                foreach (string attachment in attachments)
                {
                    newMail.Attachments.Add(attachment, Outlook.OlAttachmentType.olByValue);
                }
            }
 
            // Retrieve the account that has the specific SMTP address.
            Outlook.Account account = GetAccountForEmailAddress(application, smtpAddress);
            // Use this account to send the email.
            newMail.SendUsingAccount = account;
            newMail.Send();
        }
 
        private 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 attachments As New List(Of String)
        attachments.Add("c:\somefile.txt")
 
        Dim recipients As New List(Of String)
        recipients.Add("john@contoso.com")
        recipients.Add("john@example.com")
        SendEmailWithAttachments(Application, "Test", "Body", recipients, "john@contoso.com", attachments)
    End Sub
 
    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
 
    End Sub
 
    Private Sub SendEmailWithAttachments(ByVal application As Outlook.Application, _
        ByVal subject As String, ByVal body As String,
        ByVal recipients As List(Of String),
        ByVal smtpAddress As String,
        ByVal attachments As List(Of String))
 
        ' Create a new MailItem and set the To, Subject, and Body properties.
        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
            newMail.Subject = subject
            newMail.Body = body
            For Each attachment As String In attachments
                newMail.Attachments.Add(attachment, Outlook.OlAttachmentType.olByValue)
            Next
        End If
 
        ' Retrieve the account that has the specific SMTP address.
        Dim account As Outlook.Account = GetAccountForEmailAddress(application, smtpAddress)
        ' Use this account to send the email.
        newMail.SendUsingAccount = account
        newMail.Send()
    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

Confira também

Anexar um item de contato do Outlook a uma mensagem de EmailLimitar o tamanho de um anexo a uma mensagem do Outlook EmailModificar um anexo de uma mensagem de Email do Outlook

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.