2015-02-06 128 views
0

我正在使用PHPMailer向我的客户发送电子邮件。我想使用SSL/TLS发送它们,但这不起作用。我正在使用PHPMailer的原始示例脚本。当我评论这一行:$mail->SMTPSecure = 'tls';并将凭据更改为我的非SSL SMTP它工作正常。否则,我收到此错误:SMTP连接失败,激活TLS

“邮件未发送。邮件程序错误:SMTP连接()失败。”

我已经搜索了一下,发现类似的问题,在php.ini的这条线上取消注释;extension=php_openssl.dll的帮助。但取消注释这并不能帮助我,我检查了phpinfo()openssl已经启用,所以它应该工作或?这是我在我的phpinfo()看到:http://puu.sh/fyg5Z/a1ab5b0ea5.png

我使用的例子(OFC用我自己的SMTP凭证):

<?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'; 
} 
?> 

我怎样才能解决呢?我用我的电子邮件客户端thunderbird测试了SMTP TLS连接,该工作正常。

+0

确定的端口上? TLS SMTP应使用465. 587是未加密提交的端口。 – 2015-02-06 16:15:44

+0

正如我所说,我用我的正确凭据当然,我在那里使用端口465.这不是肯定的问题。我编辑了示例代码。 – kentor 2015-02-06 16:21:17

回答

2

我发现在PHPMailer的github上的封闭问题部分答案。我引用开发者同步:

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 2015-02-06 17:33:42

+0

哈哈,你是怎么发现这么快的:(D:保持这个工作,谢谢! – kentor 2015-02-06 19:24:00

0

您可以(使用STARTTLS命令启动TLS/SSL连接到SMTP服务器这个例子中)与PHP TLS/SSL STRAM插座发送电子邮件。这是非常简单,你只需要创建一个附件和内嵌图片在这里MIME消息例如https://github.com/breakermind/PhpMimeParser/blob/master/PhpMimeClient_class.php

<?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在Pear::mail

编辑在下文提到的路径中的文件。

/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 = '')