Изменение вложения сообщения outlook Email

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

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

Отправить сообщение электронной почты с одним или несколькими вложениями легко как в интерфейсе Outlook, так и программным способом. Однако в некоторых сценариях может потребоваться изменить вложение после его присоединения к почтовому элементу, не изменяя исходный файл в файловой системе. Другими словами, для доступа к содержимому вложения в памяти может потребоваться программный способ.

Например, представьте, что приложению требуется преобразовать текст во всех вложениях с расширением .txt в верхний регистр. В управляемой надстройке Outlook можно легко обработать событие ItemSend . В этом случае выполните работу перед отправкой почтового элемента. Сложная часть сценария заключается в получении содержимого вложений для изменения содержимого каждого текстового файла.

В примере кода в этом разделе показано, как решить эту конкретную проблему с помощью методов GetProperty(String) и SetProperty(String, Object) интерфейса Attachment . В каждом случае необходимо указать значение, содержащее свойство MAPI PidTagAttachDataBinary , чтобы получить (а затем задать) содержимое вложения.

Примечание В пространстве имен свойство PidTagAttachDataBinary имеет значение https://schemas.microsoft.com/mapi/proptag/0x37010102. Дополнительные сведения об использовании объекта PropertyAccessor для свойств, на которые ссылается пространство имен, см. в разделе Ссылки на свойства по пространству имен.

Пример кода обрабатывает событие ItemSend почтового элемента. В пользовательском обработчике событий для любого вложения с расширением .txt код вызывает ConvertAttachmentToUpperCase метод . ConvertAttachmentToUpperCase принимает объект Attachment и объект MailItem в качестве входных аргументов, извлекает массив байтов, заполненный содержимым вложения, преобразует массив байтов в строку, преобразует строку в верхний регистр, а затем задает содержимое вложения в преобразованную строку в виде массива байтов.

Следующие примеры управляемого кода написаны на 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.

В следующем коде показано, как программно изменить вложение электронной почты Outlook без изменения исходного файла. Чтобы продемонстрировать эту функцию, в Visual Studio создайте управляемую надстройку Outlook с именем ModifyAttachmentAddIn. Замените код в файле ThisAddIn.cs или ThisAddIn.vb следующим кодом.

Примечание Чтобы получить доступ к данным вложения, почтовый элемент должен быть сохранен с помощью метода 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

См. также

Вложение файла в почтовый элемент

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

Ограничение размера вложения до сообщения outlook Email

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

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