Сохранить почту в формате MIME (* .eml) в надстройке Outlook

1

Я хочу написать небольшое дополнение Outlook (С#), которое сохраняет выбранную почту (MailItem) на диск в обычном формате MIME (.eml). Метод MailItem.SaveAs() позволяет сохранять только в формате.msg. Есть ли другой (простой) способ, чтобы сохранить почту в eml-формате? Я хочу сохранить все детали оригинальной почты.

Я прочитал что-то о Outlook WebServices. Возможно, я могу выполнить поиск на сервере обмена для выбранной в данный момент почты и получить ее снова из обмена и сохранить ее как.eml? Что мне нужно для этого варианта?

Можно ли легко преобразовать сохраненный.msg в.eml (с сохранением всех деталей, заголовков и т.д.)?

Я надеюсь, что кто-то может помочь мне с этой проблемой, потому что я потратил пару часов на поиск решения без каких-либо результатов.

Теги:
email
outlook
add-in

2 ответа

2
Лучший ответ

Вы также можете

1) Создайте MIME файл явно в свойстве кода за один раз. Вы также можете использовать существующие MIME-конвертеры (я использовал Lumisoft в прошлом), но они не будут конвертировать сообщения Outlook в один вызов; вам нужно будет расшифровать все заголовки и части MIME.

2) Использовать объект IConverterSession (только C++ или Delphi) - это тот же MIME-конвертер, который используется Outlook. Вы можете играть с ним в OutlookSpy (нажмите кнопку IConverterSession). Следующий сценарий (VBS) сохранит текущее выбранное сообщение в Outlook как файл EML

3) Используйте Redemption и его методы RDOMail.SaveAs или SafeMailItem.SaveAs - он может сохранять в формате MIME (olRfc822) вместе с десятком других форматов. Он использует объект IConverterSession, когда он доступен (Outlook 2003 и выше), или его собственный конвертер для более старой версии Outlook или при использовании с версией MAPI Exchange.

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set rItem = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
  rItem.SaveAs "c:\temp\test.eml", 1024
  • 1
    Спасибо за ваш ответ. Я пытался «конвертировать» сообщения вручную, но, кажется, очень трудно конвертировать все сообщения (все заголовки и т. Д.). Я не хочу использовать внешние библиотеки. И я не хочу тратить на это много времени, поэтому я не хочу писать собственный конвертер на C ++. Поэтому я, наконец, решил использовать формат .msg, предоставленный методом MailItem.SaveAs (). Мы можем жить с этим.
1

Здесь прокси-сервер IConvertSession для С#:

using Microsoft.Office.Interop.Outlook;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

namespace Exchange.Export.MAPIMessageConverter
{
    internal class MAPIMethods
    {
        [Flags]
        public enum MAPITOMIMEFLAGS
        {
            CCSF_SMTP = 0x0002,
            CCSF_NOHEADERS = 0x0004,
            CCSF_USE_TNEF = 0x0010,
            CCSF_INCLUDE_BCC = 0x0020,
            CCSF_8BITHEADERS = 0x0040,
            CCSF_USE_RTF = 0x0080,
            CCSF_PLAIN_TEXT_ONLY = 0x1000,
            CCSF_NO_MSGID = 0x4000,
        }

        [Flags]
        public enum CLSCTX
        {
            CLSCTX_INPROC_SERVER = 0x1,
            CLSCTX_INPROC_HANDLER = 0x2,
            CLSCTX_LOCAL_SERVER = 0x4,
            CLSCTX_REMOTE_SERVER = 0x10,
            CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
            CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
            CLSCTX_ALL = CLSCTX_SERVER | CLSCTX_INPROC_HANDLER
        }


        public static Guid CLSID_IConverterSession = new Guid("{4e3a7680-b77a-11d0-9da5-00c04fd65685}");

        public static Guid IID_IConverterSession = new Guid("{4b401570-b77b-11d0-9da5-00c04fd65685}");

        public enum ENCODINGTYPE
        {
            IET_BINARY = 0,
            IET_BASE64 = 1,
            IET_UUENCODE = 2,
            IET_QP = 3,
            IET_7BIT = 4,
            IET_8BIT = 5,
            IET_INETCSET = 6,
            IET_UNICODE = 7,
            IET_RFC1522 = 8,
            IET_ENCODED = 9,
            IET_CURRENT = 10,
            IET_UNKNOWN = 11,
            IET_BINHEX40 = 12,
            IET_LAST = 13
        }

        public enum MIMESAVETYPE
        {
            SAVE_RFC822 = 0,
            SAVE_RFC1521 = 1
        }

        [ComVisible(false)]
        [ComImport()]
        [Guid("00020307-0000-0000-C000-000000000046")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IMessage
        {
        }

        [ComImport]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("4b401570-b77b-11d0-9da5-00c04fd65685")]
        public interface IConverterSession
        {
            [PreserveSig]
            int Placeholder0();

            [PreserveSig]
            uint SetEncoding(
            [In, MarshalAs(UnmanagedType.I4)] ENCODINGTYPE DispId
            );

            [PreserveSig]
            int Placeholder1();

            [PreserveSig]
            uint MIMEToMAPI(
                [In, MarshalAs(UnmanagedType.Interface)]
                Stream pstm,
                [Out, MarshalAs(UnmanagedType.Interface)]
                MailItem pmsg,
                object pszSrcSrv,
                uint ulFlags
            );

            [PreserveSig]
            uint MAPIToMIMEStm(
                [In, MarshalAs(UnmanagedType.Interface)]
                IMessage pmsg,
                [Out, MarshalAs(UnmanagedType.Interface)]
                IStream pstm,
                MAPITOMIMEFLAGS ulFlags
            );

            [PreserveSig]
            int Placeholder2();

            [PreserveSig]
            int Placeholder3();

            [PreserveSig]
            int Placeholder4();

            [PreserveSig]
            int SetTextWrapping(
                bool fWrapText,
                uint ulWrapWidth
            );

            [PreserveSig]
            uint SetSaveFormat(
                [In, MarshalAs(UnmanagedType.I4)]
                MIMESAVETYPE mstSaveFormat
            );

            [PreserveSig]
            int Placeholder5();

            [PreserveSig]
            int Placeholder6();
        }
    }
}

Используй это:

private Stream GetEmlStream(Outlook.MailItem mail)
{
    Type converter = Type.GetTypeFromCLSID(MAPIMethods.CLSID_IConverterSession);
    object obj = Activator.CreateInstance(converter);
    MAPIMethods.IConverterSession session = (MAPIMethods.IConverterSession)obj;

    if (session != null)
    {
        uint hr = session.SetEncoding(MAPIMethods.ENCODINGTYPE.IET_QP);
        hr = session.SetSaveFormat(MAPIMethods.MIMESAVETYPE.SAVE_RFC822);
        var stream = new ComMemoryStream();
        hr = session.MAPIToMIMEStm((MAPIMethods.IMessage)mail.MAPIOBJECT, stream, MAPIMethods.MAPITOMIMEFLAGS.CCSF_SMTP);
        if (hr != 0)
            throw new ArgumentException(There are some invalid COM arguments");

        stream.Position = 0;

        return stream;
    }

    return null;
}

ComMemoryStream: qaru.site/questions/658263/...

Другие шрифты:

http://www.pcreview.co.uk/threads/iconvertersession-in-c.3716714/

http://www.microsoft-questions.com/microsoft/Plaform-SDK-Mapi/31018989/mimetomapi-and-mapitomimestm-method-take-a-pointer-to-an-imessage-extended.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню