【问题标题】:Multiple Open Email Items in One Item_Send Sub Issue一个项目中的多个打开的电子邮件项目_发送子问题
【发布时间】:2014-01-30 05:03:54
【问题描述】:

目前我的代码检查电子邮件(在 Item_Send 事件上)以查看它是否有附件,然后给出一个条件表单来加密和发送、发送未加密或取消发送。它还在正文中搜索 SSN,为用户提供相同的表单弹出窗口。除非用户同时打开两个电子邮件窗口/实例,否则所有工作都按广告宣传。例如,如果电子邮件#1 有附件并且电子邮件#2 位于后台,如果我要尝试发送电子邮件#1 并选择取消发送,它会返回到电子邮件#1 而不发送(如广告所示),但是,当您返回电子邮件#2 并尝试发送(与电子邮件#1 无关)时,它也不会发送。我将在下面显示代码,但我使用“Cancel=True”命令停止电子邮件,但这会停止发送操作并且检查器保持打开状态,因此不允许我发送任何可能已经打开的电子邮件时间。有什么想法吗?我怎样才能让这个 Item_Send 事件只处理 CURRENT Outlook.MailItem 实例而不是另一个可能同时打开的实例。谢谢!我遗漏了很多代码,这只是我遇到的问题的一部分。 SSNBtnPress=3 表示取消=True

Public Sub Application_ItemSend(ByVal Item As Object, _
    ByRef Cancel As Boolean) Handles Application.ItemSend
    Dim mailItem As Outlook.MailItem = TryCast(Item, Outlook.MailItem)
    If mailItem IsNot Nothing Then
  frm1.ShowDialog()
        If (SSNbtnPress = 1) Then
            mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/x-PII", "Encryptclicked")
            If RegexObj1.IsMatch(mailItem.Body) Then
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Cancel = False
            ElseIf RegexObj1.IsMatch(mailItem.Subject) Then
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Cancel = False
            Else
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Dim addToBody As String = "Test" + vbNewLine + vbNewLine + mailItem.Body
                Dim addtoSubject As String = "Test " + mailItem.Subject
                mailItem.Subject = addtoSubject
                mailItem.Body = addToBody
                Cancel = False
            End If
        End If
    End If
    If (SSNbtnPress = 2) Then
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/x-PII", "SUclicked")
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 2)
        Cancel = False
        Exit Sub
    ElseIf (SSNbtnPress = 3) Then
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 2)
        Cancel = True
        Exit Sub
    End If
End Sub

结束类

【问题讨论】:

    标签: vba vb.net email outlook outlook-addin


    【解决方案1】:

    如果您只想检查正在发送的项目是否与发送时打开的项目相对应,则需要查看 ActiveInspector

    您可以通过 Outlook 应用程序的引用变量访问活动检查器,并且可以通过项目本身访问 Application 变量。

    引用 ActiveInspector 后,您可以获取其 CurrentItem 并将其与正在发送的项目进行比较,例如

    Dim isItemBeingSentCurrent As Boolean = mailItem.Application.ActiveInspector.CurrentItem Is mailItem
    

    【讨论】:

    • 简单地将这一行放入会引发异常,但不会在 VS 调试器中,这很奇怪,而是在加载到 Outlook 时显示找不到。
    • 已加载,现在出现此异常:未为类型“MailItem”和类型“MailItem”定义运算符“=”。
    • 哦,我在回复中混淆了 VB.NET 和 VBA,因为我只在 VBA 中测试过。我已经编辑了回复。
    • 那和 mailItem.Application.ActiveInspector.CurrentItem 是 mailItem) 有效(我认为哈哈)。但是我仍然有一个问题,如果我为这封特定的电子邮件单击取消(取消=真)。即使我打开一个新窗口,它仍然会将该 cancel=true 命令发送到新窗口?我是否必须在 ITEM_SEND 事件之后添加一个 IF 语句来说明 If isItemBeingSendCurrent= True Then
    • 当我假设您希望此处理程序 (Item_Send) 在不处理当前打开的项目时转义时,我是否正确理解了您帖子的措辞?在这种情况下,您只需在方法的开头执行以下操作: If(isItemBeingSentCurrent) Then Exit Sub
    【解决方案2】:

    我认为某些属性是从 mail1 存储的,并且在发送其他项目时不会重置。因此,不会发送所有进一步的邮件

    【讨论】:

    • 这正是我的问题所在,我有一个 IF 语句处于打开状态,因此为将来的电子邮件设置了一个全局变量。坏的!将 ELSE 语句放入 Cancel=False Exit Sub,就成功了。感谢用户“lol”。
    • 很高兴,我曾经遇到过完全相同的问题,因此很容易猜到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2010-09-18
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多