[RESOLVIDO] Envio de email, sem explicacao - Alguém me dá uma luz?

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 = '
titulo email usando SC_Mail_SEND
'; // 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:
[size=1em]
[font=verdana]A configuração do Apple Mail: https://s3.postimg.org/68s3gcj6r/config_works.png [/font][/size]
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:

[size=1em]Eu li a mensagem de [font=arial]Connection could not be established with host sub5.mail.dreamhost.com[/font]
[font=verdana]Eu entendi que a conexão nao pode ser estabelecida com o servidor smtp.[/font]
[font=verdana]Me leva acreditar que é configuração dos parametros do server smtp. [/font]
[font=verdana]Mas…[/font]
[font=verdana] Já troquei a porta para ver se poderia ser isto. Não funcinou.[/font]
[font=verdana] Já troquei de servidor e obtive o mesmo erro, mesma situação.[/font][/size]
[font=verdana]Sendo assim…[/font]
[font=verdana] O que me deixa muito curioso é que a função mail() do php esta funcionando perfeitamente. [/font]

[font=verdana]5) Perguntas:[/font]

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

  1. 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
[/font]

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,
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:

  1. 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