PHP 邮件函数随机为邮件文本添加空格

2022-08-30 22:43:05

我有一个非常简单的PHP脚本,比如:

while ($condition){
    echo "<a href="thanks.php?id=".$id."> THANKS </a>";
}

当然,我有更多的代码,但这并不重要。创建这段代码后,脚本会向用户发送电子邮件。

收件箱

链接在每一行中都是可以的,除了最后一行以这种方式显示链接:

    tha nks.php?id.....

它在代码之间添加一个空格。

这只发生在hotmail上。Gmail,雅虎和其他一切都运行良好。


答案 1

我知道这已经很晚了,但有一个替代解决方案对我有用:

使用以下行通过 base64 对整个消息进行编码:

$message = chunk_split(base64_encode($message));

然后,将此附加到您的标头中:

$headers .= "Content-Transfer-Encoding: base64\r\n\r\n";

这将告诉邮件客户端您的邮件是 base64 编码的。


答案 2

Karancan的解决方案应该有效,但根本原因是Hobo所说的。SMTP 协议要求行数限制为 1000 个字符(或实际为 998 个字符加上一个 CR-LF)。如果行的长度超过 1000 个字符,则每 998 个字符插入一个 CR-LF。

因此,如果您正在用一堆$message,那么一旦该行的长度大于900个字符,您就会遇到此错误。这令人困惑,因为空格似乎是间歇性的,特别是如果你正在构建HTML消息,因为有时换行符会出现在完全良性的位置。$message .= "more text";

简单的解决方案是在行尾添加 。\r\n\

有趣的是,这些形式有效:

$message .= "<tr><td>1</td><td>2</td>\r\n";
$message .= '<tr><td>1</td><td>2</td>'."\r\n";

但事实并非如此:

$message .= '<tr><td>1</td><td>2</td>\r\n';

必须用双引号括起来,否则字符将添加到文本中,而不是创建回车符/换行符。\r\n

不过,@karancan是正确的,如果您对消息进行 base64 编码,则可以跳过添加 's,并添加所需的标头。\r\n


推荐