KB-28661: Envio de e-mails sem driver no E3 usando IIS (CDO) e PowerShell.

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ível
  • 0x80040213 — Falha na conexão do transporte com o servidor
  • 8004020E — 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!"

 

Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 0 / 5. Count: 0

Deixe seu Comentário

Seu endereço de e-mail não será publicado. Campos marcados com asterisco são obrigatórios *