我正在尝试使用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的代码
请帮我清除错误...
答案 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以某种方式提供了一个设置,那就好了,所以每次都不需要修补代码。
答案 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所说的相似,但是没有用。我正在查看此链接并将其反向: