我在C#代码中使用Microsoft.Office.Interop.Outlook从PST文件读取邮件,并且在尝试获取发件人的电子邮件地址时遇到问题。
我尝试了下面的代码,但我收到组织中存在的用户的电子邮件,但无法获得离开组织或不活跃于AD的用户的电子邮件。
string SenderEmailAddress = "";
try
{
AddressEntry sender = mail.Sender;
if (sender.AddressEntryUserType == OlAddressEntryUserType.olExchangeUserAddressEntry || sender.AddressEntryUserType == OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
{
ExchangeUser exchUser = sender.GetExchangeUser();
if (exchUser != null)
{
SenderEmailAddress = exchUser.PrimarySmtpAddress;
}
}
else
{
SenderEmailAddress = mail.SenderEmailAddress;
}
}
catch (System.Exception ex)
{
log.Log("Error Occured at getSenderEmailAddress() :: for " + mail.Sender + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace);
}
return SenderEmailAddress;
答案 0 :(得分:1)
您应该首先检查SenderEmailType属性。
_MailItem.SenderEmailType Property
返回一个字符串(C#中的字符串),该字符串表示Outlook项目发件人的电子邮件地址的条目类型,例如Internet地址为“ SMTP”,Microsoft Exchange服务器地址为“ EX”,等。只读。
也请在这里查看。
Get the SMTP address of the sender of a mail item
要确定已接收邮件的SMTP地址,请使用MailItem对象的SenderEmailAddress属性。但是,如果发件人在您的组织内部,则SenderEmailAddress不会返回SMTP地址,并且您必须使用PropertyAccessor对象返回发件人的SMTP地址。
在下面的代码示例中,GetSenderSMTPAddress使用PropertyAccessor对象来获取未直接在Outlook对象模型中公开的值。 GetSenderSMTPAddress接收一个MailItem。如果接收到的MailItem的SenderEmailType属性的值为“ EX”,则邮件的发件人位于组织中的Exchange服务器上。 GetSenderSMTPAddress使用MailItem对象的Sender属性获取由AddressEntry对象表示的发件人。
private string GetSenderSMTPAddress(Outlook.MailItem mail)
{
string PR_SMTP_ADDRESS =
@"https://schemas.microsoft.com/mapi/proptag/0x39FE001E";
if (mail == null)
{
throw new ArgumentNullException();
}
if (mail.SenderEmailType == "EX")
{
Outlook.AddressEntry sender =
mail.Sender;
if (sender != null)
{
//Now we have an AddressEntry representing the Sender
if (sender.AddressEntryUserType ==
Outlook.OlAddressEntryUserType.
olExchangeUserAddressEntry
|| sender.AddressEntryUserType ==
Outlook.OlAddressEntryUserType.
olExchangeRemoteUserAddressEntry)
{
//Use the ExchangeUser object PrimarySMTPAddress
Outlook.ExchangeUser exchUser =
sender.GetExchangeUser();
if (exchUser != null)
{
return exchUser.PrimarySmtpAddress;
}
else
{
return null;
}
}
else
{
return sender.PropertyAccessor.GetProperty(
PR_SMTP_ADDRESS) as string;
}
}
else
{
return null;
}
}
else
{
return mail.SenderEmailAddress;
}
}
此外:
我误解了这个问题。
您的问题没有答案。
但是,客户端程序似乎无法解决此问题。
管理员需要做些什么吗?
以下文章可能会暗示一些问题。
Overview of inactive mailboxes in Office 365
Office 365 User Email Settings
Give mailbox permissions to another user in Office 365 - Admin Help
Convert a user mailbox to a shared mailbox
Open and use a shared mailbox in Outlook