身份验证失败[SMTP:STARTTLS失败(代码:220,响应:2.0.0准备启动TLS)]

时间:2017-10-27 12:07:27

标签: php email smtp pear

我正在尝试使用SMTP和PEAR在PHP中发送带附件的电子邮件,但将错误视为“身份验证失败[SMTP:STARTTLS失败(代码:220,响应:2.0.0准备启动TLS)]”

<?php
require_once "Mail.php"; // PEAR Mail package
require_once ('Mail/mime.php'); // PEAR Mail_Mime packge

$from = "Your Mom <sender@gmail.com>";
$to = "Me <recepient address@gmail.com>";
$subject = 'Call Me!';

$headers = array ('From' => $from,'To' => $to, 'Subject' => $subject);

// text and html versions of email.
$text = 'Hi son, what are you doing?nnHeres an picture of a cat for you.';
$html = 'Hi son, what are you doing?<br /><br />Here is an picture of a cat 
for you.';

// attachment
$file = 'fromc.xls';
$crlf = "n";

$mime = new Mail_mime($crlf);
$mime->setTXTBody($text);
$mime->setHTMLBody($html);
$mime->addAttachment($file, 'text/plain');

$body = $mime->get();
$headers = $mime->headers($headers);

$host = "smtp.gmail.com";
$username = "xyz@gmail.com";
$password = "xyz";

$smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true,
 'username' => $username,'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
}
else {
echo("<p>Message successfully sent!</p>");
}
?>`

PHP版本:1.10.1 梨版:7.1.6
得到here的代码 请帮我清除错误...

3 个答案:

答案 0 :(得分:4)

未记录的参数:socket_options,让我在收到此错误时进行身份验证:
身份验证失败[SMTP:STARTTLS失败(代码:220,响应:TLS继续)]。

我只需要添加:
'auth'=&gt; “普通”,
'socket_options'=&gt;数组('ssl'=&gt;数组('verify_peer_name'=&gt; false)),

取自:https://pear.php.net/manual/en/package.mail.mail.factory.php

我收到了这个错误,但即使禁用STARTTLS(如上面的一些评论所示)也无济于事,因为它报告了身份验证错误。至少在我的情况下,我找到了正确的解决办法。

如果您使用的是PHP 5.6,则会对SSL进行更改: http://php.net/manual/en/migration56.openssl.php

主要是在连接上进行了额外的验证。此验证未在5.5上完成,因此忽略了这些问题。但在我的情况下,服务器发送带有“localhost”的SMTP EHLO命令,显然导致PHP的新验证失败。

解决方案是在/include/pear/Net/SMTP.php修补osTicket的邮件类 - 更改此行:

$ this-&gt; _socket_options = $ socket_options;

$ this-&gt; _socket_options = array('ssl'=&gt; array('verify_peer_name'=&gt; false));

这会关闭验证。对于我的设置,邮件服务器与osTicket服务器位于同一本地网络上,所以我并不过分关注安全性。

另一个解决方案是降级到PHP 5.5,它没有这个额外的验证。

如果osTicket以某种方式提供了一个设置,那就好了,所以每次都不需要修补代码。

取自:https://github.com/pear/Net_SMTP/issues/14

答案 1 :(得分:1)

这里的示例代码如何使用php将tls / ssl电子邮件发送到gmail smtp服务器https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php使用php流套接字非常简单(**您需要在mail.com面板中允许从外部应用程序发送电子邮件**)

答案 2 :(得分:0)

如果您是自我认证的,我的回答更好。

添加:

'auth' => true,
'socket_options' => array('ssl' => array('verify_peer_name' => false, 'allow_self_signed' => true)),

到$ smtp = Mail :: factory('smtp',行。

基本上,您要将其添加到数组中:

allow_self_signed' => true

明确告诉代码允许使用selt证书。

就我而言:

$smtp = Mail::factory('smtp',array ('host' => $host,'auth' => true,'socket_options' => array('ssl' => array('verify_peer_name' => false, 'allow_self_signed' => true)),'username' => $username,'password' => $password,'port' => '25'));

这与Vlax所说的相似,但是没有用。我正在查看此链接并将其反向:

https://github.com/PHPMailer/PHPMailer/issues/766