使用 c# 读取 .eml(Outlook 电子邮件)文件



我正在编写一项服务,该服务通过删除所有恶意内容来清理文件。我正在使用Interop Excel和Word api,如下所示:

胜过

    var excelApp = new Microsoft.Office.Interop.Excel.Application();
    excelApp.Visible = false;
    excelApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;
    try
    {
        var workbook = excelApp.Workbooks.Open(fileToClean.InputFileName);

    var wordApp = new Microsoft.Office.Interop.Word.Application
    {
        Visible = false,
        AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable
    };
    try
    {
        var wordDoc = wordApp.Documents.Open(fileToClean.InputFileName, false, true);

我正在尝试找到一种类似的方法来打开.eml Outlook文件。我找不到任何使用Outlook Interop打开.eml文件的方法。

EML 文件格式不是 Outlook 的原生格式 - MSG 格式是(您可以使用 Namespace.GetSharedItem 打开 MSG 文件(。即使您在Windows资源管理器中双击EML文件,Outlook也很乐意为您打开EML文件。

若要读取 EML 文件,需要在代码中显式分析该文件,或使用众多 MIME 处理库之一。如果使用救赎(我是它的作者(是一个选项,你可以创建一个临时的味精文件并将EML文件导入其中。

以下代码将创建一个 MSG 文件,并使用 Redemption(RDOSession 对象(将 EML 文件导入其中:

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = outlookApp.Session.MAPIOBJECT
  set Msg = Session.CreateMessageFromMsgFile("C:Temptemp.msg")
  Msg.Import "C:Temptest.eml", 1024
  Msg.Save
  MsgBox Msg.Subject

然后,您可以使用消息 (RDOMail( 访问它的各种属性(主题、正文等(。

另请记住,不能从 Windows 服务(如 IIS(使用 Office 应用(Excel、Word 或 Outlook(。

多亏

了德米特里,我设法找到了解决方案。我最终使用了Independentsoft.Msg nuget包。代码在这里:

Message message = new Message(fileToClean.InputFileName);
var attachmentList = new List<Attachment>();
// First check all attachments, and add the clean ones to the attachment list
foreach (BodyPart bodyPart in message.BodyParts)
{
    if ((bodyPart.ContentDisposition != null) &&
        (bodyPart.ContentDisposition.Type == ContentDispositionType.Attachment))
    {
        foreach (Attachment attachment in message.GetAttachments())
        {
            if (attachment.GetFileName() == bodyPart.ContentDisposition.Parameters[0].Value)
            {
                if (IsClean(attachment, fileToClean))
                {
                    attachmentList.Add(attachment);
                }
                break;
            }
        }
    }
}
// Remove all attachements
message.BodyParts.RemoveAll(bp =>
                       (bp.ContentDisposition != null) &&
                       (bp.ContentDisposition.Type == 
ContentDispositionType.Attachment));
// Attach Cleaned attachments
foreach (Attachment attachment in attachmentList)
{
    message.BodyParts.Add(new BodyPart(attachment));
}

相关内容

  • 没有找到相关文章

最新更新