Excel 通过 Outlook 发送电子邮件时如何处理错误?
Posted
技术标签:
【中文标题】Excel 通过 Outlook 发送电子邮件时如何处理错误?【英文标题】:How to handle errors when an email is sent from Excel through Outlook? 【发布时间】:2020-04-04 23:58:49 【问题描述】:我通过 Outlook(从 Excel)将 Excel 工作表作为电子邮件附件发送。
强烈简化的代码:
Private Sub SendWorksheetByEmail(sEmail As String)
'This error handler should make sure that the code always
'goes through a "clean up" procedure where
'all settings are reset and temporary files are deleted
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
ActiveSheet.DisplayPageBreaks = False
Dim sFile As String
Dim wbCopy As Workbook
Dim OutlookApp As Object, OutlookMail As Object
'.......some more declarations.................
'Here comes code that will do some changes in the workbook,
'then copy one of the sheets to a new workbook (wbCopy) and
'store the workbook to the temp folder. I guess it is not
'neccessary in order to understand the question.
'..............................................
'..............................................
'Sending the email
'I somethines see that people put a "On Error Resume Next" here.
'Then, the code will always finish - but I do not get an error
'Message. What is the point of doing this?
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
With OutlookMail
.To = sEmail
.CC = ""
.BCC = ""
.Subject = "Some subject text"
.Body = "Some email body text"
.Attachments.Add sFile
.Send
End With
MsgBox "Your email was successfully sent to " & sEmail, vbInformation, "Email sent"
ErrorExit:
'Various "clean up" (delete temporary file) and restore settings
On Error Resume Next
wbCopy.Close
Kill sFile
Set OutlookMail = Nothing
Set OutlookApp = Nothing
ActiveSheet.DisplayPageBreaks = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox "An error occured and the email might not have been sent.", vbCritical, "Error"
Resume ErrorExit
End Sub
想法是一旦发生错误,代码将跳到ErrorHandler
(并清理一些设置,删除临时文件等)。
如果在发送电子邮件之前发生错误,则此方法有效。但是,如果发送电子邮件出现问题,代码将停止。
示例:我在未在 Outlook 中设置任何电子邮件帐户的 VM 上测试代码,因此 Outlook 将启动并提示我设置帐户。如果我关闭 Outlook,宏将不会继续运行。
我做了一些网络研究,发现发送电子邮件的代码通常使用On Error Resume Next
语句运行。我试过了,这次代码完成了运行。但是,我无法检查电子邮件是否已发送 - 因此即使无法发送电子邮件,用户也会收到一个确认消息框。
如何确保代码始终完成?以及如何检查电子邮件是否实际发送(以显示错误消息)?
【问题讨论】:
.Send
调用 is 位于任何错误都会跳转到 ErrorHandler
标签执行的位置。你是说.Send
抛出一个错误未处理?尽管处理程序?验证您的 VBE 选项,确保选中“Break on unhandled errors”。
感谢@MathieuGuindon 的想法。我刚刚检查了它并选择了“中断未处理的错误”。为了澄清,代码没有抛出错误。 Outlook 窗口出现,在我单击“取消”后,没有任何反应。代码只是停止,在 VBE 中突出显示无错误(代码中也没有错误消息或“成功”消息)。真的很奇怪,我用 VBA 工作了好几年,但我以前从来没有发生过这样的事情。
我认为应该有一种方法可以在尝试发送电子邮件之前验证ThisOutlookSession
中是否有连接的帐户。不过对 Outlook OM 不是很熟悉:-/
我相信在尝试发送电子邮件时可能会出现的大多数问题实际上会引发运行时错误,您的错误处理代码会处理该错误。认为您遇到了极端情况(谁在没有连接帐户的情况下使用 Outlook 宏?);验证是否有一个有效的、已连接的帐户将从等式中删除边缘情况(假设没有更多惊喜!)
@MathieuGuindon 非常感谢您的帮助!我一直在环顾四周,发现了这个answer。我已经设置了一个额外的处理程序并使用If OutlookApp.Session.Accounts.Count = 0 Then GoTo OutlookNotSetup
(在Set OutlookApp = CreateObject("Outlook.Application")
之后检查是否配置了 Outlook 帐户。这个会打开“欢迎”对话框,但有趣的是,代码不会停止。所以我可以现在处理这个问题。再次感谢您的建议。很遗憾我无法通过为您的 cmets 点赞来传递一些声誉。
【参考方案1】:
如果您想完全确定您的电子邮件是否已发送,那么最好检查您的邮件是否在“已发送”或/和“发件箱”文件夹中(请参阅here)。如果 vba 将在那里崩溃,那么您将知道 Outlook 应用程序可能存在错误。 如果您一次发送数百封电子邮件,请注意“发件箱”文件夹。即使在宏完成工作后,电子邮件也会存储在那里并一一发送。
下一个更大的检查是等待服务器响应一段时间,如果电子邮件无效,检查收件箱文件夹是否有错误返回消息。但该选项可能对这项任务来说太过分了。
【讨论】:
以上是关于Excel 通过 Outlook 发送电子邮件时如何处理错误?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Excel VBA 通过 Outlook 发送电子邮件 - 将字符串转换为货币格式或百分比
如何通过Excel VBA和Outlook实现自动发送邮件功能