Autor Tópico: [RESOLVIDO] Envio de email, sem explicacao - Alguém me dá uma luz?  (Lida 565 vezes)

Cássio Lacerda

  • Intermediário
  • ***
  • Mensagens: 153
  • Força e honra!!!
    • Brain Legacy
    • Email
[RESOLVIDO] Envio de email, sem explicacao - Alguém me dá uma luz?
« Online: Fevereiro 25, 2017, 02:59:59 pm »
AUTO-RESOLVIDO



Amigos,

Eu já li praticamente todos topicos do forum que falam sobre sc_send_email() aqui do forum.
Não achei resposta e venho até a comunidade pedir ajuda.


Organizei este post nestas ordem:


1 - Situação,
2 - Código
3 - Imagem
4 - Dúvida
5 - Perguntas


1) Situação:

Criei um simples controle com um campo de mensagem e apenas com dois botoes para teste MAIL e SC_SEND_MAIL.

A função MAIL() do php funciona.
A função SC_SEND_MAIL() do scriptcase nao funciona.
Testei as configurações do servidor no Apple Mail e funciona.

Ou seja, tiro a possibilidade de ser erro da configuração do servidor pois em dois locais funciona.
 
2) Exemplos dos códigos:

Exemplo da função PHP Mail():

// Email parameters
$mail_smtp_server    = 'sub5.mail.dreamhost.com';        // SMTP server name or IP address
$mail_smtp_user      = 'cassiolacerda@brainlegacy.com';                   // SMTP user name
$mail_smtp_pass      = '*****';                // SMTP password
$mail_from           = 'cassiolacerda@brainlegacy.com';          // From email
$mail_to             = 'lacerda.cassio@gmail.com';         // To email
$mail_subject        = 'titulo email usando PHP Mail';            // Message subject
$mail_message        = 'titulo email usando PHP Mail'; // Message body
$mail_format         = 'H';                       // Message format: (T)ext or (H)tml
$mail_copies         = '';                        // List of the emails that will recieve the message
$mail_tp_copies      = '';                        // Type copies: BCC (Hiden copies) or CCC (Regular copies)
$mail_port           = '465';                     // Server port
$mail_tp_connection  = 'S';                       // Connection security (S) or (N)
$headers = 'From: cassiolacerda@brainlegacy.com' . "\r\n" .
    'Reply-To: cassiolacerda@brainlegacy.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

if ( mail($mail_to , $mail_subject, $mail_message, $headers) == false )
{
  echo ("erro no email ");
} else {
  echo("enviei o email");
}

A função mail() do PHP está funcionando.

Exemplo da função sc_send_mail():


// Email parameters
$mail_smtp_server    = 'sub5.mail.dreamhost.com';        // SMTP server name or IP address
$mail_smtp_user      = 'cassiolacerda@brainlegacy.com';                   // SMTP user name
$mail_smtp_pass      = '******';                // SMTP password
$mail_from           = 'cassiolacerda@brainlegacy.com';          // From email
$mail_to             = 'lacerda.cassio@gmail.com';         // To email
$mail_subject        = 'titulo email usando SC_Mail_SEND';            // Message subject
$mail_message        = '<br><b>titulo email usando SC_Mail_SEND <b><br>'; // Message body
$mail_format         = 'H';                       // Message format: (T)ext or (H)tml
$mail_copies         = '';                        // List of the emails that will recieve the message
$mail_tp_copies      = '';                        // Type copies: BCC (Hiden copies) or CCC (Regular copies)
$mail_port           = '465';                     // Server port
$mail_tp_connection  = 'S';                       // Connection security (S) or (N)

//-- Send email

sc_mail_send($mail_smtp_server,
          $mail_smtp_user,
          $mail_smtp_pass,
          $mail_from,
          $mail_to,
          $mail_subject,
          $mail_message,
          $mail_format,
          $mail_copies,
          $mail_tp_copies,
          $mail_port,
          $mail_tp_connection);

3) Images:

A configuração do Apple Mail: https://s3.postimg.org/68s3gcj6r/config_works.png

Eu envio mensagens por este cliente de email sem problema.
Erro na do sc_send_mail: https://s3.postimg.org/57rur8277/erro_email.png

4) Dúvida:

Eu li a mensagem de Connection could not be established with host sub5.mail.dreamhost.com
Eu entendi que a conexão nao pode ser estabelecida com o servidor smtp.
Me leva acreditar que é configuração dos parametros do server smtp.
Mas...
  Já troquei a porta para ver se poderia ser isto. Não funcinou.
  Já troquei de servidor e obtive o mesmo erro, mesma situação.

Sendo assim...
  O que me deixa muito curioso é que a função mail() do php esta funcionando perfeitamente.

5) Perguntas:

1) Alguém sabe me dizer o porque isto pode estar acontecendo com a função sc_send_mail()?
Já li que deve ser configuração, mas trocar porta, trocar criptografia ou nao, o que mais pode ser feito?

2) Alguém sabe como fazer o email ser verificado, pois o email que chegou da função mail() diz que nao pode ser verificado e foi para a pasta de spam. Como sair desta?

Grande abraço e de ante mão já agradeço qualquer colaboração.

Cássio Lacerda
 
« Última modificação: Março 27, 2017, 05:10:48 am por Cássio Lacerda »
Cássio Lacerda

Cássio Lacerda

  • Intermediário
  • ***
  • Mensagens: 153
  • Força e honra!!!
    • Brain Legacy
    • Email
Re:Envio de email, sem explicacao - Alguém me dá uma luz?
« Responder #1 Online: Março 27, 2017, 05:10:10 am »
Senhores,
Sem saber da resposta para este problema, eu reconstrui do zero toda a rotina delegando do envio de mensagem para a SEND_GRID

www.sendgrid.net

Funciona que é uma beleza. estou fechando este ticket.
Cássio Lacerda

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1979
  • Focalize as oportunidades e não os obstáculos.
    • Simão & Bühler Ltda
    • Email
Re:[RESOLVIDO] Envio de email, sem explicacao - Alguém me dá uma luz?
« Responder #2 Online: Março 27, 2017, 01:02:43 pm »
Cássio,
A mensagem de erro é por causa do certificado SSL do servidor smtp onde a macro sc_mail_send conecta.
O PHP 5.6 faz esta verificação quando se conecta em um servidor smtp externo ou interno.
Quando usa a função mail. Está usando o smtp do servidor onde esta hospedado sua aplicação para enviar. Um servidor interno.
A função mail não verifica porta, ssl e etc.

Veja os campos adotados:
( mail($mail_to , $mail_subject, $mail_message, $headers)
Não tem porta nem smtp ali.

Agora veja a função do SC:
sc_mail_send($mail_smtp_server,
          $mail_smtp_user,
          $mail_smtp_pass,
          $mail_from,
          $mail_to,
          $mail_subject,
          $mail_message,
          $mail_format,
          $mail_copies,
          $mail_tp_copies,
          $mail_port,
          $mail_tp_connection);
Ele está claramente conectando no servidor smtp externo.

Entendeu a diferença?

Quanto no tópico para novatos cito:

21) Algumas macros são funções já existentes no PHP que foram encapsulada em um objeto com nome iniciado "sc_".
Para ter certeza que o erro é na macro faça em php puro a mesma função.
Exemplo: (macro) sc_send_mail -> (php puro) http://php.net/manual/pt_BR/function.mail.php

Você fez bem em testar.
Viu com isto que não era problema no servidor em que hospeda.
Sobrando erro na macro sc_send_mail (bug) ou no certificado ssl do servidor onde está conectando.

Enquanto o certificado do servidor smtp externo não sofrer correção, ou seja, for um certificado válido. Este erro acontecerá com  sc_mail_send.
Logo, se faz necessário ajustar os parâmetros no sc_mail_send para que ele ignore esta verificação.
Este parâmetros podem ser encontrado aqui:
https://secure.php.net/manual/pt_BR/context.ssl.php
Acho que talvez o verify_peer resolva esta situação.

Veja que isto não é algo exclusivo do Scriptcase.
No site do phpmailer é relatado  a mesma situação:
https://github.com/PHPMailer/PHPMailer/issues/368

Por isto é bom sempre estar antenado no changelog e migration do php:

http://php.net/manual/pt_BR/migration56.php
Cito em especial: http://php.net/manual/pt_BR/migration56.openssl.php
"Todos os streams criptografados agora tem verificação de peer ativado por padrão. Assim, a coleção de CAs padrão do OpenSSL será utilizado para verificar o certificado do peer. Na maioria dos casos, não será necessário modificações para se comunicar com servidores com certificados válidos pois as distribuições geralmente configuram o OpenSSL com boas coleções de CA.

A coleção de CAs padrão pode ser substituída globalmente configurando-se as diretivas openssl.cafile ou openssl.capath, ou por requisição utilizando-se as ações cafile ou capath no parâmetro contexto.

Embora não recomendado no geral, é possível desabilitar a verificação de certificado do peer numa requisição configurando-se a opção de contexto verify_peer para FALSE, e até desabilitar a verificação do nome do peer configurando-se a opção verify_peer_name para false FALSE. "

http://php.net/manual/pt_BR/migration70.php
http://php.net/manual/pt_BR/migration71.php
http://php.net/ChangeLog-5.php
http://php.net/ChangeLog-7.php
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Cássio Lacerda

  • Intermediário
  • ***
  • Mensagens: 153
  • Força e honra!!!
    • Brain Legacy
    • Email
Re:[RESOLVIDO] Envio de email, sem explicacao - Alguém me dá uma luz?
« Responder #3 Online: Março 27, 2017, 01:57:50 pm »




Cássio,
A mensagem de erro é por causa do certificado SSL do servidor smtp onde a macro sc_mail_send conecta.
O PHP 5.6 faz esta verificação quando se conecta em um servidor smtp externo ou interno.
Quando usa a função mail. Está usando o smtp do servidor onde esta hospedado sua aplicação para enviar. Um servidor interno.
A função mail não verifica porta, ssl e etc.

Veja os campos adotados:
( mail($mail_to , $mail_subject, $mail_message, $headers)
Não tem porta nem smtp ali.

Agora veja a função do SC:
sc_mail_send($mail_smtp_server,
          $mail_smtp_user,
          $mail_smtp_pass,
          $mail_from,
          $mail_to,
          $mail_subject,
          $mail_message,
          $mail_format,
          $mail_copies,
          $mail_tp_copies,
          $mail_port,
          $mail_tp_connection);
Ele está claramente conectando no servidor smtp externo.

Entendeu a diferença?

Quanto no tópico para novatos cito:

21) Algumas macros são funções já existentes no PHP que foram encapsulada em um objeto com nome iniciado "sc_".
Para ter certeza que o erro é na macro faça em php puro a mesma função.
Exemplo: (macro) sc_send_mail -> (php puro) http://php.net/manual/pt_BR/function.mail.php

Você fez bem em testar.
Viu com isto que não era problema no servidor em que hospeda.
Sobrando erro na macro sc_send_mail (bug) ou no certificado ssl do servidor onde está conectando.

Enquanto o certificado do servidor smtp externo não sofrer correção, ou seja, for um certificado válido. Este erro acontecerá com  sc_mail_send.
Logo, se faz necessário ajustar os parâmetros no sc_mail_send para que ele ignore esta verificação.
Este parâmetros podem ser encontrado aqui:
https://secure.php.net/manual/pt_BR/context.ssl.php
Acho que talvez o verify_peer resolva esta situação.

Veja que isto não é algo exclusivo do Scriptcase.
No site do phpmailer é relatado  a mesma situação:
https://github.com/PHPMailer/PHPMailer/issues/368

Por isto é bom sempre estar antenado no changelog e migration do php:

http://php.net/manual/pt_BR/migration56.php
Cito em especial: http://php.net/manual/pt_BR/migration56.openssl.php
"Todos os streams criptografados agora tem verificação de peer ativado por padrão. Assim, a coleção de CAs padrão do OpenSSL será utilizado para verificar o certificado do peer. Na maioria dos casos, não será necessário modificações para se comunicar com servidores com certificados válidos pois as distribuições geralmente configuram o OpenSSL com boas coleções de CA.

A coleção de CAs padrão pode ser substituída globalmente configurando-se as diretivas openssl.cafile ou openssl.capath, ou por requisição utilizando-se as ações cafile ou capath no parâmetro contexto.

Embora não recomendado no geral, é possível desabilitar a verificação de certificado do peer numa requisição configurando-se a opção de contexto verify_peer para FALSE, e até desabilitar a verificação do nome do peer configurando-se a opção verify_peer_name para false FALSE. "

http://php.net/manual/pt_BR/migration70.php
http://php.net/manual/pt_BR/migration71.php
http://php.net/ChangeLog-5.php
http://php.net/ChangeLog-7.php

Fantástico, muito bem explicado, tem tudo haver. Fantástico Alexandre. Muito obrigado, fica esta maravilhosa explicação para os participantes do grupo.

Muito obrigado
Cássio Lacerda