首页 > 解决方案 > .MSG 文件元数据提取 - 发件人 SMTP 电子邮件

问题描述

我们的组织目前正在提取处理旧的 .MSG 文件,这些文件已由现任和可能的前任员工存储。作为此过程的一部分,我们尝试从这些旧电子邮件中提取发件人 SMTP 电子邮件地址。但是,由于其中大多数是内部用户,因此 msg 文件将发件人地址存储为交换地址。我们尝试了以下方法,但没有成功:

**

MsgReader.Outlook.Storage.Message

**

var senderAddress = string.Empty;
using (var msg = new Storage.Message(emailFilePath))
{
    senderAddress = msg.Sender.Email;
}

**

Microsoft.Office.Interop.Outlook.MailItem

**

var senderEmailAddress = this.SafeExtractEmailAddress(mail.Sender, mail.SenderEmailAddress);


private string SafeExtractEmailAddress(AddressEntry addressEntry, string currentEmail)
{
    var userEmailAddress = string.Empty;

    if (addressEntry != null &&
        (addressEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeUserAddressEntry
            || addressEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeRemoteUserAddressEntry))
    {
        userEmailAddress = addressEntry.GetExchangeUser()?.PrimarySmtpAddress;
    }

    if (string.IsNullOrWhiteSpace(userEmailAddress))
    {
        var recipient = this.outlookApplication.Session.CreateRecipient(currentEmail);
        var exchangeUser = recipient?.AddressEntry.GetExchangeUser();

        userEmailAddress = exchangeUser?.PrimarySmtpAddress ?? currentEmail;

        recipient.SafeRelease();
        exchangeUser.SafeRelease();
    }

    return userEmailAddress.ToLowerInvariant();
}

**

Aspose.Email.Mapi.MapiMessage

**

public string ExtractSender(MapiMessage msg)
{
    if (msg == null)
    {
        throw new ArgumentNullException(nameof(msg));
    }
    var senderEmailAddress = msg.SenderEmailAddress;
    ExchangeService exchangeService = this.exchangeServiceFactory.BuildService();

    // Create the ResolveNamesType and set the unresolved entry.

    if (msg.SenderAddressType == "EX")
    { 
        var resolutionCollection = exchangeService.ResolveName(msg.SenderEmailAddress, ResolveNameSearchLocation.ContactsThenDirectory, true);
        var nameResolutions = resolutionCollection.ToList();
        if (nameResolutions.Count > 0)
        {
            var nameResolution = nameResolutions.ElementAt(0);
            senderEmailAddress = nameResolution.Mailbox.Address;
        }
    }

    return senderEmailAddress;
}

我还有哪些其他选择来获取这些数据?

标签: c#emailexchangewebservicesoffice-interopaspose

解决方案


在使用 Aspose.Email.Mapi.MapiMessage 时,该类的对象具有以下返回 Sender 信息的属性:

  • msg.SenderEmailAddress
  • msg.SenderSmtpAddress

这两个属性都获取或设置邮件发件人的电子邮件地址。

您可以使用以下代码片段来加载和读取 MSG 信息:

// Create an instance of MapiMessage from file
MapiMessage msg = MapiMessage.FromFile(dataDir + @"message.msg");

// Get subject
Console.WriteLine("Subject:" + msg.Subject);

// Get from address
Console.WriteLine("Sender:" + msg.SenderEmailAddress);
Console.WriteLine("Sender SMTP:" + msg.SenderSmtpAddress);

// Get body
Console.WriteLine("Body" + msg.Body);

// Get recipients information
Console.WriteLine("Recipient: " + msg.Recipients);

// Get attachments
foreach (MapiAttachment att in msg.Attachments)
{
    Console.Write("Attachment Name: " + att.FileName);
    Console.Write("Attachment Display Name: " + att.DisplayName);
}

注意:我在 Aspose 担任支持开发人员/布道者。


推荐阅读