C# 处理消息 Class IPM.Outlook.Recall
C# Handling Message Class IPM.Outlook.Recall
我有一个使用 Outlook 的控制台应用程序 = Microsoft.Office.Interop.Outlook 引用循环访问一组共享收件箱中的邮件项目并将消息字段保存到数据库,将消息保存到特定文件路径以供在工作流中引用应用程序,然后将电子邮件移动到子文件夹。我遇到的问题是发件人撤回邮件时 (MessageClass = "IPM.Outlook.Recall")。该程序停止,因为它正在等待我在 Outlook 中单击 "OK"。如何让我的控制台应用程序以编程方式执行按钮 "OK" 在 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);
}
}
在 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;
.......
我有一个使用 Outlook 的控制台应用程序 = Microsoft.Office.Interop.Outlook 引用循环访问一组共享收件箱中的邮件项目并将消息字段保存到数据库,将消息保存到特定文件路径以供在工作流中引用应用程序,然后将电子邮件移动到子文件夹。我遇到的问题是发件人撤回邮件时 (MessageClass = "IPM.Outlook.Recall")。该程序停止,因为它正在等待我在 Outlook 中单击 "OK"。如何让我的控制台应用程序以编程方式执行按钮 "OK" 在 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);
}
}
在 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;
.......