PHP

PHP开启https后无法发送邮件问题

Guooo
2018-09-18 / 0 评论 / 3,708 阅读 / 正在检测是否收录...
今天打开中国移动家的WIFI,然后进入我自己的科学小机场,发现里面!居然!出现了!广告!!

首先我的网站是不可能投放广告的,(对,也没有人找我接广告),而服务器又是国外某大厂的,更不可能出现广告。
所以只有一个情况,网络被某动运行商劫持了。
于是我决定要给我的小机场加个小绿锁了。

经过一通计算机基础操作,我把网站成功加上了https。于是我兴冲冲地把我的小网站拿去给朋友分享。

https的小机场

然后朋友吐槽我邮件怎么那么慢,一分钟了都没发送成功

我:????

我为了稳定性(懒)直接用的巨硬家的邮件服务,端口开放,我的服务器倒了巨硬的都不会,为什么会邮件发送失败?昨天还好好的...
我第一时间测试了一遍,果然!发送失败了....
然后我又在本地用相同配置测试了一遍,一切正常。
我第一时间怀疑的就是https的锅。

SMTP 的 debug level 调整到 2 后,出现了更多的报错信息:SSL routines:ssl3_get_server_certificate:certificate verify failed
证书验证失败。

我开始笃定跟https有关,又拿不出证据。

万能的Google
啊....
啊...
啊..

好了,找到了。

Google :你PHP的OpenSSL扩展没开
我 :扯犊子呢,我开了。再说,没开扩展我昨天怎么发送出去的。
Google : Emmmmmm......
我:Emmmmm????
Google:你的PHP找不到默认的根证书导致的这个问题,一般OpenSSL不会自带根证书,需要你自己搞一个放到根目录
我:去哪搞?
Google:这有一个神奇的链接:http://curl.haxx.se/ca/cacert.pem
我:下好了,放哪?
Google:放到PHP的根证书的目录啊
我:???目录在哪?
Google:....你执行这一段就知道了php -r "print_r(openssl_get_cert_locations());"
我:返回这个东西:

[root@vultr ~]# php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /usr/local/openssl/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/local/openssl/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/local/openssl/ssl/private
    [default_default_cert_area] => /usr/local/openssl/ssl
    [ini_cafile] => /etc/pki/tls/certs/ca-bundle.crt
    [ini_capath] => 
)

Google:看到那个default_cert_file了吗?把你下载的文件改成相同名字的cert.pem,然后放到default_cert_file对应的目录下就行了
我:我都看不到ssl文件夹....
Google:没有文件夹就新建一个,别那么多废话
我:诶?真的有用!真棒!不枉我整天费劲去
Google:......

至此,邮件功能又恢复正常了。

发送邮件

默认路径

0

评论 (0)

取消