Как получить адрес электронной почты отправителя с помощью Microsoft.Office.Interop.Outlook - PullRequest
0 голосов
/ 28 января 2019

Я использую Microsoft.Office.Interop.Outlook в своем коде C # для чтения почты из файла 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 голосов
/ 28 января 2019

Сначала следует проверить свойство SenderEmailType.

Свойство _MailItem.SenderEmailType

Возвращает строку (строку в C #), которая представляет тип записи дляадрес электронной почты отправителя элемента Outlook, например «SMTP» для интернет-адреса, «EX» для адреса сервера Microsoft Exchange и т. д. Только для чтения.

См. такжездесь.
Получить SMTP-адрес отправителя почтового элемента

Чтобы определить SMTP-адрес для полученного почтового элемента, используйте свойство SenderEmailAddress объекта MailItem,Однако если отправитель является внутренним для вашей организации, SenderEmailAddress не возвращает SMTP-адрес, и вы должны использовать объект PropertyAccessor для возврата SMTP-адреса отправителя.

В следующем примере кода GetSenderSMTPAddress использует объект PropertyAccessorчтобы получить значения, которые не отображаются непосредственно в объектной модели Outlook.GetSenderSMTPAddress принимает MailItem.Если значение свойства SenderEmailType полученного MailItem равно «EX», отправитель сообщения находится на сервере Exchange в вашей организации.GetSenderSMTPAddress использует свойство Sender объекта MailItem для получения отправителя, представленного объектом 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;
    }
}

Кроме того:
Я неправильно понялвопрос.

У меня нет ответа на ваш вопрос.
Однако кажется, что это не может быть решено программой на стороне клиента.
Нужно ли администратору что-то делать?

Следующая статья может быть подсказкой для чего-либо.
Обзор неактивных почтовых ящиков в Office 365

Параметры электронной почты пользователя Office 365
Предоставление разрешений на почтовый ящик другому пользователю в Office 365 - Справка администратора
Преобразование почтового ящика пользователя в общий почтовый ящик
Открытие и использование общего почтового ящика вOutlook

...