早期 PHP 開發者常自行組裝 MIME 郵件(如本文原始碼),但容易踩坑:編碼錯誤、附件損壞、郵件被判定為垃圾郵件、不支援 TLS/SSL、維護困難。現代專案強烈建議使用 PHPMailer 或 Symfony Mailer。
composer require phpmailer/phpmailer
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// SMTP 設定
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@email.com';
$mail->Password = 'yourpassword';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 或 PHPMailer::ENCRYPTION_SMTPS
$mail->Port = 587;
// 寄件人/收件人
$mail->setFrom('from@example.com', '寄件者名稱');
$mail->addAddress('to@example.com', '收件者名稱');
$mail->addReplyTo('reply@example.com', '回覆名稱');
// 附件
$mail->addAttachment('/path/to/file.pdf', 'custom_name.pdf'); // 可選自訂檔名
$mail->addAttachment('/path/to/image.jpg');
// 內容
$mail->isHTML(true);
$mail->Subject = '測試帶附件郵件';
$mail->Body = '這是 HTML 格式郵件內容,含附件。';
$mail->AltBody = '這是純文字備用內容。';
$mail->send();
echo '郵件已發送';
} catch (Exception $e) {
echo "發送失敗:{$mail->ErrorInfo}";
}
?>
addAttachment()。addEmbeddedImage(),HTML 中以 cid:xxx 參考。僅限極簡環境,需自行組裝完整 MIME 標頭、Base64 編碼附件、處理換行與界線字串,極易出錯。參考原始碼邏輯:建立 boundary、分段組裝 header/body/attachment、最後 mail($to, $subject, $message, $headers)。
結論:請直接使用 PHPMailer,省時、穩定、功能完整。