Pessoal,
Boa tarde.
Para contribuir aqui com o fórum, escrevo para relatar um erro (e solução de contorno) da macro “sc_mail_send” quando tentamos enviar e-mails para provedores smtp que exigem autenticação usando o protocolo “TLS 1.2”.
À equipe da “Netmake”, peço avaliar como corrigir.
E como sempre, se algum colega aqui do fórum achou outra solução, favor indicar pessoal !
Qual é o problema ?
A cerca de uns 2 anos pelo menos, os principais provedores de e-mail como Gmail, Office 365 e outros, já começaram a avisar que iriam mudar o protocolo padrão para autenticação de usuário e senha SMTP, até então usava-se os protocolos TLS 1.0 ou 1.1 (menos seguros) e que o TLS 1.2 seria o novo padrão (mais seguro).
Isso ocorre para toda e qualquer conta de e-mails que o padrão de autenticação seja “TLS ou STARTTLS”
Vejam os links para referência:
https://docs.microsoft.com/pt-br/microsoft-365/compliance/prepare-tls-1.2-in-office-365?view=o365-worldwide
https://security.googleblog.com/2018/10/modernizing-transport-security.html
Ocorre que agora em Fevereiro de 2022 eles começaram a de fato não aceitar mais autenticações pelas versões anteriores de TLS, com isso quando tentamos disparar os e-mails retorna “erro de autenticação TLS”, a mensagem pode variar a cada provedor mas no geral fazem referência ao “Transporte” ou versão do protocolo, que deve ser “TLS 1.2”
Exemplo de mensagem de erro retornada na tentativa de envio:
"Swift_TransportException Object ( [message:protected] => Expected response code 250 but got code “”, with message “”
Nesse caso trata-se de uma conta da Microsoft do Office 365 pago, que já obriga a autenticação com TLS 1.2.
Por que isso ocorre ?
Como sabemos o Scriptcase usa a biblioteca “SwiftMailer” para enviar e-mails, a versão utilizada pelo Scriptcase está desatualizada (aparentemente de 2009), envia como padrão para o provedor usando o protocolo “TLS 1.0”, com isso os provedores já começaram a recusar e retornam erro.
Aqui links para a versão atual que já usa o TLS 1.2 (versão 6.x)
https://swiftmailer.symfony.com/docs/introduction.html#system-requirements
https://symfony.com/doc/current/mailer.html#installation
Solução de contorno ?
Pesquisando e analisando a biblioteca e seus arquivos, descobri que esse parâmetro é passado de forma “fixa” na chamada de uma função dentro do arquivo:
“…/scriptcase9/prod/third/swift/classes/Swift/Transport/StreamBuffer.php”
.
.
.
public function startTLS()
{
return stream_socket_enable_crypto($this->_stream, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
}
.
.
.
Essa constante do PHP “STREAM_CRYPTO_METHOD_TLS_CLIENT” refere-se ao TLS 1.0
Basta alterar para TLSSv1_2 que tudo funciona:
public function startTLS()
{
return stream_socket_enable_crypto($this->_stream, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
}
Teste com o parâmetro padrão (errado), esse é uma aplicação que fiz para testar contas de e-mail:
Teste com a mesma rotina e alterando o trecho do arquivo para “STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT”:
Então para quem tiver esse problema basta editar esse arquivo e trocar a constante como indiquei acima. Já fiz o teste aqui e alterando na pasta de instalação do Scriptcase todas as aplicações geradas e publicadas já irão com essa correção.
Mas claro, se ao rodar uma atualização do Scriptcase essa pasta for atualizada tem que fazer novamente a alteração.
Solução definitiva ?
A Netmake precisa pegar a versão mais atualizada da SwiftMailer (6.x) e atualizar o produto, a nova biblioteca já usa como padrão os outros protocolos mais recentes, no caso TLS 1.2, e envia como opcional para os provedores as anteriores, no caso TLS 1.0 e TLS 1.1.
Inclusive pesquisei na GitHub e lá tem uma versão (6.X) que já alterou a forma de passar esse parâmetro, no entanto melhor a NetMake baixar do site oficial.
Espero ter ajudado !
Abs.