有没有办法标记Outlook.MailItem在保存之前已经发送过?

时间:2016-10-27 06:50:25

标签: c# .net plugins vsto outlook-addin

我正在构建一个Outlook 2010插件,以将其与一些商业软件集成,并创建了一个自定义的ItemSend事件,并使用jason从后端应用了我自己的Web服务。我能够将邮件项目保存为.msg文件(在用户临时文件夹中)。但当我尝试打开它问题是,然后Outlook打开它作为仍在撰写的消息,用户可以非常轻松地再次点击发送按钮。

有没有办法在项目保存之前标记该项目已被发送,因此在它作为可读电子邮件而不是组合内电子邮件打开后打开时会被打开?

我在下面分享我的代码,请指导我完成这个

 void Application_ItemSend(object Item, ref bool Cancel)
    {
        this.passwordpopUpObj = new Forms.PasswordInputPopUp();
        passwordpopUpObj.ShowDialog();
       passwordpopUpObj.StartPosition = FormStartPosition.CenterParent;

        Outlook.MailItem mail = Item as Outlook.MailItem;

        if (passwordpopUpObj.textBox1.Text != "")
        {
            Cancel = true;
            BussinessClass cs = new BussinessClass();
            string msg = cs.ServerCallSendMail(mail.Subject, mail.To, mail.CC, attachcount, passwordpopUpObj.textBox1.Text);

            if (msg == "Success")
            {
                mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "file3" + @".msg");

                MessageBox.Show("Mail Send SuccessFully through Plugin");
                mailItem = Item as Outlook.MailItem;
                Cancel = true;                  

                foreach (Outlook.Store store in OutlookObject.Session.Stores)
                {
                    if (store.DisplayName == "Email Cipher")
                    {
                        Outlook.MAPIFolder pstRootFolder = store.GetRootFolder();

                        foreach (Folder folder in  pstRootFolder.Folders)
                        {
                            MessageBox.Show(store.FilePath + folder.FolderPath);
                            if (folder.Name == "Email cipher Sent")
                            {
                                MessageBox.Show( Directory.Exists(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails").ToString());

                                mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "file3" + @".msg", Outlook.OlSaveAsType.olMSG);


                            }
                        }
                    }
                }
            }

            //

            else
            {
                Cancel = true;
                MessageBox.Show("Mail Cannot be sent through plugin");

            }
        }

        else
        {
            MessageBox.Show("mail Send Normally");
            Cancel = false;

            mail.Categories = "Sent";

            mail.SaveAs(@"E:\Plugin.net\EmailCipherPlugin\EmailCipherPlugin\Mails" + "\\" + "outlookfile" + @".msg", Outlook.OlSaveAsType.olMSG);
        }

}

1 个答案:

答案 0 :(得分:0)

在扩展MAPI级别上,只有在第一次保存邮件之前,才能从MSGFLAG_UNSENT属性中删除PR_MESSAGE_FLAGS位。此限制仅适用于Outlook文件夹中的邮件,而不适用于独立的MSG文件。

在您的特定情况下,您可以

  1. 等待邮件移至“已发送邮件”文件夹并将MSG文件保存在那里

  2. 如果要在保存后调整MSG文件,可以使用扩展MAPI(仅限C ++或Delphi - OpenIMsgOnIStg /等),也可以使用Redemption(任何语言) - 使用RDOSessionGetMessageFromMsgFile,将RDOMailSent属性设置为true,调用RDOMailSave