【PHP】在阿里云服务器Ubuntu邮箱PHPMailer使用出现500的问题

背景

最近在完成一个期末作业,涉及到了邮箱验证,使用的是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端口的问题)

扫描二维码关注公众号,回复: 4752670 查看本文章

添加安全组规则的方法:

登录阿里云->管理控制台->云服务器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;

成功接收邮箱 

总结

如果有使用阿里云服务器的小伙伴,遇到端口问题,很大可能就是因为阿里云禁用端口

所以记得去管理控制台中添加安全组规则

学习之路没有解决不了的问题,不要因为一点小问题而自暴自弃或者烦躁,不如冷静一下

想一想问题根源所在,明白自己要做的是什么,多查资料利用好身边的资源加油!共勉!

猜你喜欢

转载自blog.csdn.net/weixin_41463193/article/details/85058505
今日推荐