【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;
成功接收郵箱
總結
如果有使用阿里雲伺服器的小夥伴,遇到埠問題,很大可能就是因為阿里雲禁用埠
所以記得去管理控制檯中新增安全組規則
學習之路沒有解決不了的問題,不要因為一點小問題而自暴自棄或者煩躁,不如冷靜一下
想一想問題根源所在,明白自己要做的是什麼,多查資料,利用好身邊的資源,加油!共勉!