我正在尝试使用Microsoft Office Excel 2007 VBA代码发送邮件,但我收到错误:
运行时错误'-2147220973(80040213)':
自动化错误
我正在使用的代码是:
Dim cdomsg As Object
Set cdomsg = CreateObject("CDO.message")
With cdomsg.Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smptserverport") = 25
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "excel.**********@gmail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "**********123"
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
.Update
End With
With cdomsg
.Subject = "Automated mail"
.From = "excel.**********@gmail.com"
.To = "**********@hitbts.com" ' https://temp-mail.org/
.TextBody = "Automated mail"
.AddAttachment ("*:\*****\***********\****************\***********\*****\*****.xlsm")
.Send
End With
Set cdomsg = Nothing
我尝试了其他smpt服务器,当我输入nslookup时,显示在cmd中的服务器名称和地址,计算机的IP和另一个IP,但我不知道什么是正确的smpt服务器。
回答后编辑:
对于将来搜索此内容的任何人,我使用和使用的代码如下(摘自this视频):
Dim Mail As New Message
Dim Config As Configuration
Set Config = Mail.Configuration
Config(cdoSendUsingMethod) = cdoSendUsingPort
Config(cdoSMTPServer) = "smtp.gmail.com"
Config(cdoSMTPServerPort) = 25
Config(cdoSMTPAuthenticate) = cdoBasic
Config(cdoSMTPUseSSL) = True
Config(cdoSendUserName) = "sender@gmail.com"
Config(cdoSendPassword) = "password123"
Config.Fields.Update
Mail.AddAttachment ("C:\path\file.ext")
Mail.To = "destination@gmail.com"
Mail.From = Config(cdoSendUserName)
Mail.Subject = "Email Subject"
Mail.HTMLBody = "<b>Email Body</b>"
Mail.Send
请务必更改"sender@gmail.com"
,"password123"
,"C:\path\file.ext"
和"destination@gmail.com"
以使该示例正常工作以及更改邮件的主题和正文。
我还进入了VBA上的顶级菜单“工具”,选项“参考...”,启用了“Microsoft CDO for Windows 2000 Library”并按下了OK,如上面链接的视频所示。
Direct link启用从here获取的GMail的“安全性较低”选项。
答案 0 :(得分:1)
当您使用Gmail时;你是否检查过“安全性较低的应用程序”是否有所作为? Support.google.com Reference
答案 1 :(得分:0)
Huhlo,
我一直在使用与此处讨论的代码相似的代码。在许多不同的操作系统和Office / Excel版本中,它都是非常可靠的。它还在不同国家的不同Internet连接和提供商中可靠地工作。在最近的马耳他旅行中,它无法在我随身携带的两台不同计算机上工作,这两台计算机具有不同的系统和Office / Excel版本。我尝试了不同的Internet连接和提供商,但没有成功。
我已经解决了这个问题,所以我分享了解决方案,以防将来可能对任何人带来帮助。
简而言之,解决方案是将smptserverport") = 25
更改为smptserverport") = 465
(我注意到,在我以前的类似编码中(作为发送方使用我的gmail.com电子邮件地址以及我的德语Telekom,t-online.de和电子邮件地址),该编码可以使用25或465。 (我一直在使用25而不是465,这是因为我发现在类似的编码中使用频率更高))
这是我的解决方案的全部植入,对我来说很好。
我从此更改了我的程序的签名行
Sub PetrasDailyProWay1_COM_Way()
以使其现在将“ smptserverport”号作为其值
Sub PetrasDailyProWay1_COM_Way(ByVal SmptySvrPrt)
我所拥有的例程中的任何Call
,例如我所拥有的Call
行
Application.Run Macro:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way"
现在已修改为传递值25,因此:
Application.Run Macro:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way" , arg1:="25"
(上面的代码行运行过程Sub PetrasDailyProWay1_COM_Way( )
,在我的情况下,它位于Call
行所在的工作簿中。(工作簿,“ NeuProAktuelleMakros.xlsm “,如果尚未打开,则会自动通过该代码行))
现在,我在例程的末尾添加了Sub PetrasDailyProWay1_COM_Way( )
,该错误处理使用465安排了该例程的重新运行,如果使用25的初始运行失败了。 (这种特殊的解决方案还有一个额外的优势,就是在原来的编码中,有时以前第一次尝试不起作用的情况下,我会自动进行第二次尝试)
这是我上一次编码的结尾:
Rem 3 Do it
.send
MsgBox Prompt:="Done"
End With ' CreateObject("CDO.Message") (Rem 1 Library End =======#
End Sub
这是现在修改的版本:
Rem 3 Do it initially attempt with 25 , then in Malta as well maybe with 465
On Error GoTo Malta ' Intended to catch a possible predicted error in the next line when running the routine in Malta, or/ and an error in the second attempt at a code run ' if the next line errors, then I scheduule the routine to run again with "smtpserverport") = 465
.send
On Error GoTo 0
MsgBox Prompt:="Done (with " & SmptySvrPrt & ")" ' This will typically give either "Done (with 25)" or else "Done (with 465)" if the routine worked
End With ' CreateObject("CDO.Message") (Rem 1 Library End =======#
Exit Sub ' Normal routine end for no error exceptional errected situation
Malta: ' Intended to catch a predicted error when running the routine in Malta, or/ and an error in the second attempt at a code run
If SmptySvrPrt = "465" Then MsgBox Prompt:="Also did not work with 465 , Oh Poo!": Exit Sub ' case error with attempt with 465
Application.OnTime Now(), "'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!'ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way ""465""'"
' On Error GoTo -1: On Error GoTo 0 ' I do not need this as the End Sub will effectively bring down the errection state
End Sub
我在Application.OnTime
代码行中使用的语法很难弄清楚。 (这比我需要的要复杂,但是我想保持格式与我的Call
代码行中使用的格式一致。)
我不知道如何使用Application.OnTime
括号中的参数来完成( )
代码行的最后一部分。我也无法弄清楚如何使用我个人更喜欢的命名参数来执行该代码行。如果我调用了一个不带参数的过程,我确实设法使用了命名参数。但是在过程带有参数的情况下(如此处的新修改代码一样),我找不到任何有效的语法。因此,如果有人能以一种类似于这种伪形式(不起作用)的形式,以一种有效的语法启发我如何执行该行,那么我将非常感兴趣。
Application.OnTime EarliestTime:=Now(), Procedure:="'" & ThisWorkbook.Path & "\" & "NeuProAktuelleMakros.xlsm'" & "!'ProAktuelleMacrosMtsch.PetrasDailyProWay1_COM_Way, arg1:=""465""'"
前面已经提到使用465代替25,以及使用一种或另一种。我还没有看到关于“ smptserverport”或其他参数实际上至少以我可以理解的任何形式的任何解释。我认为如果有人有任何明确的解释,这将是一个有趣的补充。 (与任何现有解释的链接对我来说都是没有用的,因为我认为我已经看过所有这些解释了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。记住这是怎么回事)
ThunkUs:-) 艾伦