使用c#读取.eml(outlook email)文件

时间:2017-11-13 11:02:19

标签: c# outlook office-interop eml

我正在编写一项通过删除所有恶意内容来清理文件的服务。我正在使用Interop Excel& Word api是这样的:

Excel中

    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文件的任何方法。

2 个答案:

答案 0 :(得分:0)

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

要读取EML文件,您需要在代码中显式解析它,或者使用MIME处理组件的数百个组件之一。如果使用Redemption是一个选项,您可以创建一个临时MSG文件并将EML文件导入其中。

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

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

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

另请注意,Windows服务(例如IIS)中不能使用Office应用程序(Excel,Word或Outlook)。

答案 1 :(得分:0)

感谢德米特里,我设法找到了解决方案。我最终使用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));
}