Excel VBA CDO邮件

时间:2017-12-29 09:50:09

标签: excel vba excel-vba cdo.message

我正在尝试使用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的“安全性较低”选项。

2 个答案:

答案 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:-) 艾伦