PHP mail()函数依赖本地sendmail易失败,推荐用PHPMailer通过SMTP直连邮箱服务商;需Composer安装、配置授权码与587/465端口,并注意云服务器端口屏蔽及环境变量存储敏感信息。
PHP 自带的 mail() 函数依赖本地 sendmail 服务,线上环境常因配置缺失或被屏蔽而失败。更可靠的方式是使用 SMTP 协议直连邮件服务商(如 Gmail、QQ 邮箱、163 邮箱或企业邮箱),配合 PHPMailer 等成熟库实现稳定发信。
推荐用 Composer 安装最新版 PHPMailer:
composer require phpmailer/phpmailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
QQ 邮箱需开启 SMTP 并获取授权码(非登录密码),端口通常为 587(TLS)或 465(SSL):
以下是一个简洁、带错误提示的发送示例:
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.qq.com';
$mail->SMTPAuth = true;
$mail->Username = 'your@qq.com';
$mail->Password = 'your_app_password'; // 授权码,非邮箱密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('your@qq.com', '技术支持');
$mail->addAddress('to@example.com', '收件人姓名');
$mail->isHTML(true);
$mail->Subject = '测试邮件';
$mail->Body = '这是一封 HTML 邮件
支持样式和链接
';
$mail->send();
echo '邮件已发送';
} catch (Exception $e) {
echo "发送失败: {$mail->ErrorInfo}";
}
避免踩坑,注意这些细节:
addAddress() 显式添加,不能只写在 Body 里telnet smtp.qq.com 587
基本上就这些。不复杂但容易忽略授权码和端口限制,配对正确后发送成功率很高。