事实
我正在使用PEAR Mail,我想使用gmail SMTP发送邮件。我有Apache / 2.4.27(Win64)PHP / 7.2.0beta3,PEAR 1.10.15,Mail 1.4.1,Net_SMTP 1.8.0,Net_Socket 1.2.2。
我去了php.ini
并添加了extension = php_openssl.dll
。 error.log
没有给出与ssl相关的错误。
这是代码
require_once "Mail.php";
$from = '<slevin@gmail.com>';
$to = '<slevinkelevra@gmal.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";
$headers = array(
'From' => $from,
'To' => $to,
'Subject' => $subject
);
$smtp = Mail::factory('smtp', array(
'host' => 'ssl://smtp.gmail.com',
'port' => '465',
'auth' => true,
'username' => 'slevinmail@gmail.com',
'password' => 'mypassword'
));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail)) {
echo('<p>' . $mail->getMessage() . '</p>');
} else {
echo('<p>Message successfully sent!</p>');
}
问题
我收到此错误
Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) (code: -1, response: )]
我不知道该怎么做,我用Google搜索但是我更加困惑。
请告知如何解决这个问题。谢谢
更新
按照symcbean的说明,我得到了以下结果:
bool(true)
array(5) {
[0]=> string(31) "alt3.gmail-smtp-in.l.google.com"
[1]=> string(26) "gmail-smtp-in.l.google.com"
[2]=> string(31) "alt4.gmail-smtp-in.l.google.com"
[3]=> string(31) "alt1.gmail-smtp-in.l.google.com"
[4]=> string(31) "alt2.gmail-smtp-in.l.google.com" }
IPV4 address = 64.233.188.27
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 = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile =
ini_capath =
If all good so far, then this bit should work....
fsockopen
Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in C:\Apache24\htdocs\phptest2.php on line 28
Warning: fsockopen(): Failed to enable crypto in C:\Apache24\htdocs\phptest2.php on line 28
Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) in C:\Apache24\htdocs\phptest2.php on line 28
bool(false) int(0) string(0) ""
第28行是这一行var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));
再次感谢
更新#2
我用google搜索&#34; fsockopen():SSL操作失败,代码为1。&#34;第一次警告
结束here。我改变了AVG的邮件端口,就像答案一样。 symcbean的代码运行没有错误,但我的代码回复了
mail error : authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 c1sm1243434wre.84 - gsmtp)]
所以我用Google搜索了code: 534, response: 5.7.14
并结束了here,按照emgh3i的第一个回答的说明,启用了较少的安全连接并允许访问我的Google帐户
现在它工作得很好。
答案 0 :(得分:6)
您的host
配置不应包含该协议。它失败的原因是它可能试图在ssl://smtp.gmail.com
上执行DNS查找并失败。
更改
'host' => 'ssl://smtp.gmail.com',
到
'host' => 'smtp.gmail.com',
答案 1 :(得分:6)
调试步骤很少:
我建议检查phpinfo()
以检查是否所有模块都已启用。检查邮件,fsocketopen。
启用debug
标记以确切检查问题所在。如下。
$smtp = Mail::factory('smtp', array(
'host' => 'ssl://smtp.gmail.com',
'port' => '465',
'auth' => true,
'debug' => true,
'pipelining' => true,
'username' => 'xxx@gmail.com',
'password' => 'xxx'
));
在我的机器上运行上面的代码后,我得到了跟进响应。问题可能与您的不同。但调试帮助了我。因为我启用了2FA,它给了我错误。我也收到了一封邮件,我的登录信息被阻止了。
DEBUG: Recv: 220 smtp.gmail.com ESMTP s65sm4891344pfi.36 - gsmtp DEBUG: Send: EHLO localhost DEBUG: Recv: 250-smtp.gmail.com at your service, [110.227.210.84] DEBUG: Recv: 250-SIZE 35882577 DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-CHUNKING DEBUG: Recv: 250 SMTPUTF8 DEBUG: Send: AUTH LOGIN DEBUG: Recv: 334 VsadfSFcm5hbWU6 DEBUG: Send: cGF0ZWwuZ29wYhkafdaASFnbWFpbC5jb20= DEBUG: Recv: 334 UGFzc3dvcmQ6 DEBUG: Send: OWwzMy5zaHlAbTE4 DEBUG: Recv: 534-5.7.14 Please log in via your web browser and DEBUG: Recv: 534-5.7.14 then try again. DEBUG: Recv: 534-5.7.14 Learn more at DEBUG: Recv: 534 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp DEBUG: Send: RSET DEBUG: Send: QUIT DEBUG: Recv: 250 2.1.5 Flushed s65sm4891344pfi.36 - gsmtp DEBUG: Recv: 221 2.0.0 closing connection s65sm4891344pfi.36 - gsmtp
authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp)]
您的问题看起来像PHP甚至无法连接到gmail服务器。
答案 2 :(得分:6)
答案 3 :(得分:4)
我试图测试我的Gmail帐户。邮件发送成功。
<?php
error_reporting(E_ALL);
var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr));
var_dump($errno);
var_dump($errstr);
类型(流)的资源(4)
INT(0)
string(0)&#34;&#34;
答案 4 :(得分:2)
在开始之前,我先说一下,您的服务器和谷歌服务器之间可能存在许多可能的解决方案和结果,因此这些可能适用于不同的人,也可能不适用。
1) SMTP不是很安全,因此Google可能会拒绝您的请求。我在6个月前遇到了这个问题,解决方案是在'myaccount.google.com'下启用不安全的应用
2)如果这对您不起作用,那么您可以考虑切换协议。
这
'host' => 'ssl://smtp.gmail.com',
到
'host' => 'tls://smtp.gmail.com:587';
答案 5 :(得分:2)
到目前为止,Kyung-yoong是唯一为解决问题做出有意义贡献的人(+1 Been!)。我可以证实他的结果。我会建议你尝试相同的。您目前正在尝试调试相当复杂的组件堆栈:
一直在为你做你的工作 - 正如发布问题的人 - 应该创建一个Minimal, Complete, and Verifiable example
希望这也能提供更有意义的诊断信息。
失败的最可能原因是:
因此,您可能会考虑更详细的测试脚本实现:
<?php
error_reporting(E_ALL);
print "DNS\n";
var_dump(getmxrr('gmail.com',$result));
var_dump($result);
$use_ip=gethostbyname($result[0]);
print "IPV4 address = $use_ip\n";
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";
}
print "\nIf all good so far, then this bit should work....\n";
print "fsockopen\n";
var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));
var_dump($errno);
var_dump($errstr);
哪个应该给你这样的回复:
DNS
bool(true)
array(5) {
[0]=>
string(31) "alt1.gmail-smtp-in.l.google.com"
[1]=>
string(31) "alt2.gmail-smtp-in.l.google.com"
[2]=>
string(31) "alt4.gmail-smtp-in.l.google.com"
[3]=>
string(26) "gmail-smtp-in.l.google.com"
[4]=>
string(31) "alt3.gmail-smtp-in.l.google.com"
}
IPV4 address = 74.125.131.26
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 = /usr/lib/ssl/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = /usr/lib/ssl/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = /usr/lib/ssl/private
default_default_cert_area = /usr/lib/ssl
ini_cafile =
ini_capath =
If all good so far, then this bit should work....
fsockopen
resource(4) of type (stream)
int(0)
string(0) ""
鉴于我们无法复制您的错误,我们无法明确回答问题所在 - 但我的猜测是you haven't configure openSSL。
答案 6 :(得分:2)
当事情失败时,我们不知道原因,我们必须做调试。所以这里不是回答我要求你执行一些测试
确认系统与互联网的连接:打开cmd终端并输入
ping smtp.gmail.com
确认防火墙:在cmd终端中输入以下内容
telnet smtp.gmail.com 465
确认php设置:在cmd终端输入php -a
,然后在php提示符下执行(复制/粘贴然后按回车键)代码。
$result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, $error_message, 5);
if ($result === false) {
echo "error no: $error_no error message: $error_message";
echo print_r($result, true);
} else {
echo 'success';
}
确认Pear Mail库和Gmail SMTP访问:再次在cmd和php提示符php -a
执行您自己的代码(正如您在此主题中发布的那样)
让我们知道它在哪里,以及错误是什么。只有在那之后我们才能提供帮助
答案 7 :(得分:0)
在PHP 5.3中,其他人提供了关于&#34;不太安全的应用程序的提示,&#34;登录到您的Google Gmail帐户时需要激活,解决了我的所有问题。
在PHP 7.2中,我必须做更多的事情:设置&#39; auth&#39;到PLAIN然后添加&#34; verify_peer&#34;和ssl socket_options的verify_peer_name如下:
$mail= Mail::factory('smtp', array('host' => 'ssl://smtp.gmail.com',
'port' => '465',
'auth' => 'PLAIN',
'socket_options' => array('ssl' => array('verify_peer' => false,
'verify_peer_name' => false)),
'username' => 'someAccount@gmail.com',
'password' => 'myPassword'
));
答案 8 :(得分:0)
这可能与问题没有直接关系,但对于通过远程服务器使用 Pear SMTP 发送电子邮件时遇到问题的任何人,真正的问题不是防火墙配置而是 SELINUX。如果打开,这是默认设置,您可能会花几天的时间想知道为什么权限被拒绝。只需告诉 selinux 允许 apache 发送电子邮件:
setsebool -P httpd_can_sendmail 1
我希望这可以为某人省去麻烦。