PHP:554不允许消息 - 标题不符合RFC [291]

时间:2017-11-14 07:49:38

标签: php email smtp

这可以重复发布,但请在标记之前阅读。

我使用了一个邮件功能,并且工作了一段时间,直到我没有收到来自Yahoo.com和SkyNet.be的错误消息。

现在我知道这个错误与电子邮件中的Message-IDDate标题相关,但我的意思是Message-ID是主要问题,需要解决该问题。

以下是我生成Message-ID的代码:

// Generate secure unique message ID
$msgID = sprintf(
    "<%s.%s@%s>",
    base_convert(microtime(), 10, 36),
    base_convert(bin2hex(
        function_exists('random_bytes') ? random_bytes(8) : (
                function_exists('openssl_random_pseudo_bytes') ? openssl_random_pseudo_bytes(8) : decbin(rand(100,819))
        )
    ), 16, 36),
    $_SERVER['SERVER_NAME']
);

如上所述,我首先检查是否存在使用random_bytes()函数生成随机字节的PHP7.x解决方案。如果是PHP5.x版本,我使用标准openssl_random_pseudo_bytes()函数,如果该函数未启用或PHP版本为4.x或更低,我使用简单decbin()rand()

这也是我的标题设置:

// Preferences for Subject field
if(function_exists('iconv_mime_encode')){
    $subject_preferences = array(
        "input-charset"     => 'utf-8',
        "output-charset"    => 'utf-8',
        "line-length"       => 76,
        "line-break-chars"  => PHP_EOL
    );

    $mime_subject = iconv_mime_encode("Subject", $subject, $subject_preferences);
}
else
    $mime_subject = mb_encode_mimeheader("Subject: {$subject}", strtoupper('utf-8'), 'B', "\r\n", strlen('Subject: '));

// Headers
$headers = array(
   "Content-type: text/html; charset=utf-8",
    $mime_subject,
    "From: {$from_name} <{$from_email}>",
    "Reply-To: {$from_email}",
    "X-Mailer: PHP/" . phpversion(),
    "X-Sender: {$from_name} <{$from_email}>",
    "X-Priority: 1 (Higuest)",
    "X-MSMail-Priority: High",
    "Importance: High",
    "Content-Transfer-Encoding: 8bit ",
    "Date: " . date("r (T)") . " ",
    "Message-ID: {$msgID}",
    "In-Reply-To: {$msgID}",
    "References: {$msgID}",
    "Return-Path: {$from_email}",
    "MIME-Version: 1.0 "
);
$header = join(PHP_EOL, $headers);

现在的主要问题是: - 为什么我收到错误:

SMTP error from remote mail server after end of data: 554 Message not allowed - Headers are not RFC compliant[291]

???

2 个答案:

答案 0 :(得分:3)

要解决此问题,您必须删除headers数组中的“主题”。

Php邮件功能具有用于传递“主题”的参数

function mail ($to, $subject, $message, $additional_headers = null, $additional_parameters = null)

因此,如果您在其他标题中添加“主题”,则邮件的主题将被发送2次,这就是问题所在。

有关更多详细信息,请在这里查看:https://www.yetanotherblog.com/2016/02/29/554-message-not-allowed-headers-are-not-rfc-compliant291/

答案 1 :(得分:0)

您可能需要添加邮件标题

Date: 2011-11-11
From: <email>
To: <email>
Subject: Subject here

某些服务器检查标头是否包含此字符串:)

这是RFC(最新) https://tools.ietf.org/html/rfc5322