Кнопка C / Outlook для ответа / пересылки с изображением в качестве подписи
Я написал надстройку для Outlook (2010/2007), которая получает текущий выбранный (открытый) почтовый элемент и создает новый почтовый элемент на основе темы, тела и вложений текущего почтового элемента. Моя проблема в том, что если подпись является вложением изображения, я не могу поместить его в исходное положение текущего почтового элемента. Изображение подписи размещается в верхней части почтового окна (поле вложения). я пытался возиться с положением вложения, пытаясь поместить его в конец тела, но не повезло, плюс я думаю, что это неправильный способ сделать это, так как я не могу быть уверен, в каком положении находится каждое изображение в пределах например, электронная почта с кратным заменяет. то, что я пытаюсь сделать здесь, - это создать кнопку наподобие кнопки "Ответить" или "Переслать", но без дополнительного текста в теле (например, время отправки сообщения, отправитель и т. д.).
это мой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using ForwardAsNewMail;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace ForwardAsNewMail
{
public partial class ForwardAsNewMail
{
private void ForwardAsNewMail_Load(object sender, RibbonUIEventArgs e)
{
}
private void btnNewMail_Click(object sender, RibbonControlEventArgs e)
{
Outlook.MailItem oldMailItem = GetMailItem(e);
Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem newMailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
newMailItem.HTMLBody = oldMailItem.HTMLBody;
newMailItem.Subject = oldMailItem.Subject;
#region Attahment
// Get the count of Attachments
int attachCount = oldMailItem.Attachments.Count;
if (attachCount > 0)
{
// loop through each attachment
for (int idx = 1; idx <= attachCount; idx++)
{
string sysPath = System.IO.Path.GetTempPath();
if (!System.IO.Directory.Exists(sysPath + "~test"))
{
System.IO.Directory.CreateDirectory(sysPath + "~test");
}
// get attached file and save in temp folder
string strSourceFileName = sysPath + "~test\\" +
oldMailItem.Attachments[idx].FileName;
oldMailItem.Attachments[idx].SaveAsFile(strSourceFileName);
string strDisplayName = "Attachment";
int intPosition = 1;
int intAttachType = (int)Outlook.OlAttachmentType.olEmbeddeditem;
// Add the current attachment
newMailItem.Attachments.Add(strSourceFileName,
intAttachType, intPosition, strDisplayName);
}
}
#endregion
newMailItem.Display();
}
///
/// Gets the mail item selected in the explorer view if one is selected or instance if that is the view active.
///
/// The instance containing the event data.
/// A Outlook.MailItem for the mail being viewed.
private Microsoft.Office.Interop.Outlook.MailItem GetMailItem(RibbonControlEventArgs e)
{
// Check to see if a item is select in explorer or we are in inspector.
if (e.Control.Context is Microsoft.Office.Interop.Outlook.Inspector)
{
Microsoft.Office.Interop.Outlook.Inspector inspector = (Microsoft.Office.Interop.Outlook.Inspector)e.Control.Context;
if (inspector.CurrentItem is Microsoft.Office.Interop.Outlook.MailItem)
{
return inspector.CurrentItem as Microsoft.Office.Interop.Outlook.MailItem;
}
}
if (e.Control.Context is Microsoft.Office.Interop.Outlook.Explorer)
{
Microsoft.Office.Interop.Outlook.Explorer explorer = (Microsoft.Office.Interop.Outlook.Explorer)e.Control.Context;
Microsoft.Office.Interop.Outlook.Selection selectedItems = explorer.Selection;
if (selectedItems.Count != 1)
{
return null;
}
if (selectedItems[1] is Microsoft.Office.Interop.Outlook.MailItem)
{
return selectedItems[1] as Microsoft.Office.Interop.Outlook.MailItem;
}
}
return null;
}
}
}
заранее спасибо!:)
** РЕДАКТИРОВАТЬ С РЕШЕНИЕМ ** Что ж, после того, как Дмитрий указал мне правильное направление, мне удалось выяснить, как сохранить все вложения и внедрить те, которые были встроены. Я также добавил оператор IF, который проверяет, встроено ли вложение. так вот код, если кто-то заинтересован:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using ForwardAsNewMail;
using Outlook = Microsoft.Office.Interop.Outlook;
using System.Reflection;
namespace ForwardAsNewMail
{
public partial class ForwardAsNewMail
{
private void ForwardAsNewMail_Load(object sender, RibbonUIEventArgs e)
{
}
private void btnNewMail_Click(object sender, RibbonControlEventArgs e)
{
Outlook.MailItem oldMailItem = GetMailItem(e);
Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem newMailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
newMailItem.HTMLBody = oldMailItem.HTMLBody;
newMailItem.Subject = oldMailItem.Subject;
#region Attahment
// Get the count of Attachments
int attachCount = oldMailItem.Attachments.Count;
if (attachCount > 0)
{
// loop through each attachment
for (int idx = 1; idx <= attachCount; idx++)
{
string sysPath = System.IO.Path.GetTempPath();
if (!System.IO.Directory.Exists(sysPath + "~test"))
{
System.IO.Directory.CreateDirectory(sysPath + "~test");
}
// determain if the attachment is embeded or not (in-line or not)
string atchPropValue = oldMailItem.Attachments[idx].PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E");
if (atchPropValue == null || atchPropValue == string.Empty)
{
// get attached file and save in temp folder
string strSourceFileName = sysPath + "~test\\" + oldMailItem.Attachments[idx].FileName;
oldMailItem.Attachments[idx].SaveAsFile(strSourceFileName); // x
string strDisplayName = "Attachment";
int intPosition = oldMailItem.Attachments[idx].Index;
int intAttachType = (int)Outlook.OlAttachmentType.olEmbeddeditem;
// Add the current attachment
newMailItem.Attachments.Add(strSourceFileName, intAttachType, intPosition, strDisplayName);
}
else
{
Outlook.Attachment oldAttach = oldMailItem.Attachments[idx];
string strSourceFileName = sysPath + "~test\\" + oldAttach.FileName;
oldAttach.SaveAsFile(strSourceFileName);
// Add the current attachment
Outlook.Attachment newAttach = newMailItem.Attachments.Add(strSourceFileName,Missing.Value, Missing.Value, Missing.Value); // z
try
{
newAttach.PropertyAccessor.SetProperty(
@"http://schemas.microsoft.com/mapi/proptag/0x3712001F",
oldAttach.PropertyAccessor.GetProperty(
@"http://schemas.microsoft.com/mapi/proptag/0x3712001F"));
}
catch
{
}
}
}
}
#endregion
newMailItem.Display();
}
///
/// Gets the mail item selected in the explorer view if one is selected or instance if that is the view active.
///
/// The instance containing the event data.
/// A Outlook.MailItem for the mail being viewed.
private Microsoft.Office.Interop.Outlook.MailItem GetMailItem(RibbonControlEventArgs e)
{
// Check to see if a item is select in explorer or we are in inspector.
if (e.Control.Context is Microsoft.Office.Interop.Outlook.Inspector)
{
Microsoft.Office.Interop.Outlook.Inspector inspector = (Microsoft.Office.Interop.Outlook.Inspector)e.Control.Context;
if (inspector.CurrentItem is Microsoft.Office.Interop.Outlook.MailItem)
{
return inspector.CurrentItem as Microsoft.Office.Interop.Outlook.MailItem;
}
}
if (e.Control.Context is Microsoft.Office.Interop.Outlook.Explorer)
{
Microsoft.Office.Interop.Outlook.Explorer explorer = (Microsoft.Office.Interop.Outlook.Explorer)e.Control.Context;
Microsoft.Office.Interop.Outlook.Selection selectedItems = explorer.Selection;
if (selectedItems.Count != 1)
{
return null;
}
if (selectedItems[1] is Microsoft.Office.Interop.Outlook.MailItem)
{
return selectedItems[1] as Microsoft.Office.Interop.Outlook.MailItem;
}
}
return null;
}
}
}
1 ответ
Тело HTML ссылается на изображения через атрибут src/cid (e.g. <img src="cid:xyz">
) - после добавления вложения необходимо убедиться, что свойство PR_ATACH_CONTENT_ID (имя DASL http://schemas.microsoft.com/mapi/proptag/0x3712001F
) правильно установлен с помощью Attachment.PropertyAccessor.SetProperty. Взгляните на существующее сообщение со встроенным изображением HTML с помощью OutlookSpy (нажмите кнопку IMessage).
Возможно, вы захотите избавиться от многоточечной записи при доступе к вложениям.
Attachment oldAttach = oldMailItem.Attachments[idx]
string strSourceFileName = sysPath + "~test\\" + oldAttach.FileName;
oldAttach.SaveAsFile(strSourceFileName);
// Add the current attachment
Attachment newAttach = newMailItem.Attachments.Add(strSourceFileName,
Missing.Value, Missing.Value, Missing.Value);
try
{
newAttach.PropertyAccessor.SetProperty(
@"http://schemas.microsoft.com/mapi/proptag/0x3712001F",
oldAttach.PropertyAccessor.GetProperty(
@"http://schemas.microsoft.com/mapi/proptag/0x3712001F")
}
catch()
{
//exception is raised if the property does not exist
}