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