C# 在Outlook加载项中以MIME格式(*.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,它会使用该对象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(
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格式。我们可以接受。谢谢你!!!我已经尝试解决这个问题很久了!这比赎罪更有效。谢谢你!!!我已经尝试解决这个问题很久了!而且它比救赎更有效。