Enviando e -mails através do SMTP com Phpmailer
Pergunta
Estou tentando enviar e-mails SMTP usando o Phpmailer, mas continuo recebendo essa mensagem de erro, alguma idéia de como se livrar dele?
Estou tentando me conectar via SSL na porta 465.
SMTP -> FROM SERVER:
SMTP -> FROM SERVER:
SMTP -> ERROR: EHLO not accepted from server:
Notice: fputs() [function.fputs]: send of 18 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 494
SMTP -> FROM SERVER:
SMTP -> ERROR: HELO not accepted from server:
Notice: fputs() [function.fputs]: send of 12 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 212
SMTP -> ERROR: AUTH not accepted from server:
SMTP Error: Could not authenticate.
Meu código:
require_once('../library/PHPMailer_v5.1/class.phpmailer.php');
try{
$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Host = SMTP_SERVER;
$mail->Port = SMTP_PORT;
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;
$mail->SMTPDebug = 2;
$mail->SetFrom(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);
$mail->Subject = 'AMAZONEK.cz - objednávka číslo '.$_SESSION['orderId'];
$mail->MsgHTML('<b>Ahoj</b>');
$mail->AddAddress($_SESSION['user']['email'], $_SESSION['user']['name'].' '.$_SESSION['user']['surname']);
$mail->AddBCC(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);
if(!$mail->Send()) throw new Exception($mail->ErrorInfo);
}
catch(Exception $e){
echo $e->getMessage();
}
Definição de constantes:
define('SMTP_SERVER', 'smtp.ebola.cz');
define('SMTP_PORT', 465);
define('SMTP_USERNAME', 'myEmail@myDomain.tld');
define('SMTP_PASSWORD', '***CENSORED***');
define('MAIL_ORDERS_ADDRESS', 'myEmail@myDomain.tld');
define('MAIL_ORDERS_NAME', 'My Name');
Alguma ideia?
Solução
Tanto quanto posso ver, tudo está certo com seu código. Seu erro é:
Erro SMTP: não foi possível autenticar.
O que significa que as credenciais que você envia são rejeitadas pelo servidor SMTP. Certifique -se de que o host, a porta, o nome de usuário e a senha sejam bons.
Se você quiser usar o TLS, tente adicionar:
$mail->SMTPSecure = 'tls';
Se você quiser usar o SSL, tente adicionar:
$mail->SMTPSecure = 'ssl';
Tenha em mente que:
- Alguns servidores SMTP podem proibir conexões de "Outsiders".
- Alguns servidores SMTP não suportam conexões SSL (ou TLS).
Pode ser este exemplo pode ajudar (gmail seguro smtp).
Outras dicas
Tente enviar um e-mail através do servidor SMTP manualmente/de um mala direto interativo (por exemplo, Mozilla Thunderbird). A partir dos erros, parece que o servidor não aceita suas credenciais. Esse SMTP está funcionando na porta ou é SSL+SMTP? Você não parece estar usando a conexão segura no código que você postou e não tenho certeza se o Phpmailer realmente suporta SSL+SMTP.
(Primeiro resultado de pesquisar no Google seu nome de host do SMTP Server: http://podpora.ebola.cz/idx.php/0/006/article/strucny-technicky-popis-mastaveni-sluzeb.html Parece dizer "envio de correio SMTPS: conexão SSL segura, porta: 465". )
Parece que o Phpmailer suporta SSL; pelo menos de isto. Então, você precisará mudar isso:
define('SMTP_SERVER', 'smtp.ebola.cz');
nisso:
define('SMTP_SERVER', 'ssl://smtp.ebola.cz');
Experimente a porta 25 em vez de 456.
Recebi o mesmo erro ao usar a porta 456 e alterá -lo para 25 funcionou para mim.
Isso pode parecer um tiro no escuro Mas verifique se o PHP foi cumprido com o OpenSSL se o SMTP exigir SSL.
Para verificar o uso phpinfo()
Espero que ajude!
Sim, você precisa do OpenSSL para funcionar corretamente. Meu site de teste de backup funcionou, meu servidor ao vivo não funcionou. Diferença? O servidor ao vivo não tinha o OpenSSL na configuração do PHP.
Smtp -> do servidor:
Smtp -> do servidor:
SMTP -> Erro: ehlo não aceito no servidor:
Isso é típico de tentar se conectar a um serviço SSL com um cliente que não está usando o SSL
Erro SMTP: não foi possível autenticar.
Nenhuma surpresa, tendo falhado em iniciar uma autentação de conversas SMTP, não é uma opção.
O PHPMAILER não faz SSL implícito (também conhecido como TLS no Connect, SMTPS), sem reescrever smtp.class.php para incluir suporte para ela não há como fazer o que você pergunta.
Use a porta 587 com SSL explícito (também conhecido como TLS, STARTTLS).
Eu tive um problema muito semelhante por algo como uma hora, até descobrir o que deu errado. Meu problema era que eu usei Ssl, ao invés de ssl. Verificação é maiúsculas e minúsculas no código. Alexv me guiou para a fonte do problema. Esse helo/ehlo -stuff parece irrelevante.
Cliente SMTP simples com soquete PHP Stream com comando TLS/SSL SMTP STARTTLS:https://github.com/breakermind/phpmimeparser/blob/master/phpsmtpslsocketclient.php
Trabalha com Gmail.com com autenticado:
<?php
// Login email and password
$login = "your-email@cool.xx";
$pass = "123456";
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false);
try{
// echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
echo $socket = stream_socket_client('tcp://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$socket) {
print "Failed to connect $err $errstr\n";
return;
}else{
// Http
// fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
// Smtp
echo fread($socket,8192);
echo fwrite($socket, "EHLO cool.xx\r\n");
echo fread($socket,8192);
// Start tls connection
echo fwrite($socket, "STARTTLS\r\n");
echo fread($socket,8192);
echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
// Send ehlo
echo fwrite($socket, "EHLO cool.xx\r\n");
echo fread($socket,8192);
// echo fwrite($socket, "MAIL FROM: <hello@cool.com>\r\n");
// echo fread($socket,8192);
echo fwrite($socket, "AUTH LOGIN\r\n");
echo fread($socket,8192);
echo fwrite($socket, base64_encode($login)."\r\n");
echo fread($socket,8192);
echo fwrite($socket, base64_encode($pass)."\r\n");
echo fread($socket,8192);
echo fwrite($socket, "rcpt to: <to-email@boome.com>\r\n");
echo fread($socket,8192);
echo fwrite($socket, "DATA\n");
echo fread($socket,8192);
echo fwrite($socket, "Date: ".time()."\r\nTo: <to-email@boome.com>\r\nFrom:<zour-email@cool.xx\r\nSubject:Hello from php socket tls\r\n.\r\n");
echo fread($socket,8192);
echo fwrite($socket, "QUIT \n");
echo fread($socket,8192);
/* Turn off encryption for the rest */
// stream_socket_enable_crypto($fp, false);
fclose($socket);
}
}catch(Exception $e){
echo $e;
}