SwifMailer enviar e-mail erro autenticação com TLS 1.2

@system @marcia.caaraujo

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.

7 Curtidas

Envia para feedback@netmake.com.br e sugestoes@netmake.com.br
PS: para variar bibliotecas desatualizadas por padrão

4 Curtidas

Opa, tinha enviado para bugs@scriptcase.com.br, vou encaminhar para esses também, valeu :+1:

2 Curtidas

@yuri_esteves @system @marcia.caaraujo

Pessoal, bom dia e ótimo 2023 !

Passados 9 meses, teriam uma previsão para solução desse bug ?

Grato !

3 Curtidas

Olá, pedimos desculpas na demora da solução do problema. Irei verificar com a nossa equipe de desenvolvimento e retornarei com uma resposta sobre a solução do caso.

No aguardo, obrigado @Rafael_Herculano :+1:

Olá, amigo, tudo bem?

Testei as mudanças que você sugeriu e mesmo assim o problema persiste. Sabe o que mais posso fazer?

Olá Bruno,

Peço desculpas pela demora, geralmente não fico conectado aqui no fórum.

Mas vamos lá:

  • De fato comigo as ações de “contorno” funcionaram;
  • Como disse o problema acontece para quando enviamos usando SMTP do Google (principalmente) e também em outros provedores, praticamente todos desligaram a autenticação por TLS1.1;
  • Outra ponto importante para se atentar, depois que você abre esse .PHP e troca manualmente para “STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", toda vez que você atualizar a versão do Scriptcase terá que novamente editar o arquivo, pois a atualização traz o arquivo original;
  • Para as aplicações publicadas é o mesmo, se publicar incluindo a pasta “_lib” sem alterar esse arquivo elas estarão com o parâmetro errado e não vão disparar o e-mail;
  • Para aplicações já publicadas com o parâmetro errado você também precisa ir no arquivo e alterar esse parâmetro.

Por hora é o que vejo que ainda possa estar acontecendo, no meio ambiente seguindo esse “contorno” funcionou.

No no aguardo resolver definitivamente o problema, já fará aniversário de 1 ano @Rafael_Herculano.

Abs.

1 Curtida