2015-02-06 5 views
0

PHPMailer를 사용하여 고객에게 전자 메일을 보냅니다. SSL/TLS를 사용하여 전송하려고하지만 작동하지 않습니다. PHPMailer의 원본 예제 스크립트를 사용하고 있습니다. 이 줄을 주석 : $mail->SMTPSecure = 'tls'; 및 내 비 SSL SMTP로 자격 증명을 변경하면 제대로 작동합니다. 그렇지 않으면이 오류가 나타납니다.TLS가 활성화 된 상태에서 SMTP 연결이 실패 함

"메시지를 보내지 못했습니다. 메일러 오류 : SMTP connect()가 실패했습니다."

나는 이미 googled와 비슷한 문제를 발견 어디 ;extension=php_openssl.dll php.ini 에서이 줄을 도왔 주석. 하지만이 주석을 제거하면 도움이되지 않으며 phpinfo()에서 openssl이 이미 활성화되어 있는지 확인하여 작동해야합니까? (내 자신의 SMTP 자격 증명 OFC) http://puu.sh/fyg5Z/a1ab5b0ea5.png

내 사용 예 :

<?php 
require 'PHPMailerAutoload.php'; 

$mail = new PHPMailer; 

//$mail->SMTPDebug = 3;        // Enable verbose debug output 

$mail->isSMTP();          // Set mailer to use SMTP 
$mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers 
$mail->SMTPAuth = true;        // Enable SMTP authentication 
$mail->Username = '[email protected]';     // SMTP username 
$mail->Password = 'secret';       // SMTP password 
$mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
$mail->Port = 465;         // TCP port to connect to 

$mail->From = '[email protected]'; 
$mail->FromName = 'Mailer'; 
$mail->addAddress('[email protected]', 'Joe User');  // Add a recipient 
$mail->addAddress('[email protected]');    // Name is optional 
$mail->addReplyTo('[email protected]', 'Information'); 
$mail->addCC('[email protected]'); 
$mail->addBCC('[email protected]'); 

$mail->addAttachment('/var/tmp/file.tar.gz');   // Add attachments 
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name 
$mail->isHTML(true);         // Set email format to HTML 

$mail->Subject = 'Here is the subject'; 
$mail->Body = 'This is the HTML message body <b>in bold!</b>'; 
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; 

if(!$mail->send()) { 
    echo 'Message could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
} else { 
    echo 'Message has been sent'; 
} 
?> 

내가 그것을 어떻게 해결할 수 이것은 내가 나의은 phpinfo()에서 참조 무엇인가? 필자는 이메일 클라이언트 인 Thunderbird와 SMTP TLS 연결을 테스트했습니다.

+0

있습니까? TLS SMTP는 465를 사용해야합니다. 587은 암호화되지 않은 전송을위한 포트입니다. –

+0

내가 말했듯이 나는 올바른 신임장을 사용하고 거기에서 465 번 포트를 사용합니다. 문제는 확실하지 않습니다. Tho 나는 예제 코드를 편집했다. – kentor

답변

2

. 나는 개발자 싱크로을 인용합니다 :

You can't use ssl with port 587. The only combinations that will work are tls/587 and ssl/465, but you should use TLS. It doesn't make any differnce if you site uses http or https.

+0

결국 화제의! 감사! – Synchro

+0

롤 어떻게 그렇게 빨리 찾았나요? (: D. 계속 일해라, 고마워! – kentor

0

당신은 (TLS/SMTP 서버에 대한 SSL 연결을 시작 STARTTLS 명령을 사용하여이 예를) PHP는 TLS/SSL STRAM 소켓으로 이메일을 보낼 수 있습니다. Pear::mail

편집에

<?php 
// Login email and password 
$login = "[email protected]"; 
$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: <[email protected]>\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: <[email protected]>\r\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "DATA\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "Date: ".time()."\r\nTo: <[email protected]>\r\nFrom:<[email protected]\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; 
} 
0

안 SMTP TLS 아래에 언급 된 경로에있는 파일 : 그것은 매우 간단합니다, 당신은 단지 첨부 파일과 인라인 이미지 여기 MIME 메시지 예 https://github.com/breakermind/PhpMimeParser/blob/master/PhpMimeClient_class.php를 만들 필요가 없다.

/opt/lampp/lib/php/Net_SMTP/Net/SMTP.php 

다음과 같은 내용이있는 행을 찾기

,
function auth($uid, $pwd, $method = '', $tls = true, $authz = '') 

함께이 교체 : 당신이 포트에 확인

function auth($uid, $pwd, $method = '', $tls = false, $authz = '')