Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Outlook加载项中以MIME格式(*.eml)保存邮件_C#_.net_Email_Outlook_Add In - Fatal编程技术网

C# 在Outlook加载项中以MIME格式(*.eml)保存邮件

C# 在Outlook加载项中以MIME格式(*.eml)保存邮件,c#,.net,email,outlook,add-in,C#,.net,Email,Outlook,Add In,我想写一个小的Outlook插件(C#),它以纯MIME格式(.eml)将选定的邮件(MailItem)保存到磁盘。 MailItem.SaveAs()方法只允许以.msg格式保存。 是否有其他(简单)方法以eml格式保存邮件?我想保留原始邮件的所有细节 我读过一些关于Outlook Web服务的文章。也许我可以在exchange服务器上搜索当前在outlook中选择的邮件,然后再次从exchange接收并将其另存为.eml?这个选项需要什么 是否可以以简单的方式将保存的.msg转换为.eml(

我想写一个小的Outlook插件(C#),它以纯MIME格式(.eml)将选定的邮件(MailItem)保存到磁盘。 MailItem.SaveAs()方法只允许以.msg格式保存。 是否有其他(简单)方法以eml格式保存邮件?我想保留原始邮件的所有细节

我读过一些关于Outlook Web服务的文章。也许我可以在exchange服务器上搜索当前在outlook中选择的邮件,然后再次从exchange接收并将其另存为.eml?这个选项需要什么

是否可以以简单的方式将保存的.msg转换为.eml(保留所有详细信息、标题等)

我希望有人能帮我解决这个问题,因为我花了几个小时寻找一个没有结果的解决方案。

你也可以

1) 在代码中显式创建MIME文件,每次创建一个属性。您也可以使用现有的MIME转换器(我在过去使用过Lumisoft),但它们不会在一次调用中转换Outlook消息;您需要明确构建所有的头文件和MIME部分

2) 使用对象(仅限C++或Delphi)-这与Outlook使用的MIME转换器相同。您可以在中玩它(单击图标转换按钮)。以下脚本(VBS)将Outlook中当前选定的邮件另存为EML文件

3) Use及其.SaveAs或.SaveAs方法—它可以以MIME格式(olRfc822)以及十几种其他格式保存。当对象可用(Outlook 2003及更高版本)时,它会使用该对象;对于较旧版本的Outlook,它会使用自己的转换器;对于Exchange版本的MAPI,它会使用该对象

  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) 在代码中显式创建MIME文件,每次创建一个属性。您也可以使用现有的MIME转换器(我在过去使用过Lumisoft),但它们不会在一次调用中转换Outlook消息;您需要明确构建所有的头文件和MIME部分

2) 使用对象(仅限C++或Delphi)-这与Outlook使用的MIME转换器相同。您可以在中玩它(单击图标转换按钮)。以下脚本(VBS)将Outlook中当前选定的邮件另存为EML文件

3) Use及其.SaveAs或.SaveAs方法—它可以以MIME格式(olRfc822)以及十几种其他格式保存。当对象可用(Outlook 2003及更高版本)时,它会使用该对象;对于较旧版本的Outlook,它会使用自己的转换器;对于Exchange版本的MAPI,它会使用该对象

  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

下面是C#的IConvertSession代理:

使用它:

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;
}
CommMemoryStream:

其他字体:


这里有一个C#的IConvertSession代理:

使用它:

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;
}
CommMemoryStream:

其他字体:


谢谢您的回答。我试图手动“转换”消息,但似乎很难转换所有消息(所有标题等)。我不想使用外部库。我不想花很多时间来做这个,所以我不想在C++中编写自己的转换器。因此,我最终决定使用MailItem.SaveAs()方法提供的.msg格式。我们可以接受。谢谢你的回答。我试图手动“转换”消息,但似乎很难转换所有消息(所有标题等)。我不想使用外部库。我不想花很多时间来做这个,所以我不想在C++中编写自己的转换器。因此,我最终决定使用MailItem.SaveAs()方法提供的.msg格式。我们可以接受。谢谢你!!!我已经尝试解决这个问题很久了!这比赎罪更有效。谢谢你!!!我已经尝试解决这个问题很久了!而且它比救赎更有效。