PHP Mail 函数 完整指南

本文涵盖PHP 5、PHP 7及PHP 8版本的Mail函数使用,包含实际代码示例和最佳实践。

PHP Mail 函数简介

mail() 函数是PHP内置的邮件发送函数,允许直接从脚本发送电子邮件。它是PHP核心的一部分,无需额外安装扩展即可使用。

注意: mail()函数依赖于服务器配置的邮件系统,在共享主机环境下可能需要额外配置。

mail() 函数语法

bool mail(
    string $to,
    string $subject,
    string $message,
    string $additional_headers = "",
    string $additional_parameters = ""
)

参数说明:

  • $to - 收件人邮箱地址,多个用逗号分隔
  • $subject - 邮件主题
  • $message - 邮件正文
  • $additional_headers - 附加头信息(From, Cc, Bcc, Content-Type等)
  • $additional_parameters - 额外参数(传递给sendmail程序)

基础使用示例

示例1:简单邮件发送

<?php
// 基本邮件发送
$to = "recipient@example.com";
$subject = "测试邮件";
$message = "这是一封测试邮件!";
$headers = "From: sender@example.com\r\n";

if(mail($to, $subject, $message, $headers)) {
    echo "邮件发送成功!";
} else {
    echo "邮件发送失败!";
}
?>

示例2:发送HTML格式邮件

<?php
$to = "recipient@example.com";
$subject = "HTML格式邮件测试";
$message = '
    <html>
    <head>
        <title>HTML邮件</title>
    </head>
    <body>
        <h1 style="color: #3498db;">欢迎!</h1>
        <p>这是一封<strong>HTML格式</strong>的测试邮件。</p>
    </body>
    </html>
';

// 设置Content-type为HTML
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";
$headers .= "From: sender@example.com\r\n";
$headers .= "Reply-To: reply@example.com\r\n";

mail($to, $subject, $message, $headers);
?>

示例3:带附件的邮件(PHP 7+)

<?php
function sendMailWithAttachment($to, $subject, $message, $filePath) {
    $boundary = md5(time());
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: sender@example.com\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";

    // 邮件正文
    $body = "--$boundary\r\n";
    $body .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
    $body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $body .= $message . "\r\n";

    // 附件部分
    $fileContent = file_get_contents($filePath);
    $fileContent = chunk_split(base64_encode($fileContent));
    $fileName = basename($filePath);

    $body .= "--$boundary\r\n";
    $body .= "Content-Type: application/octet-stream; name=\"$fileName\"\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n";
    $body .= "Content-Disposition: attachment; filename=\"$fileName\"\r\n\r\n";
    $body .= $fileContent . "\r\n";
    $body .= "--$boundary--";

    return mail($to, $subject, $body, $headers);
}
?>

服务器配置要求

要使mail()函数正常工作,需要满足以下条件:

  1. PHP需要已安装且正在运行的邮件系统(如sendmail、qmail、Postfix等)
  2. Web服务器具有发送邮件的权限
  3. 正确的php.ini配置

php.ini 配置详解

配置项 默认值 描述 PHP版本
SMTP "localhost" Windows系统:SMTP服务器地址 所有版本
smtp_port 25 SMTP端口号(Windows) PHP 4.3+
sendmail_from NULL 默认发件人地址(Windows) 所有版本
sendmail_path /usr/sbin/sendmail Unix系统:sendmail路径 所有版本
mail.add_x_header 0 是否添加X-PHP-Originating-Script头(PHP 7.2+) PHP 7.2+
mail.log NULL 邮件日志文件路径(PHP 7.2+) PHP 7.2+

推荐配置示例:

; php.ini 邮件配置
[mail function]
; Windows 配置
SMTP = smtp.gmail.com
smtp_port = 587
sendmail_from = your-email@gmail.com

; Unix/Linux 配置
sendmail_path = "/usr/sbin/sendmail -t -i"

; PHP 7+ 新增配置
mail.add_x_header = On
mail.log = /var/log/phpmail.log

PHP 7/8 兼容性说明

PHP 7.2+ 新增功能:
  • 新增 mail.add_x_header 配置选项
  • 新增 mail.log 配置选项,便于调试
  • 改进的错误处理和日志记录
PHP 8.x 注意事项:
  • mail() 函数参数类型更加严格
  • 移除了一些旧的邮件相关的全局配置选项
  • 建议使用PHPMailer或SwiftMailer等现代库替代原生mail()

常见问题与解决方案

可能原因及解决方法:

  1. 检查SMTP服务器配置
  2. 检查PHP错误日志:error_log = /var/log/php_errors.log
  3. 使用error_get_last()获取详细错误信息
  4. 确保服务器防火墙允许邮件端口(25, 465, 587)

解决方案:

  • 添加正确的邮件头信息(From, Reply-To, Return-Path)
  • 设置合适的Content-Type
  • 添加DKIM和SPF记录到DNS
  • 避免使用垃圾邮件关键词
  • 使用专业的邮件服务(如SendGrid、Amazon SES)

最佳实践建议

推荐做法
  • 使用专业的邮件库(PHPMailer、SwiftMailer)
  • 始终设置正确的字符编码(UTF-8)
  • 添加邮件发送日志记录
  • 使用队列系统异步发送邮件
  • 定期检查邮件发送成功率
避免做法
  • 避免在循环中频繁调用mail()函数
  • 不要硬编码SMTP凭据
  • 避免使用过时的邮件协议
  • 不要忽略邮件发送失败的错误处理
  • 避免发送大规模邮件使用同步方式

替代方案:使用邮件库

对于生产环境,建议使用成熟的邮件库:

库名称 特点 GitHub Stars PHP版本要求
PHPMailer 功能全面,支持SMTP、HTML邮件、附件 19k+ PHP 5.5+
SwiftMailer Symfony框架推荐,面向对象设计 9k+ PHP 7.0+
Symfony Mailer Symfony 4.3+ 内置,现代API - PHP 7.2.5+
PHPMailer使用示例:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'your-email@gmail.com';
    $mail->Password = 'your-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;

    $mail->setFrom('from@example.com', '发件人');
    $mail->addAddress('to@example.com', '收件人');

    $mail->isHTML(true);
    $mail->Subject = 'PHPMailer测试';
    $mail->Body = '<b>HTML内容</b>';

    $mail->send();
    echo '邮件已发送';
} catch (Exception $e) {
    echo "发送失败: {$mail->ErrorInfo}";
}
?>

PHP Mail 函数参考

函数 描述 PHP版本
mail() 发送电子邮件 PHP 4+
ezmlm_hash() 计算EZMLM邮件列表系统所需的散列值(已弃用) PHP 3-7.4
学习建议

掌握PHP邮件发送是现代Web开发的重要技能。建议从原生mail()函数开始学习,理解基本原理后转向专业的邮件库。在实际项目中,务必考虑邮件发送的可靠性、安全性和性能。

版本历史
  • PHP 7.2: 新增邮件日志功能
  • PHP 7.3: 改进邮件头处理
  • PHP 8.0: 参数类型更严格,移除废弃功能