PHP 邮件概览
mail() 函数内置于 PHP 中,用于直接从 web server 发送邮件。它是一种发送通知、联系表单消息、订单确认和其他类型消息的简单方式。
适用于无需使用外部库的基本邮件功能。
mail() 的工作原理
当你调用 mail() 函数时,PHP 会将邮件传递给安装在服务器上的系统邮件传输代理(MTA)(通常是 Sendmail 或 Postfix)。然后,MTA 会处理并将消息投递到指定地址。
语法
mail(to, subject, message, headers, parameters);
参数
| 参数 | 描述 |
|---|---|
| $to | 收件人的 email 地址。你可以指定多个地址,并用逗号分隔。 |
| $subject | 邮件主题。不得包含换行符。 |
| $message | 消息正文。 |
| $headers | 附加头信息,如 From、Reply-To、Cc、Bcc 等。 |
| $parameters | 额外参数,例如为 Sendmail 指定发送者(-f)。 |
简单示例
<?php $to = "user@example.com"; $subject = "Test Email"; $message = "Hello! This is a test email sent using PHP."; $headers = "From: webmaster@yourdomain.com"; mail($to, $subject, $message, $headers); ?>
重要说明
1. 必须包含 From: 头
如果你不指定 From: 头,大多数 mail server 会将该消息视为可疑邮件或 spam 而拒绝。
$headers = "From: noreply@yourdomain.com";
2. 格式化多行消息
在消息中使用 rn 分隔各行:
$message = "Hello,rnrnThank you for your order.rnrnBest regards,rnYour Team";
3. 多个头信息
使用 rn 分隔多个头信息,如 Reply-To、Cc 和 Bcc:
$headers = "From: admin@yourdomain.comrn"; $headers .= "Reply-To: support@yourdomain.comrn"; $headers .= "Cc: someone@yourdomain.comrn";
示例:发送 HTML Email(仅文本)
mail() 函数本身不支持附件。但你可以发送 HTML email,或手动设置 content type:
$headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/html; charset=UTF-8rn"; $headers .= "From: info@yourdomain.com"; $message = "<h1>Hello!</h1><p>Your order has been received.</p>"; mail("user@example.com", "Order Confirmation", $message, $headers);
常见问题与解决方案
| 问题 | 原因 / 解决方案 |
|---|---|
| Email 未送达 | 缺少 From: 头,或 server IP 被列入黑名单 |
| Email 完全无法发送 | 未安装 MTA(例如需要 Sendmail/Postfix) |
| 错误:mail() 已被禁用 | php.ini 中禁用了 mail()(通常由主机策略决定) |
| 俄文文本显示为 ???? | headers 中未将 Charset 设置为 UTF-8 |
| Email 进入 spam | From 不正确、没有 SPF/DKIM,或域名配置错误 |
结论
mail() 函数是一个基础但强大的工具,可直接从 PHP 脚本发送邮件。它具有以下特点:
- 易于使用
- 不需要额外库
- 适用于内部通知、联系表单和自动回复
不过,请注意它的局限性:
- 依赖服务器的 mail 配置
- 不支持附件
- 在某些共享 hosting 环境中可能默认被禁用
如果你计划定期发送邮件,请确保你的 server 已正确配置外发邮件(已安装 Sendmail/Postfix,已设置 SPF/DKIM 记录,并在 php.ini 中启用 mail())。


