1. 程式人生 > >【PHP】在阿里雲伺服器Ubuntu郵箱PHPMailer使用出現500的問題

【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埠的問題)

新增安全組規則的方法:

登入阿里雲->管理控制檯->雲伺服器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;

成功接收郵箱 

總結

如果有使用阿里雲伺服器的小夥伴,遇到埠問題,很大可能就是因為阿里雲禁用埠

所以記得去管理控制檯中新增安全組規則

學習之路沒有解決不了的問題,不要因為一點小問題而自暴自棄或者煩躁,不如冷靜一下

想一想問題根源所在,明白自己要做的是什麼,多查資料利用好身邊的資源加油!共勉!