В надстройке Outlook как определить, является ли отправитель электронной почты адресом электронной почты общего почтового ящика?

#c# #outlook #outlook-addin

Вопрос:

В моем надстройке Outlook мне нужно знать, является ли адрес электронной почты отправителя в поле От типом адреса электронной почты общего почтового ящика, прежде чем разрешить отправку электронной почты. В настоящее время я проверяю, что, если адрес отправителя не существует в адресе электронной почты одной из учетных записей текущих сеансов, я бы предположил, что это адрес электронной почты общего почтового ящика, потому что человек не может войти в Outlook с помощью адреса электронной почты общего почтового ящика.

Однако эта логика ошибочна, поскольку адрес электронной почты, не являющийся общим почтовым ящиком, также может быть указан в поле От (поправьте меня, если я ошибаюсь).

Вот мой код:

     public bool isSharedMailboxAccount(Microsoft.Office.Interop.Outlook.MailItem mail)
    {
        string fromEmail = mail.Sender.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString();
        bool isShared = true;

        foreach (Microsoft.Office.Interop.Outlook.Account acc in mail.Session.Accounts)
        {
            if (acc.SmtpAddress == fromEmail)
            {
                isShared = false;
                break;
            }
        }
        return isShared;
    }
 

Есть ли лучший способ определить, является ли адрес электронной почты отправителя в поле От адресом электронной почты общего почтового ящика или нет?

Комментарии:

1. «Общий» в некотором смысле «другая учетная запись Exchange»?

2. @DmitryStreblechenko Я на самом деле не совсем уверен, что это другой аккаунт. Я имел в виду общий почтовый ящик, который был настроен в соответствии с этим support.microsoft.com/en-us/office/. … Адрес общего почтового ящика будет выглядеть примерно так support@contoso.com , и, по сути, я хочу, чтобы моя надстройка Outlook распознала, что этот адрес является адресом общего почтового ящика.

3. Вы можете проверить XML-файл автоматического обнаружения, чтобы узнать, указан ли он там для текущего пользователя. В остальном он выглядит как обычный почтовый ящик.

4. @DmitryStreblechenko Спасибо за ваше предложение, я нашел его по C:Users%username%AppDataLocalMicrosoftOutlook адресу, и, похоже, электронные письма с общим почтовым ящиком перечислены в разделе Autodiscover/Response/Account/AlternativeMailbox элемент SmtpAddress или OwnerSmtpAddress элемент. Кроме того, его Type элемент дает значение Delegate , поэтому я думаю, что могу сделать что-то вроде того, чтобы мой плагин проверил этот XML-файл на наличие списка AlternativeMailbox элементов, имеющих Type значение Delegate , и сравнил его SmtpAddress значение с электронной почтой отправителя, чтобы определить, является ли электронная почта отправителя общей электронной почтой или нет.

5. @DmitryStreblechenko Предвидите ли вы какие-либо потенциальные проблемы с этим решением? например, всегда ли этот локальный XML-файл будет точным, надежным или доступным для любой версии Outlook 2007 и выше?

Ответ №1:

Спасибо @DmitryStreblechenko, который подал мне идею изучить AutoDiscoverXml в комментариях . Действительно, в AutoDiscoverXml есть вызываемые узлы AlternativeMailbox , которые, по-видимому, указывают список общих почтовых ящиков, частью которых является пользователь учетной записи. Запрос этих XML-узлов позволит нам извлечь адрес электронной почты общего почтового ящика из двух дочерних узлов с именем SmtpAddress и OwnerSmtpAddress .

Я не уверен в разнице между этими двумя, но в данном случае я использую SmtpAddress .

 public bool isSharedMailboxAccount(Microsoft.Office.Interop.Outlook.MailItem mail)
{
    string fromEmail = mail.Sender.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E").ToString();
    bool isShared = false;

    foreach (Microsoft.Office.Interop.Outlook.Account acc in mail.Session.Accounts)
    {
        //using XMLDocument to query AutoDiscoverXML value
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(account.autoDiscoverXml);
        
        XmlNodeList alts = xml.GetElementsByTagName("AlternativeMailbox");
        foreach (XmlNode alt in alts)
        {
            //NOTE: I'm not entirely sure that alt mailboxes that has Type == Delegate will always mean shared mailbox but so far in my tests, it seems to be so.
            if(alt.ChildNodes.OfType<XmlElement>().Where(e => e.LocalName == "Type").First().InnerText.Equals("Delegate"))
            {
                if(alt.ChildNodes.OfType<XmlElement>().Where(e => e.LocalName == "SmtpAddress").First().InnerText.Equals(fromEmail))
                {
                    isShared = true;
                    break;
                }
            }
        }
        
        if(isShared)
        {
            break;
        }
    }
    return isShared;
}