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,但收件人永远收不到;测试

时发到 Gmail 显示 “This message was not encrypted”,其实是压根没进队列。

  • 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 是否过期(不会通知),或账号启用了新设备登录导致旧密码失效
  • 是否漏了设置 DKIMSPF DNS 记录?否则大量邮件进垃圾箱,且无法通过 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折线图