Преобразование адреса электронной почты x500 в адрес smtp

Я разрабатываю надстройку Outlook с помощью надстройки Express. Когда я получаю почтовый ящик «Исходящие», я вижу свой адрес электронной почты в разделе «mailItem.SenderEmailAddress» в формате x500. Есть ли способ преобразовать его в адрес электронной почты SMTP.

Вот мой код:

        Outlook.Explorer expl = null;
        Outlook.Selection selection = null;
        Outlook.MailItem mailItem = null;
        Outlook.Recipient recipient = null;
        string recipientsEmail = "";

        try
        {
            expl = Globals.ObjOutlook.ActiveExplorer() as Outlook.Explorer; ;
            if (expl != null)
            {
                selection = expl.Selection;
                if (selection.Count == 1)
                {
                    if (selection[1] is Outlook.MailItem)
                    {
                        mailItem = (selection[1] as Outlook.MailItem);
                        if (mailItem != null)
                        {
                            string senderEmailAddress = mailItem.SenderEmailAddress;

Что я пробовал и добился успеха: - Я знаю, как преобразовать тип x500 в SMTP с помощью объекта Outlook.Recipient. Там я могу получить «addressEntry» Получателя и получить ExhangeUser, а затем перейти к «PrimarySmtpAddress» ExhangeUser. Но я не совсем уверен в том, как работать с SenderEmailAddress и преобразовывать его как SMTP.

Некоторые интересные эксперименты: - Поскольку свойство «Sender» недоступно в текущем объекте mailitem, мне удалось использовать отражение, чтобы получить свойство «Sender». Но когда я запускаю следующий код, значение объекта propertyInfo становится нулевым. Я не могу понять почему.

Вот код

//...
if (mailItem != null)
{
      var mailItem2 = GetNewObject(mailItem, "Sender", intArray);   
//...


public static object GetNewObject(Outlook.MailItem o, string popertyName, object[] parameters)
        {
            try
            {               
                PropertyInfo propertyInfo = o.GetType().GetProperty(popertyName); // This object is getting null
                return propertyInfo.GetType().GetProperty(popertyName).GetValue(o,parameters) as Outlook.MailItem;

            }
            catch (MissingMethodException ex)
            {
                // discard or do something
                Debug.DebugMessage(2, "AddinModule : Error in GetNewObject() : " + ex.Message);
                return null;
            }
        }

Пожалуйста, посоветуй мне. Спасибо.


person Kushan Randima    schedule 18.11.2015    source источник
comment
Поскольку вы отметили свой вопрос как Outlook-Redemption, ищете ли вы решение Redemption?   -  person Dmitry Streblechenko    schedule 18.11.2015
comment
@DmitryStreblechenko, да, был. Потому что меня всегда устраивает искупление. Но ваш комментарий о PR_SENDER_ENTRYID полностью отвечает на любой вопрос. Большое спасибо за это.   -  person Kushan Randima    schedule 20.11.2015
comment
@DmitryStreblechenko: Если вам интересно, пожалуйста, сделайте это: stackoverflow.com/documentation/outlook-addin/commit   -  person Kushan Randima    schedule 27.07.2016


Ответы (2)


Вы можете получить AddressEntry отправителя, используя свойство Sender следующим образом:

Outlook.AddressEntry senderAddressEntry = mailItem.Sender;
person Yacoub Massad    schedule 18.11.2015
comment
Спасибо. Я тоже думал об этом. Но собственности Sender нет в почтовом элементе. - person Kushan Randima; 18.11.2015
comment
Что ты имеешь в виду? Например, он возвращает null? Это сообщение пришло из почтового ящика Exchange? - person Yacoub Massad; 18.11.2015
comment
Свойство MailItem.Sender было добавлено в Outlook 2010? Вы используете старую версию Outlook или просто старую dll взаимодействия? - person Dmitry Streblechenko; 18.11.2015
comment
@DmitryStreblechenko, мне тоже нужно поддерживать старые версии Outlook. Итак, мне пришлось выбрать минимальную версию Outlook 2007. Я попытался отразить, чтобы получить свойство Sender. Я обновлю вопрос для получения дополнительной информации. Спасибо за внимание - person Kushan Randima; 19.11.2015
comment
@Yacoub Massad, Visual Studio intellisense не распознает отправителя как свойство mailitem. Причина в том, что я использую более старую версию сборки. К сожалению, я не могу это изменить. Я пытаюсь использовать отражение, чтобы получить свойство отправителя. - person Kushan Randima; 19.11.2015
comment
В Outlook 2007 используйте MailItem.PropertyAccessor для получения свойства PR_SENDER_ENTRYID (имя DASL http://schemas.microsoft.com/mapi/proptag/0x0C190102), преобразуйте его в шестнадцатеричный формат с помощью PropertyAccessor.BinaryToString, используйте его для вызова Namespace.GetAddressEntryFromID .. - person Dmitry Streblechenko; 19.11.2015

Прочитав комментарий «Дмитрия Стреблеченко», я смог разработать для себя полностью рабочее решение. Вот код

        private void adxRibBtnAddEmailAddress_OnClick(object sender, IRibbonControl control, bool pressed)
        {
            Outlook.MailItem mailItem = null;
            Outlook.Recipient recipient = null;
            string recipientsEmail = "";
            string sendersEmail = "";

            try
            {               
                mailItem = OutlookHelper.GetSelectedMailItem();
                if (mailItem != null)
                {
                    if (mailItem.SenderEmailType == "EX")
                        sendersEmail = GetSenderEmailAddress(mailItem);
                    else
                        sendersEmail = mailItem.SenderEmailAddress;

                    if (!string.IsNullOrEmpty(sendersEmail))
                    {
                        if (sendersEmail == Globals.OLCurrentUserEmail) // Sent mail
                        {
                            recipient = mailItem.Recipients[1];
                            if (recipient != null)
                            {
                                recipientsEmail = OutlookHelper.GetAddress(ref recipient);
                                if (!string.IsNullOrEmpty(recipientsEmail))
                                {
                                    // Do Something
                                }
                            }
                        }
                        else // inbox mail
                        {
                            // Do Something
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.DebugMessage(2, "AddinModule : Error in adxRibBtnsddemailaddress_OnClick() : " + ex.Message);
            }
            finally
            {
                if (recipient != null) Marshal.ReleaseComObject(recipient);
                if (mailItem != null) Marshal.ReleaseComObject(mailItem);
                Cursor.Current = Cursors.Default;
            }
        }

        private string GetSenderEmailAddress(Outlook.MailItem oM)
        {
            Outlook.PropertyAccessor oPA = null;
            Outlook.AddressEntry oSender = null;
            Outlook.ExchangeUser oExUser = null;

            string SenderID;
            string senderEmailAddress;

            try
            {
                // Create an instance of PropertyAccessor 
                oPA = oM.PropertyAccessor;
                // Obtain PidTagSenderEntryId and convert to string 
                SenderID = oPA.BinaryToString(oPA.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0C190102"));
                // Obtain AddressEntry Object of the sender 
                oSender = Globals.ObjNS.GetAddressEntryFromID(SenderID);

                oExUser = oSender.GetExchangeUser();
                senderEmailAddress = oExUser.PrimarySmtpAddress;

                return senderEmailAddress;
            }
            catch (Exception ex)
            {
                Debug.DebugMessage(2, "AddinModule : Error in adxRibBtnAddGenInteraction_OnClick() : " + ex.Message);
                return null;
            }
            finally
            {
                if (oExUser != null) Marshal.ReleaseComObject(oExUser);
                if (oSender != null) Marshal.ReleaseComObject(oSender);
                if (oPA != null) Marshal.ReleaseComObject(oPA);                
            }
        }
person Kushan Randima    schedule 20.11.2015