Descrição:
Em uma aplicação baseada em CDO – Collaboration Data Objects (ferramenta desenvolvida pela Microsoft para facilitar o envio de mensagens em aplicações) -, é utilizado o IIS – Internet Information Services – para enviar e-mails, sem necessidade do driver SendMail.
Entretanto, as mensagens não estão sendo enviadas, e uma mensagem de erro é retornada. Como resolver o problema?
Solução:
Na maioria das vezes isto acontece porque o servidor utilizado necessita de autenticação. Assim, para solucionar o problema, deve-se usar o seguinte script para envio de e-mail:
Sub CommandButton1_Click()
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Título do email"
objMessage.Sender = "remetente@servidor.com.br"
objMessage.To = "destinatario@servidor.com.br"
objMessage.TextBody = "Texto corpo do email"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.servidor.com.br"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "remetente@servidor.com"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha do usuário"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
objMessage.Configuration.Fields.Update
objMessage.Send
MsgBox "O e-mail foi enviado com sucesso!"
End Sub
Limitações do CDO em provedores modernos
O CDO (Collaboration Data Objects) é um componente legado do Windows que utiliza uma implementação antiga de TLS para comunicação segura com servidores SMTP. Provedores como Gmail, Outlook/Hotmail e Yahoo desativaram o suporte ao TLS 1.0 e TLS 1.1, aceitando atualmente apenas TLS 1.2 ou superior. Como o CDO possui suporte limitado e instável a TLS 1.2, tornando-o incompatível com a maioria dos provedores modernos, tentativas de envio por esses provedores resultam em erros como:
0x80040217— Servidor não disponível0x80040213— Falha na conexão do transporte com o servidor8004020E— Remetente rejeitado pelo servidor
Alternativa: Envio via PowerShell
Como alternativa ao CDO, é possível utilizar o Windows PowerShell para realizar o envio de e-mails diretamente do VBScript do Elipse E3, através do objeto WScript.Shell.
Componente utilizado
O PowerShell utiliza a classe System.Net.Mail.SmtpClient do .NET Framework, que oferece suporte nativo a TLS 1.2, sendo compatível com os requisitos de segurança dos provedores modernos.
Script VBScript para o Elipse E3 — Envio via PowerShell
Dim oShell
Set oShell = CreateObject("WScript.Shell")
Dim sAssunto, sCorpo, sDestinatario, sRemetente, sSenha
sRemetente = "remetente@gmail.com"
sDestinatario = "destinatario@servidor.com.br"
sAssunto = "Título do email"
sCorpo = "Texto corpo do email"
sSenha = "senhaapp16chars" ' Senha de App gerada pelo provedor
Dim sScript
sScript = "$smtp = New-Object System.Net.Mail.SmtpClient('smtp.gmail.com', 587);" & _
"$smtp.EnableSsl = $true;" & _
"$smtp.Credentials = New-Object System.Net.NetworkCredential('" & sRemetente & "', '" & sSenha & "');" & _
"$msg = New-Object System.Net.Mail.MailMessage;" & _
"$msg.From = '" & sRemetente & "';" & _
"$msg.To.Add('" & sDestinatario & "');" & _
"$msg.Subject = '" & sAssunto & "';" & _
"$msg.Body = '" & sCorpo & "';" & _
"$smtp.Send($msg);"
oShell.Run "powershell -NoProfile -ExecutionPolicy Bypass -Command """ & sScript & """", 0, True
Set oShell = Nothing
MsgBox "E-mail enviado com sucesso!"
