Excel VBA CDO Mail

Я пытаюсь отправить письмо с кодом 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, имя и адрес сервера, которые отображаются в 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) = "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 для Windows 2000 Library" и нажал OK, как показано в видео, связанном выше.

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

1 ответ

Решение

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

Huhlo,

Я использовал код, похожий на тот, который обсуждался здесь. Это было очень надежно во многих различных операционных системах и версиях 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" или другие параметры действительно, по крайней мере, в любой форме, понятной для меня. Если у кого-то есть четкое объяснение, это было бы интересным дополнением здесь, на мой взгляд. (Ссылки на любые существующие объяснения мне бесполезны, так как я думаю, что видел их все. …. … Я ожидаю, что это может быть одной из тех вещей, которые никто никогда не удосужился четко документировать, а тем временем никто не может помни о чем это все)

Спасибо: -) Алан

Другие вопросы по тегам