Изменение вложения сообщения 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 и обратная связь.