WordPress网站开启邮件发送功能
前言
最近搭建WordPress网站时,开启允许用户注册功能后,想要实现新用户通过邮件链接方式激活账号功能,此时就需要使网站具有邮件发送功能。
在具体实现过程中遇到了几个头疼的问题,经过网上查阅信息、请教别人等方式,结果还是没有完全解决问题,中间重复尝试了各大邮箱平台STMP服务器端口测试,检测服务器安全组设置,更换服务器PHP版本,更换插件等方法,最终通过调试详细了解错误日志发现是服务器内部文件配置问题,准确说是PHP配置文件
通过这次经历,感觉除了在解决这个问题上等其他方面收获很多,于是就详细记录下WordPress网站开启邮件发送功能的配置和问题解决方案以及收获感悟。
目录
- 0 几点提示
- 1 操作环境
- 2 开启SMTP服务
- 3 安装插件
- 4 配置信息
- 5 处理问题
- 6 避坑技巧
- 7 总结经验
0、几点提示
- 1 注意演示环境问题,环境不同通常会导致错误问题不同,解决办法不一致。
- 2 我这里是基于在服务器安装宝塔面板上操作的
- 3 修改配置文件时,可以先把文件下载出来,便于搜索查找和修改,宝塔面板可以直接搜索使用。
1、操作环境
- 服务器: Linux Ubuntu 20.04 (阿里云服务器)
- Web服务器: Nginx 1.14.2
- PHP: 8.0
- WordPress: 5.7.2
2、开启SMTP服务
提示
由于遇到问题时,猜测可能是邮箱的原因,我这里尝试开通了QQ邮箱和网易163邮箱的SMTP服务,在这里我以QQ邮箱演示。
首先登陆自己QQ邮箱到网页版界面,找到设置->账户-> 看到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启对应服务(默认是关闭的)。
然后点击获取授权码,授权码一般是随机的16个字母,鼠标滑过Ctrl+C复制到一个地方存起来。
注意
这里的授权码就是一会要在插件配置信息中用到的smtp服务器密码。
补充
在这里可以使用其他多个邮箱,包括新浪邮箱,126邮箱,163邮箱,阿里云邮箱和qq邮箱。其中新浪邮箱和阿里云邮箱不需要授权码,也就是一登录账号和密码就可以在第三方直接使用。但主流的qq邮箱,网易邮箱在第三方登录时需要输入授权码,qq邮箱的独立密码也不行,必须是授权码。
3、安装插件
WordPress网站安装插件可以在后台直接搜索安装或者下载插件进行手动安装,由于篇幅原因不在这里展开赘述,若有不会去百度查询下就行,也是非常简单。
刚开始我安装的是Easy WP SMTP插件,其较于轻量级,配置比较简单,对小白较为友好,但其缺点就是报错提供信息不详细,没有详细错误日志信息。
于是我就安装了WP Mail SMTP by WPForms插件,它在测试邮件时可以提供详细的错误日志信息,后面解决问题也是基于debug日志进行修改的,所以建议安装。
4、配置信息
这些插件的常规设置都大同小异,几乎主要包含以下选项
- 发件人电子邮件地址
用于向收件人发送电子邮件的电子邮件地址。 - 发件人名称
收件人在收到您的邮件内容时将在“发件人”或“发件人”值中看到的名称 - SMTP主机
您外发邮件的服务器(例如:smtp.gmail.com) - 加密类型
无/SSL/TLS - SMTP端口
用于将发出邮件递送到邮件服务器的端口(例如:465) - SMTP认证
否/是(此选项应始终选中 “是”) - 用户名
用于登录邮件服务器的用户名 - 密码
用于登录邮件服务器的密码
不同插件具体使用,这里不再赘述,如果不会可以去网上查一下。
注意
- SMTP主机端口
由于阿里云服务器已经限制使用25端口,所以我们这里使用> 465端口的ssl加密方式。- 密码
这里的密码是刚才保存的授权码,不是邮箱登陆密码或独立密码。
5、处理问题
通过前面一番准备、配置工作,到了关键时刻,进行邮件测试。
刚开始在Easy WP SMTP 插件下报错,我分别尝试了25端口和465端口,报错信息如下
报错提示说是连接smtp服务器超时或的意思
465端口直接提示连接smtp服务器失败
然后就开始百度这两个问题,各种解决方案,有说需要开启 fsockopen的,有说需要服务器安全组放行端口的等等,结果仍没能找到有效的方法。
然后尝试更换smtp服务器为网易163邮箱,结果以失败告终。
最后尝试更换插件,依然无效,但是WP Mail SMTP by WPForms插件有详细的错误日志信息,于是就开始仔细搞懂每一个报错信息,并寻找解决办法。
1、首先报错位置提示
open_basedir restriction in effect.
2021-06-26 04: 49:43 Connection failed. Error #2: stream_socket_client(): open_basedir restriction in effect.
File(/etc/pki/tls/certs/ca-bundle.crt) is not within the allowed path(s): ( /ww/wwwroot/wordpress/ :/tmp/)
/www/wwwroot/wordpress/wp- inc Ludes/PHPMailer/SMTP.php line 387]
发现是 stream_socket_client这个函数没有正常运行。
提示原因说 open_basedir 没有包含/etc/pki/tls/certs/ca-bundle.crt,那就去把它包含进去。
把权限作用域由入口文件目录修改为框架根目录
打开 php.ini 搜索 open_basedir,修改为对应的路径即可。
在宝塔面板这个问题非常容易解决
只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
这个问题是说PHP不能引入其授权目录上级及其以上的文件;
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
然后再去测试邮件,发现果真没有了这一行报错信息。但依然没解决问题,接着分析错误日志。
2、failed loading cafile stream
大概意思是说加载 cafile 流失败,看文件名像是证书文件。
也就是未能找到该文件,然后就按照提示路径去查找,结果发现真的没有存在,那么问题就是文件路径错误无疑了,那这个文件在哪里呢?
直接去服务器查找ca-bundle.crt,发现它在/www/wwwroot/wordpress/wp-includes/certificates/ca-bundle.crt
这里。
那么下面操作毋庸置疑,就是修改加载他的路径,在你的PHP安装目录下找到php.ini文件打开搜索找到
curl.cainfo = /etc/ca-bundle.crt
openssl.cafile = /etc/ca-bundle.crt
修改为正确路径
curl.cainfo = /www/wwwroot/wordpress/wp-includes/certificates/ca-bundle.crt
openssl.cafile = /www/wwwroot/wordpress/wp-includes/certificates/ca-bundle.crt
然后再去测试发送邮件,发现完美解决问题。
6 避坑技巧
- 目前阿里云和腾讯云已经禁止了25端口,所以大家记得用465端口!
- 判断主机是否支持mail()函数,事实上宝塔面板支持mail函数的,万网的主机好像不支持mail函数,都需要通过 SMTP 来发送邮件,而且要开启 fsockopen 。
- 但是 WordPress的SMTP发送方式为 steam_connect_client 而非fsockopen。
7、总结经验
通过这次实践解决问题,感觉主要收获的不是这个问题的解决方案,更重要的是遇到问题时,分析问题和查询解决问题办法的思路以及技巧,这是在遇到任何问题时都适用的,可以说是所谓的经验。
首先遇到问题时不要去盲目的在网上查找原因,然后去直接按照别人的解决方案去修改,因为有可能错误细节问题不一样,或是环境不一致,比如服务器不一样或版本不同等。
其次是主要的是要学会自己去分析问题,就是按照报错日志信息去分析自己遇到的问题,然后去查阅相关问题再去解决它。
最后就是要勇于尝试,在这次解决过程中,我曾尝试了已知的所有解决问题,再有就是要去屏蔽问题,也就是每次只要去测试一个问题,避免混淆。
结语
这里主要就是详细记录这次解决方案以及经验总结,希望可以帮助到你。遇到问题不要怕,解决问题的过程正是提高自己的最佳途径。
推荐关注