PHP Mail 函數與郵件發送完整指南
簡介
mail() 函數允許您直接從 PHP 腳本發送電子郵件。它需要伺服器已安裝並正在運行郵件系統(如 sendmail、Postfix、Exim 或 Windows SMTP 服務),具體行為由 php.ini 設定決定。
執行期設定 (php.ini)
| 指令 | 預設值 | 說明 | 可變範圍 |
| SMTP | localhost | Windows 專用:SMTP 伺服器 DNS 或 IP | PHP_INI_ALL |
| smtp_port | 25 | Windows 專用:SMTP 連接埠 (PHP 4.3+) | PHP_INI_ALL |
| sendmail_from | NULL | Windows 專用:預設寄件者地址 | PHP_INI_ALL |
| sendmail_path | NULL | Unix 專用:sendmail 程式路徑 (通常 /usr/sbin/sendmail) | PHP_INI_SYSTEM |
核心函數
| 函數 | 說明 | PHP 版本 |
mail() | 從腳本直接發送電子郵件 | 3 |
ezmlm_hash() | 計算 EZMLM 郵件列表系統所需的雜湊值 | 3 |
基本用法範例
<?php
$to = 'recipient@example.com';
$subject = '測試郵件';
$message = '這是一封由 PHP 發送的測試郵件。';
$headers = "From: sender@example.com\r\n";
$headers .= "Reply-To: sender@example.com\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
if (mail($to, $subject, $message, $headers)) {
echo '郵件發送成功';
} else {
echo '郵件發送失敗';
}
?>
進階建議
- 生產環境建議使用成熟的函式庫(如 PHPMailer、Symfony Mailer)支援 SMTP 驗證、SSL/TLS、附件、HTML 郵件等。
- 注意郵件標頭注入風險,務必過濾使用者輸入的標頭欄位。
- 大量發送時應使用佇列機制,避免阻塞腳本或觸發反垃圾郵件機制。
- 設定 SPF、DKIM、DMARC 紀錄提高送達率。
常見問題
- Windows 本機測試失敗:需安裝 SMTP 服務或使用外部 SMTP 伺服器(如 Gmail SMTP)。
mail() 返回 true 但未收到信:檢查垃圾郵件資料夾、郵件伺服器日誌、反垃圾郵件設定。