PHPMailer:SMTP错误:无法连接到SMTP主机

Ili*_*eev 45 php email phpmailer

我在几个项目中使用过PHPMailer,但现在我卡住了.它给我错误:
SMTP错误:无法连接到SMTP主机.
我试过从Thunderbird发送电子邮件,它确实有效!但不是通过PHPMailer ......以下是Thunderbird的设置:

服务器名称:mail.exampleserver.com
端口:587
用户名:user@exampleserver.com
安全身份验证:无
连接安全性:STARTTLS

我在上一个使用PHPMailer的项目中将这些与服务器进行了比较,它们是:

服务器名称:mail.exampleserver2.com
端口:465
用户名:user@exampleserver2.com
安全认证:无
连接安全性:SSL/TLS

我的PHP代码是:

 $mail = new PHPMailer();
 $mail->IsSMTP(); // send via SMTP
 $mail->Host = SMTP_HOST; // SMTP servers
 $mail->Port = SMTP_PORT; // SMTP servers
 $mail->SMTPAuth = true; // turn on SMTP authentication
 $mail->Username = SMTP_USER; // SMTP username
 $mail->Password = SMTP_PASSWORD; // SMTP password
 $mail->From = MAIL_SYSTEM;
 $mail->FromName = MAIL_SYSTEM_NAME;
 $mail->AddAddress($aSecuredGetRequest['email']);
 $mail->IsHTML(true); // send as HTML
Run Code Online (Sandbox Code Playgroud)

哪里错了?

Mar*_*ier 92

由于这些问题在谷歌中显得很高,我想在这里分享我的解决方案,其中PHP刚刚升级到5.6版本(具有更严格的SSL行为).

PHPMailer维基有一个关于此的部分:

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#php-56-certificate-verification-failure

建议的解决方法包括以下代码:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);
Run Code Online (Sandbox Code Playgroud)

这适用于PHPMailer 5.2.10(及以上版本).

注意:显然,并且在wiki中也是如此,这应该是一个临时解决方案!

正确的解决方法是用一个好的证书替换无效,配置错误或自签名的证书.

  • 对于那些在使用localhost邮件并面临自签名问题的人来说,这是最好的答案. (4认同)

wes*_*sel 48

在我的情况下,PHP中缺少SSL支持,这给出了这个错误.

所以我启用了extension = php_openssl.dll

$mail->SMTPDebug = 1; 也暗示了这个解决方案.

2017年更新

$mail->SMTPDebug = 2;,请参阅:https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#enabling-debug-output

  • 启用此PHP扩展(WAMP菜单选项)是我所需要的.谢谢. (2认同)
  • 你是怎么启用这个扩展的?@wessel (2认同)

Vip*_*_Sb 12

你的问题很可能就是这个问题

连接安全性:STARTTLS连接安全性:SSL/TLS

这是两个不同的协议,你使用正确的协议,无论你在Thunderbird中使用的是什么,都需要使用.

尝试设置变量:

// if you're using SSL
$mail->SMTPSecure = 'ssl';
// OR use TLS
$mail->SMTPSecure = 'tls';
Run Code Online (Sandbox Code Playgroud)


Jas*_*per 6

我有一个类似的问题,并且发现需要设置openssl.cafile配置指令php.ini以允许验证安全对等体.您只需将其设置为证书颁发机构文件的位置,就像您可以在http://curl.haxx.se/docs/caextract.html获取的那样.

从PHP 5.6开始,这个指令是新的,所以当从PHP 5.5升级时,这让我措手不及.


Sin*_*ina 6

我有同样的问题,因为PHPMailer意识到服务器支持STARTTLS所以它试图自动升级连接到加密连接.我的邮件服务器与我网络中的Web服务器在同一子网上,这完全在我们的域防火墙后面,所以我不太担心使用加密(加上生成的电子邮件不包含敏感数据).

所以我要做的就是在class.phpmailer.php文件中将SMTPAutoTLS更改为false.

/**
 * Whether to enable TLS encryption automatically if a server supports it,
 * even if `SMTPSecure` is not set to 'tls'.
 * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
 * @var boolean
 */
public $SMTPAutoTLS = false;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。你不需要编辑基类来改变它,只需执行 $mail->SMTPAutoTLS = false; (2认同)

Ron*_*ero 5

mail.exampleserver.com 存在吗???,如果没有尝试以下代码(您必须有gmail帐户)

$mail->SMTPSecure = "ssl";  
$mail->Host='smtp.gmail.com';  
$mail->Port='465';   
$mail->Username   = 'you@gmail.com'; // SMTP account username
$mail->Password   = 'your gmail password';  
$mail->SMTPKeepAlive = true;  
$mail->Mailer = "smtp"; 
$mail->IsSMTP(); // telling the class to use SMTP  
$mail->SMTPAuth   = true;                  // enable SMTP authentication  
$mail->CharSet = 'utf-8';  
$mail->SMTPDebug  = 0;   
Run Code Online (Sandbox Code Playgroud)


小智 5

以下代码对我有用:

$mail = new PHPMailer(true);

$mail->isSMTP();// Set mailer to use SMTP
$mail->CharSet = "utf-8";// set charset to utf8
$mail->SMTPAuth = true;// Enable SMTP authentication
$mail->SMTPSecure = 'tls';// Enable TLS encryption, `ssl` also accepted

$mail->Host = 'smtp.gmail.com';// Specify main and backup SMTP servers
$mail->Port = 587;// TCP port to connect to
$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);
$mail->isHTML(true);// Set email format to HTML

$mail->Username = 'Sender Email';// SMTP username
$mail->Password = 'Sender Email Password';// SMTP password

$mail->setFrom('example@mail.com', 'John Smith');//Your application NAME and EMAIL
$mail->Subject = 'Test';//Message subject
$mail->MsgHTML('HTML code');// Message body
$mail->addAddress('User Email', 'User Name');// Target email


$mail->send();
Run Code Online (Sandbox Code Playgroud)