Почта Excel VBA CDO

Я пытаюсь отправить письмо с кодом VBA Microsoft Office Excel 2007, но получаю сообщение об ошибке:

Ошибка времени выполнения «-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, имя и адрес сервера, которые отображаются в cmd, когда я набираю nslookup, IP-адрес компьютера и другое IP, но я не знаю, какой сервер smpt правильный.

Изменить после ответа:

Для тех, кто будет искать это в будущем, код, который я использовал и работал, следующий (взят из этого видео) :

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) = "[email protected]"
Config(cdoSendPassword) = "password123"
Config.Fields.Update

Mail.AddAttachment ("C:\path\file.ext")
Mail.To = "[email protected]"
Mail.From = Config(cdoSendUserName)
Mail.Subject = "Email Subject"
Mail.HTMLBody = "<b>Email Body</b>"

Mail.Send

Не забудьте изменить "[email protected]", "password123", "C:\path\file.ext" и "[email protected]", чтобы пример работал, а тему и текст сообщения изменили.

Я также зашел в верхнее меню «Инструменты» в VBA, опцию «Ссылки ...», включил Microsoft CDO для библиотеки Windows 2000 и нажал «ОК», как показано на видео, приведенном выше.

Прямая ссылка для включения параметра "Менее безопасный" для GMail, взятая из здесь.


person user7393973    schedule 29.12.2017    source источник
comment
Взгляните на this за хорошо работающий код CDO.Mail.   -  person    schedule 29.12.2017
comment
Я вижу ошибку в следующей строке: .Item("http://schemas.microsoft.com/cdo/configuration/smptserverport") = 25. smptserverport должен быть smtpserverport   -  person Slaqr    schedule 29.12.2017
comment
@Slaqr Вы правы, но это все еще не устранило ошибку.   -  person user7393973    schedule 29.12.2017
comment
@Jeeped Этот код не сработал. Я получаю ту же ошибку без On Error GoTo.   -  person user7393973    schedule 29.12.2017
comment
Поскольку вы используете Gmail; Вы проверяли, имеет ли значение включение «менее безопасных приложений»? ссылка   -  person Slaqr    schedule 29.12.2017
comment
@Slaqr Это устранило проблему, и письмо было отправлено, большое вам спасибо! Если вы можете сделать его официальным ответом, чтобы его можно было принять.   -  person user7393973    schedule 29.12.2017
comment
Ошибка действительно почти не помогает ее решению. Я пробовал так много разных способов, и всегда было одно и то же. Теперь я наконец знаю, как отправлять почту.   -  person user7393973    schedule 29.12.2017


Ответы (2)


Поскольку вы используете Gmail; Вы проверяли, имеет ли значение включение «менее безопасных приложений»? Справочник по Support.google.com

person Slaqr    schedule 29.12.2017

Хухло,

Я использовал код, аналогичный обсуждаемому здесь. Он был очень надежен во многих операционных системах и версиях Office / Excel. Он также надежно работал в разных странах с разными интернет-подключениями и поставщиками. Во время недавней поездки на Мальту он не работал на двух разных компьютерах, которые у меня были с разными системами и версиями Office / Excel. Я пробовал разные интернет-соединения и разных провайдеров, но безуспешно.
Я вылечил проблему, поэтому делюсь решением на случай, если оно может помочь любому, кто будет проходить здесь в будущем.

Вкратце, решение заключалось в том, чтобы изменить 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: -) Алан

person Alan Elston    schedule 01.04.2019