如何在发送后立即保存已发送的电子邮件?

时间:2017-10-25 23:43:58

标签: c# outlook office-interop msg

我在Outlook中有一个单独的.Net应用程序。我想使用Office.Interop(避免redmeption.dll)发送并保存该应用程序发送的电子邮件。但是当我尝试在Send()函数之后保存电子邮件时,我得到了以下异常:"该项目已被移动或删除。"

似乎Outlook在发送后移动了电子邮件项目。

所以,任何人都可以建议我如何保存"已发送"电子邮件项目到磁盘?

我需要保存的msg文件状态为“已发送”。所以,保存Item_Send事件对我的情况不起作用。谢谢!

这是我的代码

     public bool SendAndSavAs(Outlook.Account emailAccount, string toEmailAddress)
    {
        Outlook.MailItem mailItem = null;
        try
        {
            mailItem = OutlookApp.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
            mailItem.Subject = "Test Subject";
            mailItem.BodyFormat = Outlook.OlBodyFormat.olFormatPlain;
            mailItem.Body = "Test Body";

            // Add recipient using display name, alias, or smtp address
            mailItem.Recipients.Add(toEmailAddress);
            mailItem.Recipients.ResolveAll();
            mailItem.SendUsingAccount = emailAccount;

            // send email
            mailItem.Send();

            // save the Sent mail to local disk  (****but have exception occurs ****)
            mailItem.SaveAs(@"c:\temp\test.msg");

            return true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            ReleaseComObject(mailItem);
        }
    }

2 个答案:

答案 0 :(得分:0)

您需要处理Sent Items文件夹中的ItemAdd事件。在事件处理程序中,您可以调用SaveAs方法。

此外,您可以考虑使用MailItem类的SaveSentMessageFolder属性,该属性允许设置一个Folder对象,该对象表示在发送后将保存电子邮件副本的文件夹。

答案 1 :(得分:0)

在您致电发送后,您可以对该消息做的唯一事情是释放您对它的引用 - 它现在属于传输提供商。

另请注意,“发送”是异步的 - 邮件将被发送,并且仅在发送邮件后才会填充其与发件人相关的属性。您有机会在该状态下访问该消息是Items.ItemAdd事件触发已发送邮件文件夹的时间。

相关问题