C# ';项目被移动或删除';Outlook.mailItem

C# ';项目被移动或删除';Outlook.mailItem,c#,outlook,C#,Outlook,我创建的outlook邮件如下所示: Outlook.Application outlookApp = new Outlook.Application(); Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem); mailItem.Subject = mailSubject; mailItem.To = ""; mailItem.Attachm

我创建的outlook邮件如下所示:

 Outlook.Application outlookApp = new Outlook.Application();
 Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
 mailItem.Subject = mailSubject;
 mailItem.To = "";
 mailItem.Attachments.Add(totalPath);
 mailItem.Body = mailBody;
 mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
 mailItem.Display(true);
 //Mail is send succesfully?
是否可以检查邮件是否成功发送或取消

编辑: 当我执行以下代码时,出现错误“项目已移动或删除”

Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.Subject = mailSubject;
mailItem.To = "";
mailItem.CC = "EDI.Orders@trust.com";
mailItem.Attachments.Add(totalPath);
mailItem.Body = mailBody;
mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
mailItem.Display(true);
//Mail is send succesfully?
if (mailItem.Sent)
{
   MessageBox.Show("Sended");
}
else
{
   MessageBox.Show("canceled");
}
错误出现在mailItem.Sent。
我的问题是mailItem.Sent如何工作?

属性显示电子邮件是否已发送

此外,您还可以附加到
mailItem.Write
事件。(但要小心——也会被要求只进行储蓄等等)


mailItem.Sent
属性显示电子邮件是否已发送

此外,您还可以附加到
mailItem.Write
事件。(但要小心——也会被要求只进行储蓄等等)

属性返回一个布尔值,该值指示消息是否已发送

属性返回一个布尔值,该值指示消息是否已发送

谢谢你的提问

MailItem.Sent属性(Outlook)

返回一个布尔值,该值指示消息是否已发送。 只读

调用Display后检查此属性时,我怀疑由于该项不再处于活动状态,对
Sent
的调用失败。可以确认邮件是否确实已发送的一种方法是处理Outlook.Application类的事件

        Outlook.Application outlookApp = new Outlook.Application();

        outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(outlookApp_ItemSend);

        Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
        mailItem.Subject = "Test";
        mailItem.To = "a.b@c.com";
        mailItem.CC = "";

        mailItem.Body = "Test Message";
        mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
        mailItem.Display(true);
并在发送事件处理程序中检查消息

void outlookApp_ItemSend(object Item, ref bool Cancel)
{
    if (Item is Outlook.MailItem)
    {
        string subject = ((Outlook.MailItem)Item).Subject;


        if (subject == "Test")
        {
            //Item sent
        }


    }
}
谢谢你的提问

MailItem.Sent属性(Outlook)

返回一个布尔值,该值指示消息是否已发送。 只读

调用Display后检查此属性时,我怀疑由于该项不再处于活动状态,对
Sent
的调用失败。可以确认邮件是否确实已发送的一种方法是处理Outlook.Application类的事件

        Outlook.Application outlookApp = new Outlook.Application();

        outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(outlookApp_ItemSend);

        Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
        mailItem.Subject = "Test";
        mailItem.To = "a.b@c.com";
        mailItem.CC = "";

        mailItem.Body = "Test Message";
        mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
        mailItem.Display(true);
并在发送事件处理程序中检查消息

void outlookApp_ItemSend(object Item, ref bool Cancel)
{
    if (Item is Outlook.MailItem)
    {
        string subject = ((Outlook.MailItem)Item).Subject;


        if (subject == "Test")
        {
            //Item sent
        }


    }
}

这是一个不会阻止outlook的解决方案

class Class1
{
    static bool mailWasSent = false;
    private static System.Windows.Forms.ApplicationContext _context;
    static void Main(string[] args)
    {
        Outlook.Application outlookApp = new Outlook.Application();
        Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
        mailItem.Subject = "My Subject";
        mailItem.To = "";
        mailItem.Attachments.Add(@"C:\test.pdf");
        mailItem.Body = "This is my Body-Text";
        mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
        ((Outlook.ItemEvents_10_Event)mailItem).Close += MailItem_onClose;
        ((Outlook.ItemEvents_10_Event)mailItem).Send += MailItem_onSend;

        //mailItem.Display(true);   // This call will make mailItem MODAL - 
        // This way, you are not allowed to create another new mail, ob browse Outlook-Folders while mailItem is visible

        // Using ApplicationContext will wait until your email is sent or closed without blocking other Outlook actions.
        using (_context = new System.Windows.Forms.ApplicationContext())
        {
            mailItem.Display();
            System.Windows.Forms.Application.Run(_context);     
        }
        if (mailWasSent)
        {
            System.Windows.Forms.MessageBox.Show("Email was sent");
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("Email was NOT sent");
        }
    }

    private static void MailItem_onSend(ref bool Cancel)
    {
        mailWasSent = true;
    }

    private static void MailItem_onClose(ref bool Cancel)
    {
        _context.ExitThread();
    }
}

这是一个不会阻止outlook的解决方案

class Class1
{
    static bool mailWasSent = false;
    private static System.Windows.Forms.ApplicationContext _context;
    static void Main(string[] args)
    {
        Outlook.Application outlookApp = new Outlook.Application();
        Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
        mailItem.Subject = "My Subject";
        mailItem.To = "";
        mailItem.Attachments.Add(@"C:\test.pdf");
        mailItem.Body = "This is my Body-Text";
        mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
        ((Outlook.ItemEvents_10_Event)mailItem).Close += MailItem_onClose;
        ((Outlook.ItemEvents_10_Event)mailItem).Send += MailItem_onSend;

        //mailItem.Display(true);   // This call will make mailItem MODAL - 
        // This way, you are not allowed to create another new mail, ob browse Outlook-Folders while mailItem is visible

        // Using ApplicationContext will wait until your email is sent or closed without blocking other Outlook actions.
        using (_context = new System.Windows.Forms.ApplicationContext())
        {
            mailItem.Display();
            System.Windows.Forms.Application.Run(_context);     
        }
        if (mailWasSent)
        {
            System.Windows.Forms.MessageBox.Show("Email was sent");
        }
        else
        {
            System.Windows.Forms.MessageBox.Show("Email was NOT sent");
        }
    }

    private static void MailItem_onSend(ref bool Cancel)
    {
        mailWasSent = true;
    }

    private static void MailItem_onClose(ref bool Cancel)
    {
        _context.ExitThread();
    }
}

当我使用MaiItem.Sent时,错误显示为“项目已移动或删除”。当我使用MaiItem.Sent时,错误显示为“项目已移动或删除”