C# Класс обработки сообщений IPM.Outlook.Recall - PullRequest
1 голос
/ 09 января 2020

У меня есть консольное приложение, использующее ссылку Outlook = Microsoft.Office.Interop.Outlook, которая перебирает почтовые элементы в наборе общих почтовых ящиков и сохраняет поля сообщения в базу данных, сообщение в указанный путь к файлу c для справки. в приложении рабочего процесса, а затем перемещает электронные письма в подпапку. Проблема, с которой я сталкиваюсь, заключается в том, что отправитель возвращает сообщение (MessageClass = "IPM.Outlook.Recall"). Программа останавливается, потому что она ждет от меня, чтобы нажать «ОК» в Outlook. Как заставить мое консольное приложение программно выполнить нажатие кнопки «ОК» в Outlook, чтобы программа могла перейти к следующему письму?

Я провел обширные поиски в течение 3 дней, чтобы найти решение этой проблемы. без удачи Это в Windows 10, Outlook 2016.

Вот мой код:

foreach (Object itm in inbox.Items)
            {
                if (itm is Outlook.MailItem)
                {
                    //Select Email messages from Inbox
                    Outlook.MailItem msg = (Outlook.MailItem)itm;
                    if (msg.MessageClass == "IPM.Outlook.Recall")
                    { 
                         ///Solution for handling recall?
                    }
                    else
                    {
                        //Extract fields from email
                        EmailMessageFields emailFields = new EmailMessageFields();
                        emailFields.Source = workflow;
                        emailFields.MessageFields(msg);
                        string checkSender = SenderCheck(msg, job);
                        if (checkSender == "")
                        {
                            bool saveSuccess = SaveEmailMessage(msg, boxName, emailFields.ConversationIx);
                            if (!saveSuccess)
                            {
                                msg.Move(loadError);
                            }
                            else
                            {
                                //Check if email already uploaded then flag as duplicate and move if true
                                bool dupeCheck = CheckDuplicates(emailFields.ConversationIx);
                                if (dupeCheck == true)
                                {
                                    msg.Move(wsco);
                                }
                                else
                                {
                                    //Insert extracted fields into Email table
                                    bool results = InsertMessageFields(emailFields);
                                    if (results)
                                    {
                                        //Move Email to subfolder
                                        msg.Move(wsco);
                                    }
                                    else
                                    {
                                        //If unable to save, move to Load Errors folder
                                        msg.Move(loadError);
                                    }

                                }
                            }
                        }
                        else
                        {
                            if (checkSender == "Not Loaded")
                            {
                                msg.Move(notloaded);
                            }
                            else if (checkSender == "Faxes")
                            {
                                Outlook.MAPIFolder faxFolder = wsco.Folders["Faxes"];
                                msg.Move(faxFolder);
                            }                            
                        }
                    }
                }
                else if (itm is Outlook.AppointmentItem)
                {
                    Outlook.AppointmentItem aitem = (Outlook.AppointmentItem)itm;
                    aitem.Move(notloaded);
                }
                else if (itm is Outlook.ReportItem)
                {
                    //Check if email is mail item or return system message
                    Outlook.ReportItem ritem = (Outlook.ReportItem)itm;
                    ritem.Move(notloaded);
                }
            }

1 Ответ

0 голосов
/ 17 января 2020

Нашел решение моего вопроса на форумах MSDN. Вместо того чтобы пытаться обработать отзыв, я решил пропустить его, добавив метод Restrict. Мой обновленный код:

 foreach (Object itm in inbox.Items.Restrict("[MessageClass] = 'IPM.Note'"))
                    {
                        if (itm is Outlook.MailItem)
                        {
                            //Select Email messages from Inbox
                            Outlook.MailItem msg = (Outlook.MailItem)itm;

                              .......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...