本文目录导读:

在PHP项目中发送邮件,主要有以下几种常见方式,我会从最推荐到最基础依次介绍:
推荐方式:使用第三方邮件库(PHPMailer)
为什么推荐? 支持SMTP认证、HTML邮件、附件、中文不乱码,且支持各种邮件服务(QQ、163、Gmail、SendGrid等)。
安装(Composer)
composer require phpmailer/phpmailer
示例代码(QQ邮箱示例)
<?php
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function sendMail($to, $subject, $body) {
$mail = new PHPMailer(true);
try {
// 服务器配置
$mail->isSMTP();
$mail->Host = 'smtp.qq.com'; // SMTP服务器
$mail->SMTPAuth = true;
$mail->Username = 'your@qq.com'; // 邮箱账号
$mail->Password = 'your_smtp_password'; // SMTP授权码(不是登录密码)
$mail->SMTPSecure = 'ssl'; // 启用SSL加密
$mail->Port = 465; // SSL端口
// 发件人
$mail->setFrom('your@qq.com', '网站名称');
// 收件人
$mail->addAddress($to, '收件人名称');
// 内容
$mail->isHTML(true);
$mail->CharSet = 'UTF-8';
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AltBody = strip_tags($body); // 纯文本备用
$mail->send();
return ['success' => true, 'message' => '邮件发送成功'];
} catch (Exception $e) {
return ['success' => false, 'message' => $mail->ErrorInfo];
}
}
// 使用示例
$result = sendMail(
'recipient@example.com',
'欢迎注册',
'<h1>您好!</h1><p>感谢您注册我们的网站。</p>'
);
使用 Symfony Mailer(现代框架推荐)
适用于Laravel、Symfony等框架,或者作为独立组件使用。
composer require symfony/mailer
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Email;
$transport = Transport::fromDsn('smtp://username:password@smtp.example.com:587');
$mailer = new Mailer($transport);
$email = (new Email())
->from('sender@example.com')
->to('recipient@example.com')
->subject('邮件主题')
->html('<p>HTML内容</p>');
$mailer->send($email);
使用原生 mail() 函数(不推荐)
缺点:配置复杂、容易进垃圾箱、不支持SMTP认证、中文容易乱码。
$to = 'recipient@example.com';
$subject = '=?UTF-8?B?' . base64_encode('邮件主题') . '?=';
$message = '<p>邮件内容</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);
各邮箱SMTP配置参考
| 邮箱 | SMTP服务器 | SSL端口 | 非SSL端口 | 密码说明 |
|---|---|---|---|---|
| smtp.qq.com | 465 | 587 | 需开启SMTP服务获取授权码 | |
| 163 | smtp.163.com | 465 | 25 | 需开启SMTP服务获取授权码 |
| Gmail | smtp.gmail.com | 465 | 587 | 需应用专用密码 |
| 阿里云邮件 | smtpdm.aliyun.com | 465 | 80 | 配置发信地址 |
企业级方案:邮件服务API
对于高并发的生产环境,建议使用专业邮件服务:
- SendGrid -
composer require sendgrid/sendgrid - Mailgun -
composer require mailgun/mailgun-php - 阿里云邮件推送 - 通过HTTP API调用
- 腾讯云邮件 - 通过HTTP API调用
示例(SendGrid):
$email = new \SendGrid\Mail\Mail();
$email->setFrom("sender@example.com", "Sender");
$email->setSubject("Sending with SendGrid");
$email->addTo("recipient@example.com", "Recipient");
$email->addContent("text/html", "<p>邮件内容</p>");
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
$response = $sendgrid->send($email);
总结建议
| 场景 | 推荐方案 |
|---|---|
| 小型项目/个人网站 | PHPMailer(最易上手) |
| 框架项目(Laravel/Symfony) | 框架内置的Mail组件 |
| 企业级/高并发 | 专业邮件服务API(SendGrid等) |
| 只需要简单发送 | 原生mail() + SMTP配置 |
常见问题:
- 邮件被识别为垃圾邮件:配置SPF/DKIM/DMARC DNS记录
- 发件延迟:检查网络和SMTP服务器状态
- 中文乱码:确保
CharSet = 'UTF-8'且使用HTML格式
如果需要具体的邮箱授权码获取步骤或其他特殊配置,请告诉我,我可以进一步说明。