【问题标题】:Outlook Addin shows same dialog in other opened OutlookOutlook 插件在其他打开的 Outlook 中显示相同的对话框
【发布时间】:2015-03-05 22:44:09
【问题描述】:

我有一个 Outlook 插件,每次用户发送消息时都会显示一个对话框。

我正在打开对话框并获取有关 onItemSend 事件的消息信息。这按预期工作:发送消息后,它会打开一个对话框,其中包含一些信息,例如收件人、主题等。

问题是当用户保持 Outlook 打开并从其他来源(例如手机或平板电脑)发送消息时。用户发送消息后,打开的 Outlook 将显示对话框,即使它不是从该实例发送的。

例如,有一个用户在家中和办公室安装了插件。他让家里的 Outlook 保持打开状态,在忙碌了一天的工作后,发送了几条消息并显示了对话框,他在家里检查了自己的 Outlook。这将是几个打开的对话框,关于他白天发送的消息。

有没有办法限制对话框?打开用户发送消息的对话框?这样用户在任何其他打开的 Outlook 中都不会有任何对话框...

谢谢

编辑

刚刚检查了我的代码,但有一个误解(我的部分偏离了课程)。我从方法中删除了一些代码,只是为了更容易阅读......

代码中有两个事件处理程序:

Outlook.Folder sentbox;
Outlook.Items myOlItems = null;

this.itemsendhndler = newicrosoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
this.Application.ItemSend += itemsendhndler; 

this.hndler = new Outlook.ItemsEvents_ItemAddEventHandler(Application_ItemAdd);
sentbox = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
myOlItems = sentbox.Items;
myOlItems.ItemAdd += this.hndler;

然后,在 Application_ItemAdd 中有 onItemSend 方法,我以为是 Application_ItemSend...

void Application_ItemAdd(object Item)
{
    this.onItemSend(Item);
}


private void Application_ItemSend(object item, ref bool Cancel)
{
    Outlook.MailItem mail = item as MailItem;

    if (mail == null)
        return;

    //Make sure this is a E-mail message
    if (string.Compare(OutlookItemHelper.GetMessageClass(mail), "IPM.Note") != 0)
        return;

    mail.DeleteAfterSubmit = false;
    Outlook.Folder sentFolder = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
    if (sentFolder != null)
        mail.SaveSentMessageFolder = sentFolder; // override the default sent items location
    Cancel = false;
}

private void onItemSend(object Item)
{
    Outlook.MailItem itm = null;
    itm = (Outlook.MailItem)Item;

    using (ExampleDialog dlg = new ExampleDialog())
    {
        //code after actions...
    }
}

无论如何,对话框没有在 Application_ItemSend 事件中打开。我的坏人……我今天学到了新东西!

谢谢大家,我为新手的问题道歉......

【问题讨论】:

  • 不可能...插件里有什么代码?
  • 嗨,尤金。我刚刚检查了代码,并确认对话框是在 itemAdd 而不是 itemSend 中打开的。谢谢您的帮助。我已经编辑了我的问题,添加了代码。

标签: c# email outlook outlook-addin


【解决方案1】:

你确定吗? Application.ItemSend 只会在实际发送消息的 Outlook 实例上触发。另一方面,Sent Items 文件夹上的 Items.ItemAdd 事件将在 Outlook 的每个实例中触发。这是你的代码在做什么吗?

【讨论】:

  • 嗨,迪米特里。我刚刚检查了代码,并确认对话框是在 itemAdd 而不是 itemSend 中打开的。我将进行此更改,在 Application.ItemSend 事件中打开对话框。感谢您的帮助。
  • 嘿,Dimitry,在调试完代码后,我可以弄清楚发生了什么。我们曾经在 Application.ItemSend 事件中打开对话框,但由于我们需要将消息的副本保存为附件,因此消息本身添加了“此消息尚未发送”。然后我们将打开的对话框移至 Items.ItemAdd 事件,以便能够获得“已发送”状态的消息。交易是:从 itemend 打开,将显示单个对话框和“未发送”消息。从 itemadd 打开,将显示多个对话框和“已发送”消息。你有什么建议吗?谢谢
  • 在 ItemSend 事件中使用特殊属性(某种 id,guid 会很好)标记传出消息,并将 id 添加到列表中。当 ItemAdd 事件触发时,您可以读取该属性并查看它是否在列表中。如果是,则弹出对话框,如果不是,则忽略该消息。这样对话框只会在实际发送消息的实例中弹出。
  • 多么棒的解决方案!谢谢德米特里!你太棒了!
  • 确保您使用的是 PropertyAccessot.SetProperty(选择一个命名的属性 guid 和 id),而不是 UserProperties。添加因为这会导致您的消息以 RTF (TNEF) 格式发出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多