在PHP开发中,发送邮件是一个常见的需求。用户注册验证、密码找回、订单通知、活动推广……很多场景都需要发送邮件。
PHP发送邮件,主要有以下几种方式:
- mail()函数:PHP内置的mail()函数,最简单,但需要配置服务器的sendmail,功能有限,容易被当成垃圾邮件。
- SMTP发送:通过SMTP协议连接邮件服务器发送邮件,是最常用、最可靠的方式。需要用PHPMailer、Swift Mailer等库,或者自己写SMTP客户端。
- 第三方邮件服务API:通过SendGrid、Mailgun、阿里云邮件推送、腾讯云邮件推送等第三方服务的API发送邮件,发送量大、送达率高,但需要付费(有免费额度)。
对于个人博客和小型网站,最常用的是SMTP发送,用PHPMailer库,连接QQ邮箱、163邮箱、企业邮箱等的SMTP服务器发送邮件。今天分享PHP发送邮件的方法,重点介绍PHPMailer的使用。
mail()函数
PHP内置的mail()函数,是最简单的发送邮件方式。
$to = 'recipient@example.com';
$subject = '邮件标题';
$message = '邮件内容';
$headers = 'From: sender@example.com' . "\r\n" .
'Reply-To: sender@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);mail()函数的优点是简单,不需要额外的库。但缺点也很明显:
- 需要配置服务器的sendmail或postfix,Windows下需要配置SMTP
- 功能有限,不支持SMTP认证、附件、HTML邮件等
- 容易被当成垃圾邮件,送达率低
- 不支持加密(SSL/TLS)
所以,实际开发中,一般不推荐用mail()函数,而是用PHPMailer等库通过SMTP发送。
PHPMailer介绍
PHPMailer是PHP最流行的邮件发送库,功能强大,使用简单。
PHPMailer的特点:
- 支持SMTP发送,支持SMTP认证
- 支持SSL/TLS加密
- 支持HTML邮件和纯文本邮件
- 支持附件
- 支持抄送、密送
- 支持自定义邮件头
- 错误信息详细,方便调试
- 兼容PHP 5.0+
PHPMailer可以从GitHub下载(https://github.com/PHPMailer/PHPMailer),也可以用Composer安装。下载后,只需要引入class.phpmailer.php和class.smtp.php两个文件即可使用。
PHPMailer基本使用
1. 引入文件
require 'PHPMailer/class.phpmailer.php';
require 'PHPMailer/class.smtp.php';2. 实例化和基本配置
$mail = new PHPMailer();
// 设置使用SMTP
$mail->isSMTP();
// SMTP服务器地址
$mail->Host = 'smtp.qq.com';
// SMTP端口:25(普通)、465(SSL)、587(TLS)
$mail->Port = 465;
// 启用SMTP认证
$mail->SMTPAuth = true;
// SMTP用户名(邮箱地址)
$mail->Username = 'your_email@qq.com';
// SMTP密码(授权码,不是登录密码)
$mail->Password = 'your_auth_code';
// 启用SSL加密
$mail->SMTPSecure = 'ssl';
// 发件人
$mail->From = 'your_email@qq.com';
$mail->FromName = '发件人名称';
// 收件人
$mail->addAddress('recipient@example.com', '收件人名称');
// 邮件标题
$mail->Subject = '邮件标题';
// 邮件内容(HTML)
$mail->Body = '<h1>邮件标题</h1><p>这是一封HTML格式的邮件。</p>';
// 邮件内容(纯文本,当邮件客户端不支持HTML时显示)
$mail->AltBody = '这是纯文本格式的邮件内容。';
// 发送邮件
if ($mail->send()) {
echo '邮件发送成功';
} else {
echo '邮件发送失败:' . $mail->ErrorInfo;
}3. 常用邮箱SMTP配置
QQ邮箱:
$mail->Host = 'smtp.qq.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_qq@qq.com';
$mail->Password = '授权码'; // QQ邮箱需要开启SMTP服务,获取授权码163邮箱:
$mail->Host = 'smtp.163.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@163.com';
$mail->Password = '授权码'; // 163邮箱需要开启SMTP服务,设置客户端授权密码126邮箱:
$mail->Host = 'smtp.126.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@126.com';
$mail->Password = '授权码';Gmail(国内可能需要代理):
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@gmail.com';
$mail->Password = '应用专用密码';企业邮箱(以腾讯企业邮箱为例):
$mail->Host = 'smtp.exmail.qq.com';
$mail->Port = 465;
$mail->SMTPSecure = 'ssl';
$mail->Username = 'your_email@yourdomain.com';
$mail->Password = '邮箱密码';PHPMailer进阶使用
1. 发送HTML邮件
$mail->isHTML(true); // 设置邮件格式为HTML
$mail->Body = '
<html>
<head>
<meta charset="UTF-8">
<title>邮件标题</title>
</head>
<body>
<h1>欢迎注册</h1>
<p>您好,感谢您注册我们的网站!</p>
<p>请点击以下链接激活您的账号:</p>
<a href="https://example.com/activate?token=xxx">激活账号</a>
</body>
</html>
';注意:HTML邮件中,CSS要用内联样式,不要用外部CSS,因为很多邮件客户端不支持外部CSS。图片要用绝对URL,不要用相对路径。
2. 添加附件
// 添加附件
$mail->addAttachment('path/to/file.pdf', '文件名.pdf');
// 添加多个附件
$mail->addAttachment('path/to/file1.pdf', '文件1.pdf');
$mail->addAttachment('path/to/file2.jpg', '文件2.jpg');3. 抄送和密送
// 抄送
$mail->addCC('cc@example.com', '抄送人');
// 密送
$mail->addBCC('bcc@example.com', '密送人');4. 回复地址
$mail->addReplyTo('reply@example.com', '回复地址');5. 添加内嵌图片
// 添加内嵌图片,CID为logo
$mail->addEmbeddedImage('path/to/logo.png', 'logo', 'logo.png');
// 在HTML中引用
$mail->Body = '<img src="cid:logo" alt="Logo">';6. 字符编码设置
$mail->CharSet = 'UTF-8'; // 设置字符编码为UTF-8,防止中文乱码
$mail->Encoding = 'base64'; // 设置编码方式封装邮件发送函数
为了方便使用,可以把邮件发送封装成一个函数或类。
function sendEmail($to, $toName, $subject, $body, $altBody = '') {
require 'PHPMailer/class.phpmailer.php';
require 'PHPMailer/class.smtp.php';
$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.qq.com';
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = 'your_email@qq.com';
$mail->Password = 'your_auth_code';
$mail->SMTPSecure = 'ssl';
$mail->CharSet = 'UTF-8';
$mail->From = 'your_email@qq.com';
$mail->FromName = '博客管理员';
$mail->addAddress($to, $toName);
$mail->Subject = $subject;
$mail->isHTML(true);
$mail->Body = $body;
if ($altBody) {
$mail->AltBody = $altBody;
}
if ($mail->send()) {
return true;
} else {
return $mail->ErrorInfo;
}
}
// 使用
$result = sendEmail(
'user@example.com',
'用户',
'欢迎注册',
'<h1>欢迎注册</h1><p>感谢您注册我们的博客!</p>'
);
if ($result === true) {
echo '发送成功';
} else {
echo '发送失败:' . $result;
}常见问题和解决方法
1. 邮件发送失败,提示SMTP连接失败
可能原因:
- SMTP服务器地址或端口错误
- 服务器防火墙阻止了出站连接
- 没有启用SSL/TLS
解决方法:
- 检查SMTP服务器地址和端口
- 联系服务器提供商,确认是否允许SMTP出站连接
- 尝试不同的端口(25、465、587)和加密方式(ssl、tls)
2. 邮件发送成功,但收件人收不到
可能原因:
- 邮件被当成垃圾邮件
- 收件人邮箱地址错误
- 发件人邮箱被拉黑
解决方法:
- 检查收件人邮箱地址是否正确
- 让收件人检查垃圾邮件箱
- 邮件内容不要包含太多营销词汇,避免被当成垃圾邮件
- 设置正确的SPF、DKIM记录,提高邮件送达率
3. 中文乱码
解决方法:
- 设置
$mail->CharSet = 'UTF-8' - 确保PHP文件编码为UTF-8
- 邮件标题和内容不要用GBK编码
4. QQ邮箱SMTP认证失败
解决方法:
- QQ邮箱需要开启SMTP服务(设置→账户→POP3/IMAP/SMTP服务)
- 密码要用授权码,不是QQ密码
- 授权码在QQ邮箱设置中获取
5. 163邮箱SMTP认证失败
解决方法:
- 163邮箱需要开启SMTP服务
- 密码要用客户端授权密码,不是登录密码
- 客户端授权密码在163邮箱设置中设置
邮件发送的最佳实践
- 用SMTP发送,不要用mail()函数:SMTP发送更可靠,送达率更高。
- 用授权码,不要用登录密码:QQ邮箱、163邮箱等都需要用授权码,更安全。
- 设置正确的字符编码:用UTF-8,防止中文乱码。
- HTML邮件用内联样式:邮件客户端对CSS支持有限,用内联样式兼容性最好。
- 图片用绝对URL:HTML邮件中的图片要用绝对URL,不要用相对路径。
- 添加纯文本备选:设置AltBody,当邮件客户端不支持HTML时显示纯文本。
- 不要发送垃圾邮件:邮件内容要合法,不要发送垃圾邮件,否则会被拉黑。
- 错误处理:发送失败时,记录错误信息,方便排查问题。
- 异步发送:如果发送量大,用队列异步发送,不要阻塞页面。
- 测试:发送前先测试,确保邮件能正常发送和显示。
总结
PHP发送邮件,最常用的是用PHPMailer通过SMTP发送。
核心要点:
- 发送方式:mail()函数(简单但不推荐)、SMTP发送(推荐,用PHPMailer)、第三方邮件服务API(适合发送量大)
- PHPMailer基本配置:SMTP服务器、端口、认证、用户名、密码、加密方式、发件人、收件人、标题、内容
- 常用邮箱SMTP配置:QQ邮箱(smtp.qq.com:465 ssl)、163邮箱(smtp.163.com:465 ssl)、Gmail、企业邮箱
- 进阶使用:HTML邮件、附件、抄送密送、内嵌图片、字符编码
- 封装函数:把邮件发送封装成函数,方便使用
- 常见问题:SMTP连接失败、收不到邮件、中文乱码、认证失败
- 最佳实践:用SMTP、用授权码、UTF-8编码、内联样式、绝对URL、错误处理、异步发送
希望这篇文章能帮你掌握PHP发送邮件的方法,让你的网站能正常发送邮件。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录