使用 PHPMailer 透過 Gmail SMTP 群發郵件時,常遇到認證失敗、SSL 未啟用、連線中斷等問題。本文彙總實戰中遇到的核心問題及解決方案,助你快速建立穩定的郵件發送系統。
原因 A:帳號/密碼錯誤——確認使用「應用程式密碼」而非登入密碼(需開啟兩步驗證)。
原因 B:迴圈發送未關閉 SMTP 連線——每次 send() 後必須呼叫 SmtpClose(),否則第二封郵件會因連線殘留而失敗。
$mail = new PHPMailer(true);
foreach ($recipients as $to) {
try {
$mail->clearAddresses();
$mail->addAddress($to);
$mail->send();
} catch (Exception $e) {
// 記錄錯誤
} finally {
$mail->SmtpClose(); // 關鍵:每發一封關一次連線
}
}
PHP 必須啟用 OpenSSL 擴展,否則無法建立加密連線。
php.ini,取消註釋或添加:extension=php_openssl.dllphp_openssl.dll、ssleay32.dll、libeay32.dll 複製到 C:\Windows\System32\(或 Apache/bin 目錄)以 PHP 5.2.14 為例:
# 1. 下載對應版本原始碼 cd /var/www/php5 wget https://mirrors.sohu.com/php/php-5.2.14.tar.gz tar zxvf php-5.2.14.tar.gz # 2. 進入 openssl 擴展目錄 cd php-5.2.14/ext/openssl/ # 3. 執行 phpize(若報錯 config.m4 缺失,重命名 config0.m4) mv config0.m4 config.m4 /var/www/php5/bin/phpize # 4. 配置編譯 ./configure --with-openssl --with-php-config=/var/www/php5/bin/php-config # 5. 編譯安裝 make && make install # 6. 修改 php.ini 添加 extension=openssl.so,重啟 PHP-FPM/Apache
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com';
$mail->Password = 'your_app_password'; // 應用程式密碼
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 或 SSL
$mail->Port = 587; // SSL 用 465
$mail->CharSet = 'UTF-8';
$mail->setFrom('your@gmail.com', '寄件者名稱');
$mail->isHTML(true);
PHPMailer 群發 Gmail 核心在於:正確的認證方式(應用程式密碼)、啟用 OpenSSL、每封郵件獨立 SMTP 連線、頻率控制與佇列化。遵循最佳實踐,可構建高可用、高送達率的郵件系統。