c# - .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;
}
我还有哪些其他选择来获取这些数据?
解决方案
在使用 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 担任支持开发人员/布道者。
推荐阅读
- php - preg_replace 超过 3 位的所有小数
- flutter - 如何在颤动中强制应用程序进入肖像模式
- javascript - 使用 select2.js 发送 ajax 请求
- java - 无法实例化 [java.util.List]:指定类是 GET 请求中的接口
- angularjs - $q.all() 返回一个未定义值的数组
- c - scanf 跳过数组位置
- webpack - Polyfill 未应用于导入的文件
- mysql - 在 json 数组中使用 JSON_EXTRACT、JSON_SET、JSON_REPLACE、JSON_INSERT
- django - Django中的授权后端
- c++ - 如何在 C++ 中直接使用 addr2line