Кнопка 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
                }   
Другие вопросы по тегам