composer require phpmailer/phpmailer
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
function sendMail(array $to, string $subject, string $body, array $attachments = []): bool
{
$mail = new PHPMailer(true);
try {
// === 伺服器設定 ===
$mail->SMTPDebug = SMTP::DEBUG_OFF; // 開發時可用 DEBUG_SERVER
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your_email@gmail.com'; // Gmail 帳號
$mail->Password = 'your_app_password'; // 應用程式密碼 (非登入密碼)
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // SSL (port 465)
$mail->Port = 465;
$mail->CharSet = 'UTF-8';
// === 寄件人/收件人 ===
$mail->setFrom('your_email@gmail.com', '系統名稱');
foreach ($to as $addr => $name) {
$mail->addAddress($addr, $name);
}
$mail->addReplyTo('reply@example.com', '回覆名稱');
// === 郵件內容 ===
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AltBody = strip_tags($body); // 純文字備用
// === 附件處理 ===
foreach ($attachments as $path => $name) {
$mail->addAttachment($path, $name);
}
$mail->send();
return true;
} catch (Exception $e) {
error_log("Mailer Error: {$mail->ErrorInfo}");
return false;
}
}
// === 使用範例 ===
$sent = sendMail(
['user@example.com' => '使用者名稱'],
'測試主旨',
'<h1>HTML 內容</h1><p>支援中文</p>',
['/path/file.pdf' => '報表.pdf']
);
echo $sent ? '寄送成功' : '寄送失敗';
| 設定 | 說明 | Gmail 值 |
|---|---|---|
| Host | SMTP 伺服器 | smtp.gmail.com |
| Port | 連接埠 | 465 (SSL) / 587 (TLS) |
| SMTPSecure | 加密方式 | ENCRYPTION_SMTPS / ENCRYPTION_STARTTLS |
| Username | 完整 Gmail 信箱 | your@gmail.com |
| Password | 應用程式密碼 (需開啟 2FA) | 16 碼代碼 |
$mail->addEmbeddedImage('/path/logo.png', 'logo_cid');
$mail->Body = '<img src="cid:logo_cid" alt="Logo">';
$mail->SMTPKeepAlive = true; // 保持連線
foreach ($users as $user) {
$mail->clearAddresses();
$mail->addAddress($user['email'], $user['name']);
$mail->Body = str_replace('{{name}}', $user['name'], $template);
$mail->send();
}
安全提醒:勿將帳密寫死程式碼,請使用環境變數 (
$_ENV或getenv()) 或密鑰管理系統。