PHP 警告:mail():找到数字标题

use*_*820 -1 php email

我正在使用以下脚本通过 PHP 发送电子邮件。但是,我收到错误"PHP Warning: mail(): Found numeric header (4) in /home/....public_html/.../sendemail.php on line 16"任何帮助。

PHP脚本

<?php
$name       = @trim(stripslashes($_POST['name'])); 
$from       = @trim(stripslashes($_POST['email'])); 
$subject    = @trim(stripslashes($_POST['subject'])); 
$message    = @trim(stripslashes($_POST['message'])); 
$to         = 'xxxxx@xmail.com';

$headers   = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=UTF-8";
$headers[] = "From: {$name} <{$from}>";
$headers[] = "Reply-To: <{$from}>";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();

mail($to, $subject, $message, $headers);
die;
Run Code Online (Sandbox Code Playgroud)

Cod*_*yKL 7

如果要将标题作为数组传递,则需要将标题名称指定为数组键!(PHP 文档:“如果传递数组,则其键是标头名称,其值是相应的标头值。”)。

现在有2个解决方案。

解决方案 1(标题为字符串):

$headers = "MIME-Version: 1.0";
$headers .= "Content-type: text/plain; charset=UTF-8";
$headers .= "From: {$name} <{$from}>";
$headers .= "Reply-To: <{$from}>";
$headers .= "Subject: {$subject}";
$headers .= "X-Mailer: PHP/".phpversion();
Run Code Online (Sandbox Code Playgroud)

解决方案 2(标题为数组):

$headers   = [
    'MIME-Version' => 'MIME-Version: 1.0',
    'Content-type' => 'text/plain; charset=UTF-8',
    'From' => "{$name} <{$from}>",
    'Reply-To' => $from,
    'Subject' => $subject,
    'X-Mailer' => 'PHP/' . phpversion(),
];
Run Code Online (Sandbox Code Playgroud)

要检查是否mail()有效,您可以检查最后一个错误。

例子:

$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句。为避免由于不符合 RFC 而导致接收电子邮件服务器出现任何问题,您应该使用像 SwiftMailer 或 PHPMailer 这样的邮件程序类。