Извлечение метаданных файла .MSG - электронная почта отправителя SMTP - PullRequest
0 голосов
/ 16 ноября 2018

Наша организация в настоящее время находится в процессе извлечения старых файлов .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;
}

Какие еще есть варианты для получения этих данных?

1 Ответ

0 голосов
/ 17 ноября 2018

При использовании Aspose.Email.Mapi.MapiMessage объект этого класса имеет следующие свойства, возвращающие информацию об отправителе:

  • 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);
}

Примечание: IЯ работаю разработчиком поддержки / евангелистом в Aspose.

...