【发布时间】:2017-06-07 13:50:03
【问题描述】:
我想使用 Outlook 向多个客户发送电子邮件。为此,我的程序中有一个方法可以迭代收件人、编写消息正文并将第一条消息显示为预览。
这是该方法的简化版本:
public void CreateMails(List<InfoMailRecipient> recipients)
{
Microsoft.Office.Interop.Outlook.Application outlook = new Microsoft.Office.Interop.Outlook.Application();
foreach (InfoMailRecipient recipient in recipients)
{
MailItem mail = outlook.CreateItem(OlItemType.olMailItem);
mail.SentOnBehalfOfName = "Sending User";
mail.BCC = recipient.EMailAddress;
mail.Subject = "TEST";
mail.BodyFormat = OlBodyFormat.olFormatHTML;
mail.HTMLBody = "<html><body>test</body></html>";
mail.Display(true);
}
}
当显示 Outlook 消息窗口时,无论我是关闭窗口还是单击“发送”,只要创建下一个MailItem,我就会得到一个异常“RPC 服务器不可用”。显然是因为 Outlook 已关闭。我发现当我删除线时
mail.Display(true);
只需致电.Send();,所有消息都会正确发送。但随后 Outlook 保持打开状态。即使我在foreach 循环之后调用.Quit()。
如何正确处理这个 Outlook 实例?
更新 1 - 手动 GC 调用
public void CreateMails(List<InfoMailRecipient> recipients)
{
Microsoft.Office.Interop.Outlook.Application outlook = new Microsoft.Office.Interop.Outlook.Application();
foreach (InfoMailRecipient recipient in recipients)
{
MailItem mail = outlook.CreateItem(OlItemType.olMailItem);
mail.SentOnBehalfOfName = "Sending User";
mail.BCC = recipient.EMailAddress;
mail.Subject = "TEST";
mail.BodyFormat = OlBodyFormat.olFormatHTML;
mail.HTMLBody = "<html><body>test</body></html>";
mail.Send();
}
outlook.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
}
Outlook 继续运行。
【问题讨论】:
-
每个收件人都收到完全相同的消息吗?
-
不,消息应该是个性化的
-
您能否尝试删除 Display 调用,添加对 Quit 的调用,然后添加对 GC.Collect() 和 GC.WaitForPendingFinalizers() 的调用。如果您随后退出此功能,Outlook 会关闭吗?
-
很遗憾没有效果。
-
你能用你尝试的第二次代码尝试更新帖子吗?只是为了展示已经尝试过和尚未尝试过的内容?
标签: c# email outlook office-interop