在过去的两个月里,我一直在解决这个问题,但在如何解决这个问题上没有任何结果。我使用的是PHP 5.6.3和PEAR 1.10.1,所讨论的电子邮件页面与我们本地服务器上的三方电子邮件软件配合得很好,该软件仅用于SMTP的端口25。现在PHP页面确实引用了一个XML模板,该模板包含所有主机、密码和用户名信息。我想切换到使用带有SSL的google电子邮件服务器。我实施了电子邮件管理员提供的更改,并相应地更改了MX记录。它正常工作了两周。之后,我得到了以下错误
“未能连接到ssl://smtp.gmail.com:465[SMTP:连接套接字失败:fsockopen():无法连接到ssl://smtp.gmail.com:465(未知错误)(代码:-1,响应:)]”
.
我已经多次更改了代码,删除了ssl://,将协议类型更改为端口号为587的TLS,等等。什么都不起作用!我联系了承包商,用gmail服务器配置构建了一个简单的硬编码页面,只需向世界问好。他拒绝了,并让我自己制作了一个简单的php页面,请注意,到目前为止,我在php编程方面没有任何背景,所以附带说,我很高兴这是我的方式,但不管怎样,我确实完成了任务。我有一个页面,它使用smtp服务器发送一条简单的消息,并使用PHPMailer库提供所需的帐户。(参见下面的代码)
<?php
require_once 'C:\Webpage\PHPMailer-5.2-stable/PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->SMTPDebug = 4;
$mail->Host = 'smtp.gmail.com';
$mail->Username = 'username@gmail.com';
$mail->Password = 'XXXXXXXXXXXXXXXXXXX';
$mail->SMTPSecure ='ssl';
$mail->Port = 465;
$mail->From = 'XXXXt@abc.com';
$mail->FromName = 'Example';
$mail->addReplyTo('testing@abc.com','Example');
$mail->AddAddress('user1@xyz.com', 'John Doe');
$mail->Subject = 'Hello World';
$mail->Body ='A test email!';
$mail->AltBody = 'A test email!';
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message has been sent";
}
?>
现在我知道这不是使用PEAR,但从中我发现了一些我认为相关的有趣信息。该代码仅在具有
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
)
);
没有被注释掉,但当它被注释掉时,我收到一个关于这个的错误。
Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed [C:\Webpage\PHPMailer-5.2-stable\class.smtp.php line 299]
所以我在google上搜索了这个错误,并找到了php。用于更改openssl的ini文件。cafile和openssl。capath值。我输入了下载CA证书并输入了值的正确路径,但仍然不起作用。我把这些放错地方了吗?或者,是否有更简单的方法可以使用PEAR库解决此问题?请在此问题上提供任何帮助,我们将不胜感激!:)
更新(2018年2月20日):
我已经下载了包并将路径设置到正确的位置,
curl.cainfo ="C:\OpenSSL-Win64\bin\PEM\cacert.pem"
,
openssl.cafile="C:\OpenSSL-Win64\bin\PEM\cacert.pem"
. 我仍然收到错误,我对ssl位置进行了以下检查,以查看是否使用了
php.ini
文件并获得以下内容。
<?php
error_reporting(E_ALL);
print "\nIf you've got this far without errors then problem is with your SSL config\n";
$calocns=openssl_get_cert_locations();
if (count($calocns)) {
print "Check you've got your cacerts deployed in one of the following locations\n";
foreach ($calocns as $k=>$v) print "$k = $v\n";
} else {
print "You've not configured your openssl installation on this host\n";
}
$calocns=openssl_get_cert_locations();
?>
结果:
If you've got this far without errors then problem is with your SSL config Check you've got your cacerts deployed in one of the following locations default_cert_file = f:\repo\winlibs_openssl_vc11_x86/cert.pem default_cert_file_env = SSL_CERT_FILE
default_cert_dir = f:\repo\winlibs_openssl_vc11_x86/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = f:\repo\winlibs_openssl_vc11_x86/private
default_default_cert_area = f:\repo\winlibs_openssl_vc11_x86
ini_cafile =
ini_capath =
我似乎做错了,或者需要知道如何更改位置,因为这些位置在我的计算机上不存在,我不明白在我更改配置文件本身中的路径时,默认情况下是如何更改这些位置的。有什么想法吗?