在 Excel 中使用 VBA 创建的电子邮件未发送

Posted

技术标签:

【中文标题】在 Excel 中使用 VBA 创建的电子邮件未发送【英文标题】:Email created using VBA in Excel not sending 【发布时间】:2017-07-22 21:41:33 【问题描述】:

我在 Excel 中有一些 VBA 代码,可以通过 Outlook 创建和发送自动电子邮件。但是,除非我手动打开 Outlook 以触发“发送/接收”,否则不会发送实际消息。下面是我用来创建电子邮件的代码。我认为我只需要一行代码来触发发送/接收代码。但是我应该指出,在这段代码中 Outlook 没有打开。所以解决问题的一种方法可能是在这段代码之前打开outlook,然后在代码之后关闭它。

Function RDB_Mail_PDF_Outlook(FileNamePDF As String, StrTo As String, _
                              StrCC As String, StrBCC As String, StrSubject As String, _
                              Signature As Boolean, Send As Boolean, StrBody As String)
    Dim OutApp As Object
    Dim OutMail As Object

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

    On Error Resume Next
    With OutMail
        If Signature = True Then .Display
        .To = StrTo
        .CC = StrCC
        .BCC = StrBCC
        .Subject = StrSubject
        .htmlBody = StrBody & "<br>" & .HTMLBody
        .Attachments.Add FileNamePDF
        If Send = True Then
            .Send
        Else
            .Display

        End If
    End With
    On Error GoTo 0
        SendReceiveAll = True
    Set OutMail = Nothing
    Set OutApp = Nothing
End Function

【问题讨论】:

调用函数时,请确保将 Send 参数设置为 True。 设置为真。也许我需要检查 Outlook 中的某些设置或选项? 另外,我添加了 sendreceiveall =true 代码行。在我添加该行之前,它的执行方式相同。 注释掉(或临时删除)On Error Resume Next,然后再试一次。你有错误吗? 【参考方案1】:

这是意料之中的 - 消息提交是一个异步过程,Outlook 在它有机会发送消息之前关闭。

将 OutApp 变量设为全局变量,以便在您的子程序完成时不会释放它,然后调用 OutApp.Session.SendAndReceive

【讨论】:

谢谢德米特里。我尝试了一些与您的建议相关的事情,但似乎没有奏效。我一定对在哪里添加你所说的关于 OutApp.Session.Sendandreceive 的代码感到困惑。该代码应位于何处。还有,让 OutApp 成为全局变量的最佳位置在哪里?在我的代码的开头还是在函数的开头?并确认我应该通过编码“public”而不是“Dim”来使其全球化,正确吗?先谢谢了!!!!!! 在全局级别上在您的函数之外声明 OutApp。调用 Send 后调用 SendAndReceive。

以上是关于在 Excel 中使用 VBA 创建的电子邮件未发送的主要内容,如果未能解决你的问题,请参考以下文章

使用Excel VBA发送带有图表对象的电子邮件 - Office 2013

从excel范围vba添加邮件正文

如何使用 VBA 在 Excel 中添加连接(到外部数据源)并将其保存到该 Excel 电子表格的连接列表

在 Excel 2013 中使用 vba 插入电子邮件签名

在 Excel 中使用 VBA,如何在 Outlook 中粘贴表格然后将表格转换为文本?

Excel VBA Outlook-动态电子邮件收件人