Присоединение элемента контакта Outlook к сообщению Email

В этом разделе описывается, как программным способом прикрепить копию элемента Microsoft Outlook, например контакта, элемента календаря или другого сообщения электронной почты, к сообщению электронной почты перед отправкой сообщения.

Предоставляется: Кен Гетц, MCW Technologies, LLC

Чтобы вложить один или несколько файлов или элементов Outlook в почтовое сообщение, можно использовать свойство Attachments объекта MailItem , представляющего исходящую почту, и вызвать метод Add(Object, Object, Object, Object) объекта Attachments для каждого из вложений. Метод Add позволяет указать имя файла и способ связывания вложения. Чтобы присоединить элементы Outlook, например элемент контакта, показанный в примере кода для этого раздела, укажите параметрType метода Add в качестве перечисленного значения Outlook.olAttachmentType.olEmbeddedItem .

Пример SendMailItem процедуры в примере кода далее в этом разделе принимает следующее:

  • Ссылка на объект Приложения Outlook.

  • Строки, содержащие тему и текст сообщения.

  • Универсальный список строк, содержащих SMTP-адреса для получателей сообщения.

  • Строка, содержащая SMTP-адрес отправителя.

После создания нового почтового элемента код циклически просматривает все адреса получателей, добавляя каждый из них в коллекцию Recipients сообщения. Когда код вызывает метод ResolveAll() объекта Recipients , он задает свойства Subject и Body почтового элемента. Затем код создает новый объект Outlook ContactItem и добавляет этот новый элемент контакта в качестве вложения в почтовое сообщение, указав значение Outlook.olAttachmentType.olEmbeddedItem в качестве параметра для вызова метода Add . Перед отправкой сообщения электронной почты необходимо указать учетную запись, из которой будет отправлено сообщение электронной почты. Одним из способов поиска этих сведений является использование SMTP-адреса отправителя. Функция GetAccountForEmailAddress принимает строку, содержащую SMTP-адрес электронной почты отправителя, и возвращает ссылку на соответствующий объект Account . Этот метод сравнивает SMTP-адрес отправителя с smtpAddress для каждой настроенной учетной записи электронной почты, определенной для профиля сеанса. application.Session.Accounts возвращает коллекцию учетных записей для текущего профиля, отслеживающую сведения обо всех учетных записях, включая учетные записи Exchange, IMAP и POP3, каждая из которых может быть связана с другим хранилищем доставки. Объект Account , имеющий связанное значение свойства SmtpAddress , соответствующее SMTP-адресу отправителя, является учетной записью, используемой для отправки сообщения электронной почты. После определения соответствующей учетной записи код завершается, задав для свойства SendUsingAccount почтового элемента этот объект Account, а затем вызовя метод Send(). Следующие примеры управляемого кода написаны на C# и Visual Basic. Для запуска примера управляемого кода для .NET Framework, который вызывает модель COM, необходимо использовать сборку взаимодействия, которая определяет и сопоставляет управляемые интерфейсы с объектами COM в библиотеке типов объектной модели. Для Outlook можно использовать Visual Studio и первичную сборку взаимодействия Outlook (PIA). Перед запуском примеров управляемого кода для Outlook 2013 убедитесь, что вы установили Outlook 2013 PIA и добавили ссылку на компонент Microsoft Outlook 15.0 Object Library в Visual Studio. В классе надстройки Outlook следует использовать следующие примеры ThisAddIn кода (с помощью средств разработчика Office для Visual Studio). Объект Application в коде должен быть доверенным объектом Application Outlook, предоставленным объектом ThisAddIn.Globals. Дополнительные сведения об использовании Outlook PIA для разработки управляемых решений Outlook см. в статье Справочник по основной сборке взаимодействия Outlook на веб-сайте MSDN. В следующем коде показано, как программно вложить копию элемента контакта в почтовое сообщение. Чтобы продемонстрировать эту функцию, в Visual Studio создайте управляемую надстройку Outlook с именем EmbedOutlookItemAddInи замените содержимое файла ThisAddIn.vb или ThisAddIn.cs примером кода, показанным здесь. Измените процедуру ThisAddIn_Startup и обновите адреса электронной почты соответствующим образом. SMTP-адрес, включенный в вызов SendMailWithAttachments процедуры, должен соответствовать SMTP-адресу одной из учетных записей исходящей электронной почты, настроенных ранее в 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

См. также

Вложение файла к элементу почтыОграничение размера вложения в outlook Email messageИзменение вложения сообщения outlook Email

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.