php代码示例如何发送邮件_php发送邮件代码示例【示例】
发布时间 - 2026-02-01 00:00:00 点击率:次PHP的mail()函数常失败是因为它仅将邮件交给MTA而不保证投递,且不报错;应改用PHPMailer等库并配置SMTP、App Password及DNS记录。
PHP 用 mail() 发邮件为什么经常失败
绝大多数 PHP 邮件发送失败,不是代码写错了,而是 mail() 函数根本没连上本地或远程 MTA(比如 sendmail、Postfix)。它不报错,但返回 true 假成功——因为只负责把邮件“扔给”系统命令,后续投递完全脱手。
常见现象:mail() 返回 true,但收件人永远收不到;测试

- Linux 下需确认
/usr/sbin/sendmail存在且可执行,且 PHP 的sendmail_path配置正确(phpinfo()查) - Windows 下默认不可用,除非手动配置 Mercury Mail 或类似服务,实际几乎没人这么干
- 多数共享主机禁用
mail(),或强制改写 From 头,导致 SPF 检查失败被拒收
用 PHPMailer 发 Gmail 邮件的最小可行配置
Gmail 要求 OAuth2 或开启「低安全性应用访问权限」(已逐步废弃),现在必须用 App Password(两步验证开启后生成)。
示例中关键点不是“能发”,而是避免踩坑:
- SMTP 主机必须是
smtp.gmail.com,端口选587(TLS)或465(SSL),别混用 -
setFrom()的邮箱必须和登录账号一致,否则 Gmail 直接拒信(即使 SMTP 认证通过) - 密码字段填的是 16 位「App Password」,不是你的 Gmail 登录密码
- 务必调用
$mail->isSMTP(),否则 PHPMailer 默认走mail(),又绕回第一段的问题
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com';
$mail->Password = 'abcd efgh ijkl mnop'; // App Password,带空格
$mail->setFrom('your@gmail.com', 'Your Name');
$mail->addAddress('to@example.com');
$mail->Subject = 'Test';
$mail->Body = 'Hello';
$mail->send();
为什么不要自己拼接 MIME 邮件头
手动用 mail() + 自定义 headers 参数发带附件或 HTML 的邮件,等于主动跳进编码、换行、边界符、Content-Transfer-Encoding 的深坑。
典型错误包括:
- 中文主题没用
mb_encode_mimeheader(),收件箱显示乱码或问号 - HTML 正文没设
Content-Type: text/html; charset=UTF-8,Outlook 当纯文本渲染 - 附件路径含空格或中文,
Content-Disposition里没做 RFC 2231 编码,附件名损坏 - 换行符用
\n而非\r\n,部分 MTAs 直接丢弃整封邮件
这些逻辑 PHPMailer、Symfony Mailer 等库早已封装妥当,重复造轮子只会让调试时间远超开发时间。
生产环境必须检查的三件事
上线前不核对这三项,发信功能大概率在某次更新后突然失效:
- 服务器出站 587/465 端口是否被云厂商(如阿里云、AWS)默认屏蔽?需工单申请解封
- Gmail 的 App Password 是否过期(不会通知),或账号启用了新设备登录导致旧密码失效
- 是否漏了设置
DKIM和SPFDNS 记录?否则大量邮件进垃圾箱,且无法通过 Gmail 的Authentication-Results头排查
真正麻烦的从来不是“怎么发”,而是“为什么收不到”——而后者 90% 以上跟 PHP 代码无关。
# php
# linux
# word
# html
# windows
# 编码
# app
# 端口
# ssl
# 阿里云
# ai
# outlook
# win
# symfony
# 封装
# mail
# this
# 发带
# 报错
# 深坑
# 收件箱
# 收不到
# 的是
# 解封
# 没人
# 而不
# 错了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
中国移动官方网站首页入口 中国移动官网网页登录
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
如何在建站主机中优化服务器配置?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
SQL查询语句优化的实用方法总结
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何使用Sanctum进行API认证?(SPA实战)
Python文件异常处理策略_健壮性说明【指导】
JavaScript中的标签模板是什么_它如何扩展字符串功能
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何快速搭建支持数据库操作的智能建站平台?
个人网站制作流程图片大全,个人网站如何注销?
如何挑选高效建站主机与优质域名?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何快速生成专业多端适配建站电话?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
如何在云主机上快速搭建网站?
如何自定义建站之星网站的导航菜单样式?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
phpredis提高消息队列的实时性方法(推荐)
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何获取上海专业网站定制建站电话?
jquery插件bootstrapValidator表单验证详解
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何安全更换建站之星模板并保留数据?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
node.js报错:Cannot find module 'ejs'的解决办法
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
浅述节点的创建及常见功能的实现
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
详解Android中Activity的四大启动模式实验简述
详解Android图表 MPAndroidChart折线图

