【问题标题】:Add a callback to send click event添加回调以发送点击事件
【发布时间】:2019-02-15 09:15:45
【问题描述】:

我希望当用户发送他的邮件时,会制作一份副本并发送给另一个人,以便存档。用户使用关键字来指定是否应归档邮件。 (我需要在第二封邮件中添加一些数据,这些数据不应该出现在第一封邮件中)

所以我在 C# 中开发了一个插件,我在其中拦截单击“发送”事件以复制邮件并发送它。只是,在此事件中无法发送第二封电子邮件。所以我想为我的事件添加一个回调,这样一旦发送了第一封电子邮件,就发送了第二封,但是我无法实现对我的代码的回调(我不知道如何在事件上做到这一点,或者即使有可能)

    Outlook.MailItem mailCopy; //Copy of my first mail
    bool sndCopy = false;
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); //event click send
    }
    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
    }
    private void Application_ItemSend(object Item, ref bool Cancel)
    {
        Outlook.Application oApp;
        Outlook._NameSpace oNS;
        Outlook.MAPIFolder oFolder;
        oApp = new Outlook.Application();
        oNS = (Outlook._NameSpace)oApp.GetNamespace("MAPI");

        Outlook.MailItem mail1 = (Outlook.MailItem)Item;


        this.mailCopy = (Outlook.MailItem)Item;

        Outlook.MailItem mail = (Outlook.MailItem)Item;

        foreach(Outlook.Recipient rcp in mail.Recipients){
           if(rcp.Address == "Robots"){
               this.sndCopy = true;
               break;
            }
        }

    }

必须发送两封电子邮件,第一封可以发送给任何人,第二封必须发送给机器人以存档在电子邮件地址(例如robot@google.fr)以及其他无法发送的附加数据出现在1号

编辑解决方案: 当我将消息保存在目录中时,我通过在创建文件时添加一个事件来修改我的代码

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
        fileSystemWatcher.Path = path;


        this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); //event click send

        fileSystemWatcher.Created += FileSystemWatcher_Created;
        fileSystemWatcher.EnableRaisingEvents = true;
    }

    private void Application_ItemSend(object Item, ref bool Cancel)
    {


        Outlook.Application oApp;
        Outlook._NameSpace oNS;
        oApp = new Outlook.Application();

        oNS = (Outlook._NameSpace)oApp.GetNamespace("MAPI");

        Outlook.MailItem mail = (Outlook.MailItem)Item;

        mail.SaveAs(path + "\\files.msg", Microsoft.Office.Interop.Outlook.OlSaveAsType.olMSG);

    }

    private void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
    {
        Outlook.Application oApp = new Outlook.Application();
        Outlook.MailItem msg = (Outlook.MailItem)oApp.CreateItemFromTemplate(path + "\\files.msg", Type.Missing);
        msg.Send();
        File.Delete(path + "\\files.msg");
    }

【问题讨论】:

    标签: c# callback outlook-addin


    【解决方案1】:

    创建一个计时器(使用 Forms 命名空间中的 Timer 类,因为它在主线程上触发)并在 Application.ItemSend 事件中启用它。创建新消息,保存它,将其条目 ID 存储在列表中。当计时器触发时,禁用计时器,使用列表中保存的条目 ID 打开消息 (Namespace.GetItemfromID),发送它们,清除列表。

    【讨论】:

    • 我不能使用 async、await 或 AsyncCallback 之类的东西吗?
    • 没有。 Outlook 对象模型不能用于辅助线程。
    • 我找到了另一个解决方案,我刚刚发布了!感谢您的帮助和信息!
    • 这相当于一个定时器——你在同一个线程上得到一个异步回调。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2015-06-06
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多