如果手动发送电子邮件,则触发代码以记录

Posted

技术标签:

【中文标题】如果手动发送电子邮件,则触发代码以记录【英文标题】:Trigger code to record if email sent manually 【发布时间】:2016-10-24 02:21:12 【问题描述】:

我使用 Excel VBA 发送电子邮件。我想记录下消息是否已经发送。

我从another post 获取了一些代码。

我按照描述创建了类,并添加了一些额外的位以查看它是否正常工作。 它初始化,但没有其他任何事情发生。发送邮件后,该类在后台保持打开状态,所以我必须在 VBE 中停止它。

这里是调用代码:

Sub SendProc2(add As String)

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next

    With OutMail
        .To = add
        .CC = ""
        .BCC = ""
        .Subject = ThisWorkbook.Name
        .Body = Application.WorksheetFunction.VLookup(Worksheets("Data").Range("B135"), Range("formversion"), 2, False) _
        & " Attached:" & vbCrLf & vbCrLf & ThisWorkbook.Name
        .Attachments.add ActiveWorkbook.FullName
        .Display   'or use .Send
    End With

    Dim CurrWatcher As EmailWatcher
    Set CurrWatcher = New EmailWatcher
    Set CurrWatcher.TheMail = OutMail

    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
    
    Unload UserForm4

End Sub

名为EmailWatcher的类模块代码:

Option Explicit
Public WithEvents TheMail As Outlook.MailItem

Private Sub Class_Terminate()

    Debug.Print "Terminate " & Now()

End Sub

Private Sub TheMail_Send(Cancel As Boolean)

    Debug.Print "Send " & Now()
    'enter code here
    
End Sub

Private Sub Class_Initialize()

    Debug.Print "Initialize " & Now()

End Sub

它似乎从未注册_Send,我认为这可能与未定义的类对象或其他原因有关。有时我会收到警告,此时它正在初始化,然后立即终止而不等待_Send

在我无法控制的本地授权网络上,在 Windows 7 上使用 Excel 2007。

【问题讨论】:

你那里还有输入代码吗?我认为您将邮件设置为在邮件消失后成为您的沉没类。 Outmail 应该是我认为的类对象wiseowl.co.uk/blog/s242/event-sink.htm 嗯,我想我粘贴不正确,我会编辑它 你试过我的代码了吗? 【参考方案1】:

Private WithEvents EM As Outlook.MailItem

Public Sub INIT(x As Outlook.MailItem)
    Set EM = x
End Sub

Private Sub EM_Send(Cancel As Boolean)

End Sub

模块

Public WATCHER As clsEmailWatch

Sub EMAIL()

Dim o As Outlook.Application
Dim m As Outlook.MailItem

Set o = New Outlook.Application
Set m = o.CreateItem(olMailItem)

Set WATCHER = New clsEmailWatch
WATCHER.INIT m

m.To = "xyz@abc.com"

m.Send

End Sub

希望对你有帮助

【讨论】:

【参考方案2】:

这看起来与在用户窗体运行时显示邮件有关。

我遇到了同样的问题,虽然用户窗体存在,但 Outlook 事件没有注册。为了解决这个问题,我实施了一种 hack:

您的类或用户表单模块中需要一个布尔属性:

Private someBool as Boolean

您需要订阅MailItem.Close Event 并设置新的布尔值:

Private Sub TheMail_Close(Cancel As Boolean)
    someBool = True
End Sub

当显示的电子邮件关闭、发送或保存时引发此事件。

那么你显然需要一个 Property Get 方法:

Public Property Get MailClosed() As Boolean
    MailClosed = someBool
End Property

现在,要处理所有事件,您需要在显示来自的邮件的模块中使用循环:

[...]
Dim CurrWatcher As EmailWatcher
Set CurrWatcher = New EmailWatcher
Set CurrWatcher.TheMail = OutMail

Do Until CurrWatcher.MailClosed
    DoEvents
Loop

[...]

我不确定为什么DoEvents 有效,如果有人能对此有所了解,我会将其添加到我的答案中。

【讨论】:

以上是关于如果手动发送电子邮件,则触发代码以记录的主要内容,如果未能解决你的问题,请参考以下文章

如果条件为true,则使用python代码发送邮件

基于公式的单元格值触发的 VBA 电子邮件代码

zabbix报错整理--持续更新

如何通过 PL/SQL 中的触发器发送电子邮件

从 Django 代码调用 Zapier 触发器

如何获得 Paypal 付款以触发已经存在的确认电子邮件