PHP 发送电子邮件(Mail)
在 PHP 中,发送电子邮件通常有以下几种方式:
- 使用
mail()函数(依赖服务器配置) - 使用
PHPMailer(支持 SMTP 发送,推荐) - 使用
SwiftMailer(高级邮件库) - 使用 API(如 SendGrid、Mailgun、SMTP 服务器)
1. 使用 mail() 函数(简单邮件)
PHP 内置 mail() 函数可以发送邮件,但需要服务器支持 sendmail 或 Postfix。
示例代码:
$to = "recipient@example.com"; // 收件人
$subject = "测试邮件";
$message = "Hello, 这是一封测试邮件。";
$headers = "From: sender@example.com" . "\r\n" .
"Reply-To: sender@example.com" . "\r\n" .
"X-Mailer: PHP/" . phpversion();
if (mail($to, $subject, $message, $headers)) {
echo "邮件已发送";
} else {
echo "邮件发送失败";
}
注意事项:
mail()依赖服务器的邮件传输代理(MTA),如sendmail或Postfix。- 在 Windows 上,需要在
php.ini配置:
SMTP = smtp.example.com
smtp_port = 25
sendmail_from = me@example.com
mail()不支持 SMTP 认证,因此在共享主机或本地开发环境可能无法使用。
2. 使用 PHPMailer(推荐,支持 SMTP)
PHPMailer 是 PHP 最流行的邮件库,支持 SMTP 服务器、附件、HTML 邮件等。
安装 PHPMailer
composer require phpmailer/phpmailer
SMTP 方式发送邮件
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // SMTP 服务器
$mail->SMTPAuth = true;
$mail->Username = 'your-email@example.com'; // SMTP 用户名
$mail->Password = 'your-email-password'; // SMTP 密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS 加密
$mail->Port = 587; // 端口号(25、465、587)
// 发件人信息
$mail->setFrom('your-email@example.com', 'Your Name');
$mail->addAddress('recipient@example.com', 'Recipient Name'); // 收件人
$mail->addReplyTo('your-email@example.com', 'Your Name');
// 邮件内容
$mail->isHTML(true);
$mail->Subject = '测试邮件';
$mail->Body = '<h1>Hello</h1><p>这是一封测试邮件。</p>';
$mail->AltBody = '这是一封测试邮件。';
$mail->send();
echo '邮件已发送';
} catch (Exception $e) {
echo "邮件发送失败: {$mail->ErrorInfo}";
}
PHPMailer 主要功能
- 支持 SMTP 认证
- 支持 HTML 邮件和附件
- 支持 SSL/TLS 加密
3. 使用 SwiftMailer
SwiftMailer 是另一个强大的 PHP 邮件库,但 PHPMailer 更流行。
安装 SwiftMailer
composer require swiftmailer/swiftmailer
使用 SMTP 发送邮件
require 'vendor/autoload.php';
$transport = (new Swift_SmtpTransport('smtp.example.com', 587))
->setUsername('your-email@example.com')
->setPassword('your-email-password')
->setEncryption('tls');
$mailer = new Swift_Mailer($transport);
$message = (new Swift_Message('测试邮件'))
->setFrom(['your-email@example.com' => 'Your Name'])
->setTo(['recipient@example.com' => 'Recipient Name'])
->setBody('这是一封测试邮件。', 'text/html');
$result = $mailer->send($message);
if ($result) {
echo "邮件已发送";
} else {
echo "邮件发送失败";
}
4. 使用邮件 API(SendGrid / Mailgun / SMTP)
如果你的服务器不支持 mail() 或 SMTP,建议使用邮件 API,如:
使用 SendGrid API 发送邮件
- 注册 SendGrid 并获取 API Key
- 安装 SendGrid PHP SDK
composer require sendgrid/sendgrid
- 使用 API 发送邮件
require 'vendor/autoload.php';
use SendGrid\Mail\Mail;
$email = new Mail();
$email->setFrom("your-email@example.com", "Your Name");
$email->setSubject("测试邮件");
$email->addTo("recipient@example.com", "Recipient Name");
$email->addContent("text/plain", "这是一封测试邮件。");
$email->addContent("text/html", "<p>这是一封 <strong>测试邮件</strong>。</p>");
$sendgrid = new \SendGrid('YOUR_SENDGRID_API_KEY');
try {
$response = $sendgrid->send($email);
echo "邮件已发送";
} catch (Exception $e) {
echo "邮件发送失败: " . $e->getMessage();
}
5. 选择最佳邮件发送方式
| 方式 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
mail() | 仅适用于已配置邮件服务器 | 简单 | 依赖服务器配置,无法 SMTP 认证 |
PHPMailer | 推荐用于所有场景 | 支持 SMTP、HTML、附件 | 需要安装库 |
SwiftMailer | 高级邮件处理 | 面向对象架构 | 不如 PHPMailer 流行 |
邮件 API(SendGrid 等) | 云服务器 / 共享主机 | 不依赖服务器 | 需要 API Key |
推荐方案:
- 服务器支持
mail()时,可使用mail() - 服务器 不支持
mail(),推荐PHPMailer - 需要 高发送成功率,推荐 SendGrid、Mailgun
6. 常见问题
Q1: 为什么 mail() 发送失败?
- 确保服务器已安装
sendmail:
sudo apt install sendmail
sudo service sendmail restart
- 确保
php.ini配置 SMTP 服务器(Windows 环境)。
Q2: 为什么邮件进了垃圾箱?
- 确保 发件人邮箱 与 SMTP 服务器 匹配(避免伪造邮件)。
- 设置 SPF、DKIM、DMARC 记录:
- SPF: 确保邮件服务器被授权发送邮件
- DKIM: 电子邮件签名验证
- DMARC: 邮件防伪策略
Q3: 如何发送带附件的邮件?
PHPMailer 示例
$mail->addAttachment('/path/to/file.pdf', '附件.pdf');
7. 参考资料
更多详细内容请关注其他相关文章!