本文目录导读:

在PHP项目中实现邮件发送功能主要有以下几种方式,我为你详细介绍最常用的两种方案:
使用 PHP 内置 mail() 函数(最简单)
基本用法
<?php
$to = "recipient@example.com";
$subject = "测试邮件";
$message = "这是一封测试邮件";
$headers = "From: sender@example.com\r\n";
$headers .= "Reply-To: reply@example.com\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
if(mail($to, $subject, $message, $headers)) {
echo "邮件发送成功";
} else {
echo "邮件发送失败";
}
?>
配置要求
- 需要配置
php.ini中的 SMTP 设置 - 需要本地邮件服务器(如 sendmail、Postfix)
使用 PHPMailer 库(推荐)
PHPMailer 是目前最流行的 PHP 邮件发送库,支持 SMTP 认证、HTML 邮件、附件等功能。
安装方式
composer require phpmailer/phpmailer
使用示例(使用 SMTP)
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// 服务器设置
$mail->SMTPDebug = SMTP::DEBUG_OFF; // 调试模式(生产环境关闭)
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // SMTP 服务器
$mail->SMTPAuth = true;
$mail->Username = 'your-email@gmail.com'; // 邮箱账号
$mail->Password = 'your-app-password'; // 邮箱密码或应用密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465; // SSL 使用 465,TLS 使用 587
// 发件人
$mail->setFrom('from@example.com', '发件人名称');
// 收件人
$mail->addAddress('recipient@example.com', '收件人名称');
// 抄送(可选)
$mail->addCC('cc@example.com');
// 密送(可选)
$mail->addBCC('bcc@example.com');
// 附件(可选)
$mail->addAttachment('/path/to/file.pdf', '文件名称.pdf');
// 邮件内容
$mail->isHTML(true);
$mail->Subject = '这里是邮件主题';
$mail->Body = '<h1>HTML 邮件内容</h1><p>这是一封测试邮件</p>';
$mail->AltBody = '纯文本内容,用于不支持 HTML 的邮件客户端';
$mail->send();
echo '邮件发送成功';
} catch (Exception $e) {
echo "邮件发送失败: {$mail->ErrorInfo}";
}
?>
使用 SwiftMailer(另一个流行库)
composer require swiftmailer/swiftmailer
<?php
require 'vendor/autoload.php';
// 创建 Transport
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))
->setUsername('your-email@gmail.com')
->setPassword('your-password');
// 创建 Mailer
$mailer = new Swift_Mailer($transport);
// 创建消息
$message = (new Swift_Message('邮件主题'))
->setFrom(['from@example.com' => '发件人名称'])
->setTo(['recipient@example.com' => '收件人名称'])
->setBody('这是一封测试邮件')
->addPart('<h1>HTML内容</h1>', 'text/html');
// 发送
$result = $mailer->send($message);
?>
常见 SMTP 服务器配置
Gmail
- Host: smtp.gmail.com
- Port: 465 (SSL) 或 587 (TLS)
- 需要开启"允许不够安全的应用"或使用应用专用密码
QQ邮箱
- Host: smtp.qq.com
- Port: 465 (SSL) 或 587 (TLS)
- 需要开启 SMTP 服务并获取授权码
163邮箱
- Host: smtp.163.com
- Port: 465 (SSL) 或 25
- 需要开启 SMTP 服务
阿里云企业邮箱
- Host: smtp.mxhichina.com
- Port: 465 (SSL) 或 80
- 使用完整的邮箱地址作为用户名
最佳实践建议
-
使用 PHPMailer:功能最全,文档丰富,社区活跃
-
环境变量配置:不要将邮箱密码硬编码在代码中
$mail->Username = getenv('SMTP_USERNAME'); $mail->Password = getenv('SMTP_PASSWORD'); -
异常处理:始终添加 try-catch 块处理发送失败的情况
-
队列处理:大量邮件时使用消息队列(如 Redis、RabbitMQ)异步发送
-
限制发送频率:避免短时间内大量发送导致被封
常见问题解决
- 邮件被标记为垃圾邮件:确保 SPF、DKIM 记录配置正确
- 发送超时:调整 PHP 脚本执行时间
set_time_limit(0); - 编码问题:统一使用 UTF-8 编码
- 无法连接 SMTP 服务器:检查防火墙和网络设置
推荐从 PHPMailer 入手,它最成熟稳定且文档完善,如果项目已经依赖了其他框架(如 Laravel、Symfony),记得先检查它们自带的邮件组件。