【问题标题】:Emails sent via Outlook using VBA stuck in outbox使用 VBA 通过 Outlook 发送的电子邮件卡在发件箱中
【发布时间】:2020-06-18 15:16:52
【问题描述】:

我正在尝试通过 Outlook(在 Excel 上启动)发送带有附件的电子邮件。代码运行没有错误,但 17 封电子邮件中只有大约 6 封发送出去,余额卡在发件箱中,当我打开 Outlook 并自己同步文件夹时发送出去。

我尝试使用:DoEvents 和 Application.Wait (Now + TimeValue("0:00:03")) 无济于事。

For counter = 2 To 18

    branchCode = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("C" & counter).Value

    BranchName = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("A" & counter).Value
    branchEmail = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("D" & counter).Value
    sheetPath = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("J2").Value
    Dim OutApp As Object
    Dim OutMail As Object

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


    On Error Resume Next

    With OutMail
        .To = branchEmail
        .BCC = ""
        .Subject = "Rate Sheet " & BranchName & " - " & Now()
        .Body = "Hi, Please find attached below your rate sheet, your uploads are ready as well."
        .Attachments.Add (sheetPath & BranchName & ".pdf")
        .Send
    End With
    On Error GoTo 0
    Application.Wait (Now + TimeValue("0:00:03"))
    Set OutMail = Nothing
    Set OutApp = Nothing

Next counter

【问题讨论】:

  • 你的代码对我有用,没有卡住的电子邮件。可能与您的观点有关。
  • 可能与您的 Exchange 服务器有关。
  • 你为什么有On Error Resume Next
  • 与服务器无关,上传单个工作表的代码就像在两个网络上的多台计算机上的魅力一样。批量发送会导致一个问题,我怀疑是由于 Outlook 已关闭。通过这段代码的设计,我尝试省略退出行,但无济于事。
  • On Error Resume Next 在代码上,以避免造成随机挂起。此代码最初是为一次从一张纸上写一封电子邮件而设计的,当快速发送电子邮件时,有时会出现 Outlook 实例重叠的问题,导致它突然停止。禁用错误处理后,它工作正常。当代码被修改为遍历所有工作表时,我让它思考它是否没有损坏..

标签: excel vba outlook


【解决方案1】:

查看代码调整。将 Outlook 应用程序的初始化移到循环之外。您不应该一遍又一遍地打开和关闭这些,并且根据您之前的评论,这实际上会导致一些问题,连续打开和关闭客户端可能会导致同步问题。

选项 1 - 移动 Outlook 创建外部循环

将初始化移到循环之外可能会解决您的问题。如果没有,请尝试选项 2。

选项 2 - 强制启动“所有帐户”同步组的同步

所有处理完成后,我们将使用以下方法获取同步组:

mySyncObjects = OutApp.GetNamespace("MAPI").SyncObjects

然后我们将启动第 1 组的同步,通常是“所有帐户”。

mySyncObjects(1).Start

如果这不是“所有帐户”,您需要循环通过 mySyncObjects 来找到它,使用属性 .Name

调整代码(注意是否检查发送电子邮件):

'determine if you need to send emails
If needToSendEmails = 1 Then

Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")

For counter = 2 To 18



    branchCode = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("C" & counter).Value

    BranchName = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("A" & counter).Value
    branchEmail = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("D" & counter).Value
    sheetPath = Workbooks("Upload.xlsm").Worksheets("Branch List").Range("J2").Value

    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next

    With OutMail
        .To = branchEmail
        .BCC = ""
        .Subject = "Rate Sheet " & BranchName & " - " & Now()
        .Body = "Hi, Please find attached below your rate sheet, your uploads are ready as well."
        .Attachments.Add (sheetPath & BranchName & ".pdf")
        .Send
    End With
    On Error GoTo 0
    ''This shouldn't be neccessary. I utilizie similar code to send 100+ emails quickly.  It takes a second for outlook to update but all should appear inside the app when processing complete.
    ''Application.Wait (Now + TimeValue("0:00:03")) 
    Set OutMail = Nothing


Next counter
''GET ALL SYNC GROUPS
Set mySyncObjects = OutApp.GetNamespace("MAPI").SyncObjects

''KICK OFF SYNC FOR ITEM 1 IN SYNC GROUPS, USUALLY ALL ACCOUNTS - MAY NEED TO LOOP THROUGH ALL SYNC GROUPS TO FIND "ALL ACCOUNTS"
mySyncObjects(1).Start

Set OutApp = Nothing

End If

【讨论】:

  • 我在循环之后添加了它,因为它是理想的,但是,我在 mySyncObjects = OutApp.GetNamespace("MAPI").SyncObjects 行收到“无效的过程调用或参数”错误
  • 查看编辑以回答,我有点担心重新初始化 Outlook 应用程序可能是问题所在。我建议首先将 Outlook 初始化移到循环之外,对其进行测试,如果失败,请在取消分配 OutApp 对象之前放入指定的代码行。
  • 尝试在循环外初始化 Outlook。 mySyncObjects = OutApp.GetNamespace("MAPI").SyncObjects 导致相同的错误。我将其修改为Set mySyncObjects = OutApp.GetNamespace("MAPI").SyncObjects,它允许代码运行。但是,仍然无法解决,看起来好像 Outlook 在完成之前就被关闭了。 DoEvents 没有任何帮助。将 Outlook 创建/结束移出循环并添加 Application.Wait (Now + TimeValue("0:00:05")) 似乎有助于解决问题。但是,如果时间少于 Outlook 发送的时间,则未发送的电子邮件将被阻止。
  • 所以基本上有 3 种方法可以解决这个问题。 1. 等待——可能不理想。 2.尝试从outlook捕获同步完成事件。最佳选择——不确定如何在 VBA 中处理来自其他应用程序的捕获事件。 3. 循环通过文件夹对象查找发件箱,直到没有项目剩余。 - 可能可行,但也不理想,因为它可能会同时占用大量系统资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多