如何使用Microsoft.Office.Interop.Outlook获取发件人电子邮件地址

时间:2019-01-28 05:38:44

标签: c# outlook interop office-interop

我在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;

1 个答案:

答案 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