#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;
}