如何使用PHP的_mail函数发送邮件并配置SMTP服务器教程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计893个文字,预计阅读时间需要4分钟。
直接用+mail()+函数发送邮件,90%的情况会失败或进入垃圾箱;真的要成功,必须走+SMTP+,并使用+PHPMailer+。
为什么 mail() 函数基本不能用
它不校验发件人身份、不加密、不支持认证,现代邮箱服务商(Gmail、QQ、163)默认拒收这类裸发邮件。即使服务器装了 sendmail,mail() 也只负责把信丢给本地 MTA,后续投递成功率完全不可控。
- 错误现象:
mail()返回true,但收件人根本收不到;或收到后显示“未验证发件人”“来自未知服务器” - Linux 下需额外配置
sendmail_path,Windows 下几乎无法可靠运行 - 无法获取真实错误原因——
mail()只返回布尔值,连“被 SMTP 拒绝”都报不出来 - 主题或正文含中文时极易乱码,
headers中的Content-Type和charset极难写对
PHPMailer 是唯一靠谱的落地选择
它把 SMTP 认证、加密、编码、附件、HTML/纯文本双格式这些细节全封装好了,而且主流邮箱(QQ、163、Gmail、阿里云邮件推送)的配置参数都是公开、稳定、可验证的。
- 安装只要一条命令:
composer require phpmailer/phpmailer - 必须用
try-catch包裹发送逻辑,否则异常会中断脚本——$mail->ErrorInfo才是你调试的唯一依据 - 密码字段填的是“授权码”,不是邮箱登录密码(QQ/163/Gmail 都要先在邮箱设置里开启 SMTP 并生成)
-
SMTPSecure和Port必须配对:PHPMailer::ENCRYPTION_SMTPS+465,或PHPMailer::ENCRYPTION_STARTTLS+587;混搭必失败
QQ 邮箱和 163 邮箱的典型配置差异
看似一样,但参数错一个就发不出去。重点不是“怎么写”,而是“为什么必须这么写”。
立即学习“PHP免费学习笔记(深入)”;
- QQ 邮箱:
Host = 'smtp.qq.com',Port = 465,SMTPSecure = PHPMailer::ENCRYPTION_SMTPS(注意是SMTPS,不是SSL) - 163 邮箱:
Host = 'smtp.163.com',Port = 465或994,SMTPSecure = 'ssl'(旧版文档写PHPMailer::ENCRYPTION_SMTPS会失败) - 两者都必须设
$mail->CharSet = 'UTF-8',否则中文主题/发件人名显示为问号 - 发件人地址(
setFrom())必须和Username完全一致,否则 QQ 邮箱直接拒绝认证
最容易被忽略的三个硬性前提
不是代码问题,是环境卡点。90% 的“配置完了还是发不出”都栽在这儿。
- 邮箱账号必须已手动开启 SMTP 服务(QQ/163/Gmail 都在“设置→账户→POP3/IMAP/SMTP”里,不是默认打开的)
- PHP 进程必须有网络外连权限——某些共享主机或 Docker 容器默认禁用
fsockopen或屏蔽 465/587 端口 - 域名发信需配置 SPF 记录(如
v=spf1 include:qq.com ~all),否则企业邮箱或 Outlook 会直接拒收;个人测试用 QQ/163 自身域名可跳过这步
本文共计893个文字,预计阅读时间需要4分钟。
直接用+mail()+函数发送邮件,90%的情况会失败或进入垃圾箱;真的要成功,必须走+SMTP+,并使用+PHPMailer+。
为什么 mail() 函数基本不能用
它不校验发件人身份、不加密、不支持认证,现代邮箱服务商(Gmail、QQ、163)默认拒收这类裸发邮件。即使服务器装了 sendmail,mail() 也只负责把信丢给本地 MTA,后续投递成功率完全不可控。
- 错误现象:
mail()返回true,但收件人根本收不到;或收到后显示“未验证发件人”“来自未知服务器” - Linux 下需额外配置
sendmail_path,Windows 下几乎无法可靠运行 - 无法获取真实错误原因——
mail()只返回布尔值,连“被 SMTP 拒绝”都报不出来 - 主题或正文含中文时极易乱码,
headers中的Content-Type和charset极难写对
PHPMailer 是唯一靠谱的落地选择
它把 SMTP 认证、加密、编码、附件、HTML/纯文本双格式这些细节全封装好了,而且主流邮箱(QQ、163、Gmail、阿里云邮件推送)的配置参数都是公开、稳定、可验证的。
- 安装只要一条命令:
composer require phpmailer/phpmailer - 必须用
try-catch包裹发送逻辑,否则异常会中断脚本——$mail->ErrorInfo才是你调试的唯一依据 - 密码字段填的是“授权码”,不是邮箱登录密码(QQ/163/Gmail 都要先在邮箱设置里开启 SMTP 并生成)
-
SMTPSecure和Port必须配对:PHPMailer::ENCRYPTION_SMTPS+465,或PHPMailer::ENCRYPTION_STARTTLS+587;混搭必失败
QQ 邮箱和 163 邮箱的典型配置差异
看似一样,但参数错一个就发不出去。重点不是“怎么写”,而是“为什么必须这么写”。
立即学习“PHP免费学习笔记(深入)”;
- QQ 邮箱:
Host = 'smtp.qq.com',Port = 465,SMTPSecure = PHPMailer::ENCRYPTION_SMTPS(注意是SMTPS,不是SSL) - 163 邮箱:
Host = 'smtp.163.com',Port = 465或994,SMTPSecure = 'ssl'(旧版文档写PHPMailer::ENCRYPTION_SMTPS会失败) - 两者都必须设
$mail->CharSet = 'UTF-8',否则中文主题/发件人名显示为问号 - 发件人地址(
setFrom())必须和Username完全一致,否则 QQ 邮箱直接拒绝认证
最容易被忽略的三个硬性前提
不是代码问题,是环境卡点。90% 的“配置完了还是发不出”都栽在这儿。
- 邮箱账号必须已手动开启 SMTP 服务(QQ/163/Gmail 都在“设置→账户→POP3/IMAP/SMTP”里,不是默认打开的)
- PHP 进程必须有网络外连权限——某些共享主机或 Docker 容器默认禁用
fsockopen或屏蔽 465/587 端口 - 域名发信需配置 SPF 记录(如
v=spf1 include:qq.com ~all),否则企业邮箱或 Outlook 会直接拒收;个人测试用 QQ/163 自身域名可跳过这步

