Swiftmailer - sc_mail_send - SC 9.5.003

Olá a todos.

Estou com dificuldades para emviar email pelo SC 9.5.003.

Como não consegui enviar através de vários provedores, como gmail, locaweb e outros, utilizando a macro sc_mail_send, tentei através de bibliotecas externas.

Testei o PHPMailer, versões atuais e antigas, com e sem uso do namespace, porém sem sucesso em todas as versões.

Tentei por último pelo SwiftMailer, sem sucesso também pelo SC.
Testei com ‘ssl’, ‘tls’ e sem.

Utilizando um script PHP fora so SC, pelo Apache, o envio ocorre normalmente através de todos os provedores testados.

Utilizo CentOS 7 e php 7.3.24.

Criei um form do tipo ‘control’ e no evento ‘onValidate’ coloquei o código mais abaixo.

O erro que ocorre é esse :

“Connection could not be established with host email-ssl.com.br :stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed”.

Segue o código no onValidate:


sc_include_library(“prj”, “swiftmailer”, “vendor/autoload.php”, true, true);

$sSmtpPort = 465;	
$sSmtpHost = "email-ssl.com.br";
$sSmtpUserName = "contato@xxxxxxxxxx.com";
$sSmtpPassword = "senha";
$sSmtpFromName = "Nome do Usuario";
$sSmtpFrom = $sSmtpUserName;
$sSmtpSecure = "ssl";

$sToEmail = "destino_da_mensagem@gmail.com";
$sToNome = "Nome do Destinatario";

try {

// Create the Transport
$transport = (new Swift_SmtpTransport("$sSmtpHost", $sSmtpPort, "$sSmtpSecure"))
	->setUsername("$sSmtpUserName")
	->setPassword("$sSmtpPassword")
;

$mailer = new Swift_Mailer($transport);


// Create a message
$body = 'Olá, <p>Email de teste.</p>';

$message = (new Swift_Message('Email pelo Swift Mailer'))
	->setFrom(["$sSmtpUserName" => "$sSmtpFromName"])
	->setTo(["$sToEmail" => "$sToNome"])
	->setBody($body)
	->setContentType('text/html')
;

$mailer->SMTPOptions = array(
	'ssl' => array(
	'verify_peer' => false,
	'verify_peer_name' => false,
	'allow_self_signed' => true
	)
);

$mailer->send($message);

echo 'Email enviado.';

} catch(Exception $e) {

echo $e->getMessage();

}


Este código colocado no onValidate não funciona pelo SC 9.5.003.

O mesmo envio utilizando SwiftMailer pelo php no apache funciona corretamente.

O erro retornado dentro do ScriptCase é o seguinte :

no {sc_mail_erro}: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

no catch: Connection could not be established with host email-ssl.com.br [ #0]

// *********************************************************************************

$sSmtpPort = 465;	
$sSmtpHost = "email-ssl.com.br";
$sSmtpUserName = "contato@xxxxx.com";
$sSmtpPassword = "senha";
$sSmtpFromName = "Nome";
$sSmtpFrom = $sSmtpUserName;


$sToEmail = "destinatario@gmail.com";
$sToNome = "Nome do Destinatario";

try {

// *******************
// teste de envio pelo SC

/*	
Parameter
Description
SMTP	SMTP server name or IP address. (String or Variable that contains the server name)
Usr	SMTP user name. (String or Variable that contains the user name)
Pw	SMTP password. (String or Variable that contains the password)
From	From email. (String or Variable that contains the email)
To	List of the emails that will receive the message, it could be a string or variable that contains one or more emails separated by ";" or one variable that contains one array of emails.
Subject	Message subject. (String or Variable that contains the subject)
Message	Message body. (String or Variable that contains the message)
Mens_Type	Message format: (T)ext or (H)tml.
Copies	List of the emails that will receive the message, it could be a string or variable that contains one or more emails separated by ";" or one variable that contains one array of emails.
Copies_Type	Type copies: BCC (Hidden copies) or CCC (Regular copies).
Port	The port used by your e-mail server. Use the port 465 for the security type SSL, and the port 587 for the security type TLS or the port 25 for no security. If not informed, Scriptcase will set the default port: 25
Connection_Type	Indicating a secure connection. Use S for SSL, T for TLS or N for non secure connections. If not informed, Scriptcase will set the default value:N.
Attachment	Absolute path of the file that will be attached in the email
SSL	Optional parameter to add SSL settings. If you need to add more than one setting, use ";" for separate them. Ex: $ssl = 'allow_self_signed=false;verify_peer=false';
Note: To use safe connection its required to have the PHP "php_openssl" extension enable.
*/

sc_mail_send(
		$sSmtpHost, 
		$sSmtpUserName, 
		$sSmtpPassword, 
		$sSmtpFrom, 
		$sToEmail, 
		"Email pelo sc_mail_send", 
		"Essa é a mensagem.", 
		"H", 
		"", 
		"", 
		$sSmtpPort, 
		"S",
		"",
		'allow_self_signed=true;verify_peer=false;verify_peer_name=false;'
);

if ({sc_mail_ok}) {
	echo "sent {sc_mail_count} e-mail(s) with success!!";
} else {
	sc_error_message({sc_mail_erro});
}	

sc_exit(sel);

} catch(Exception $e) {

echo $e->getMessage();

}

// *********************************************************************************

Fiz um teste simples, sem o SSL e esta funcionando, abre uma blank e coloca o código abaixo, trocando os dados para seu servidor, não deve funcionar com o gmail que precisa do SSL e porta diferente, mas para o que falou ai da locaweb/hostgator e afins deve funcionar normal

$servidor_email = "mail.servidor.com.br";
$SMTP_Porta  = "587";
$usuario_email = "email@servidor.com.br";
$senha_Email = "senhaqemail";
$from_email = "email@servidor.com.br";

$Email_para = "endereco@servidorenvio.xxx";
$AssuntoEmail = "teste envio email";
$ConteudoEmail = "Conteudo do corpo do email";

if(filter_var($Email_para, FILTER_VALIDATE_EMAIL))
{
	sc_mail_send($servidor_email, $usuario_email, $senha_Email, $from_email, $Email_para, $AssuntoEmail, $ConteudoEmail,"T" ,"" ,"" ,$SMTP_Porta, "N","","");
	if ({sc_mail_ok}) 
	{
		sc_alert("Email Enviado!");
	}
	else
	{
		sc_alert("Erro envio Email!");
	}
}

Olá Jair.

Agradeço pela atenção. Está ajudando muito.

Utilizando o mesmo formulário Control, no onValidate, obtive:

Pela Locaweb

$sSmtpPort = 587;
$sSmtpHost = “email-ssl.com.br”;
FUNCIONOU

Pelo scriptcase.myhoost.com

$sSmtpPort = 587;
$sSmtpHost = “.myhoost.com”;
NÃO FUNCIONOU
Expected response code 250 but got code “”, with message “”

Pelo gMail

$sSmtpPort = 587;
$sSmtpHost = “smtp.gmail.com”;
NÃO FUNCIONOU
Expected response code 250 but got code “530”, with message "530 5.7.0 Must issue a STARTTLS command first. c79sm7254259qke.69 - gsmtp "

Pela Locaweb funcionou. Pelo Gmail, como você havia previsto, não funcionou.

Pelo scriptcase.myhoost.com não funcionou, sendo que seria importante conseguir enviar por esse provedor. Teria alguma ideia do caminho para contornar, ou ainda, ja fez testes com esse provedor?

Obrigado.

Pela Locaweb também obtive sucesso dentro do SC utilizando a biblioteca externa do SwiftMailer importada no projeto, na porta 587. Ótimo, mais uma opção na porta 587 com Locaweb.

o servidor smtp é este mesmo?

Não.

O provedor envia as seguintes instruções para configurar o smtp:

Configurações não SSL (NÃO recomendado)
Nome de usuário: meuemail@meusubdominio.myhoost.com
Senha: Use a senha da conta de email.
Servidor de entrada: mail.meusubdominio.myhoost.com
IMAP Port: 143 POP3 Port: 110
Servidor de saída: mail.meusubdominio.myhoost.com
SMTP Port: 587

‘meusubdominio’ => é o subdomínio que eu crio no painel, quando não uso domínio próprio registrado.

image

Pelo ThunderBird eu precisei configurar TLS para funcionar, sem TLS não funcionou na 587.

estranho, no que passei conectei tanto local como em um servidor.

no ThunderBird voce colocou o mail.meusubdominio.myhoost.com (como sub domínio?) da um ‘ping mail.meusubdominio.myhoost.com’ no sistema operacional e veja se o IP pinga normal, outra coisa que pode fazer é tentar colocar direto o mail.myhoost.com sem nome do subdomínio criado.

e testa direto no servidor, local pode ter problema com firewall ou antivirus

Olá Jair.

O suporte do myhoost.com orientou usar a seguinte configuração:

$sSmtpPort = 465;
$sSmtpSecure = "ssl";
$sSmtpHost = "mail.meusubdominio.myhoost.com";
$sSmtpUserName = "meulogin@meusubdominio.myhoost.com";
$sSmtpPassword = "minhasenha";

sendo que ‘meusubdominio’ é um subdomínio fictício aqui.

Testei e tive sucesso com a biblioteca externa SwiftMailer que importei e fiz uma classe para trabalhar com essa biblioteca. Decidi que não irei utilizar a macro ‘sc_mail_send’, ficando somente com a SwifMailer e também com a PHPMailer como opções importadas no SC.

Já com a Locaweb, a configuração que funcionou com o SwiftMailer no SC foi essa:

$sSmtpPort = 587;
$sSmtpSecure = "";
$sSmtpHost = "email-ssl.com.br";
$sSmtpUserName = "contato@meudominio.com";
$sSmtpPassword = "minhasenha";

Assim fico com dois provedores testados que me atendem com smtp de envio.

Agradeço pela sua atenção, ajudou muito.