У меня есть консольное приложение, использующее ссылку 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);
}
}