目录
背景
正文
总结
最近在完成一个期末作业,涉及到了邮箱验证,使用的是PHPMailer发送邮件,在本地服务器上可以成功通过测试,可上传到阿里云服务器时,出现500错误,无法发送邮箱
原因①fscokopen不能被禁用(我的PHP默认没有禁用)
查看是否禁用的方法:
echo(function_exists("fsockopen"));//1为启动,0为禁用
启动fsockopen的方法:
php.ini中开启allow_url_fopen,即allow_url_fopen = On
并在php.ini中开启php_openssl.dll,即删除extension=php_openssl.dll前面的;
原因②SMTP.php中替换stream_socket_client为fsockopen
在SMTP.php中查找如下字段
$this->smtp_conn = stream_socket_client(
$host . ':' . $port,
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$socket_context
);
将其注释掉,然后新增
$this->smtp_conn = fsockopen($host, $port, $errno, $errstr);
原因③SMTP端口是否被禁用
阿里云服务器默认没有启动25端口,即SMTP(Simple Mail Transfer Protocol, 简单邮件传输协议)传输过程中必备的端口。
需要在云控制台中新增安全组规则,阿里云服务器限制端口的情况,在我之前的博客中也遇到过了
戳这里跳转到我之前的博客(【SSL】配置好SSL仍然无法通过阿里云服务器访问https443端口的问题)
添加安全组规则的方法:
登录阿里云->管理控制台->云服务器ESC
按照图中填写端口范围跟授权对象即可->确定
题外话:
有些小伙伴在一开始发送邮箱的时候出现Deprecated: __autoload() is deprecated in PHP 7.2的问题
原因是高版本的php已经忽略 __autoload()这个函数,所以需要将其删除或注释掉
在PHPMailerAutoload.php中查找如下字段
if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
//SPL autoloading was introduced in PHP 5.1.2
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
spl_autoload_register('PHPMailerAutoload', true, true);
} else {
spl_autoload_register('PHPMailerAutoload');
}
}
将如下字段注释掉
else {
/**
* Fall back to traditional autoload for old PHP versions
* @param string $classname The name of the class to load
*/
function __autoload($classname)
{
PHPMailerAutoload($classname);
}
}
最后的效果如下,注释或删除else中的代码
if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
//SPL autoloading was introduced in PHP 5.1.2
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
spl_autoload_register('PHPMailerAutoload', true, true);
} else {
spl_autoload_register('PHPMailerAutoload');
}
}//} else {
// /**
// * Fall back to traditional autoload for old PHP versions
// * @param string $classname The name of the class to load
// */
// function __autoload($classname)
// {
// PHPMailerAutoload($classname);
// }
//}
一些细节
实例化PHPMailerher核心类的时候,记得留意命名空间的问题
关于命名空间的使用,可以戳我之前的博客 【PHP】namespace的使用
// 实例化PHPMailer核心类
$this->sdCo = new PHPMailer\PHPMailer\PHPMailer();
//这里的$this->sdCo是我自己改的,默认情况应该是$mail
SMTPSecure 记得设置为'ssl'加密
// 设置使用ssl加密方式登录鉴权
$this->sdCo->SMTPSecure = 'ssl';
连接SMTP端口号设置成465,同时
记得在阿里云服务器中添加安全组规则,把465端口添加进去!!!
记得在阿里云服务器中添加安全组规则,把465端口添加进去!!!
记得在阿里云服务器中添加安全组规则,把465端口添加进去!!!
(我已经在阿里云服务器禁用端口中吃了不少亏,有很多错误都是因为没有添加安全组规则,希望小伙伴记得添加安全组规则)
// 设置ssl连接smtp服务器的远程服务器端口号
$this->sdCo->Port = 465;
成功接收邮箱
如果有使用阿里云服务器的小伙伴,遇到端口问题,很大可能就是因为阿里云禁用端口
所以记得去管理控制台中添加安全组规则
学习之路没有解决不了的问题,不要因为一点小问题而自暴自弃或者烦躁,不如冷静一下
想一想问题根源所在,明白自己要做的是什么,多查资料,利用好身边的资源,加油!共勉!