电子邮件邮件服务器990字符限制的解决方法

8
想知道是否有任何函数/类等能够帮助解决电子邮件中990个字符限制的问题,因为我的HTML受到了影响。
问题如下(来源:Source):
请注意,邮件服务器对电子邮件中每行的字符数有990个限制。如果发送的电子邮件包含超过990个字符的行,则这些行将被附加的换行符分成多个部分,这可能会导致电子邮件消息出现损坏,特别是对于HTML内容。为了防止这种情况发生,在电子邮件消息中适当的位置添加自己的换行符以确保没有行超过990个字符。
有其他人也遇到这个问题吗?你们是怎么解决的?
听起来我需要找一个好的地方来分割我的HTML并手动添加换行符,唉...
更新:
这是有很多行的制表数据。那么我需要在哪里添加 \n 或 <br />
更新 #2:添加MIME类型代码。
$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1\r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; // added this, but still no results
$headers .= "From: from@email.com\r\n";

以下是我如何调用这些函数的方法:
最初的调用方式:
return $html;

我尝试过的方法:

return imap_8bit($html); // not working, nothing is captured in the error log

AND

return imap_binary($html); // not working, nothing is captured in the error log

更新 #3(添加邮件功能)

try {
    mail(
        'to@email.com',
        'Subject of Email',
        $html,
        $headers
        );
    } catch (Exception $e) {
        echo ("ERROR: Email NOT sent, Exception: ".$e->getMessage());
    }

示例HTML(这是HTML电子邮件的消息)(这也是XMLRPC服务的一部分类)

private function getHTML() {
    $html  = '<html><head><title>Title</title></head><body>';
    $html .= '<table>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '</table>';
    $html .= '</body>';
    $html .= '</html>';

    return $html;
    //return imap_8bit($html); // not working, nothing is captured in the error log
    //return imap_binary($html); // not working, nothing is captured in the error log
    // Both of these return the XMLRPC Fault Exception: 651 Failed to parse response
}

故障异常:651 解析响应失败,基本上是因为不喜欢格式或数据返回方式。


我可以问一下你在HTML中做什么,不能有换行吗?您可以在属性之间分割标记,而不会影响标记。 - Brad Christie
所以我想问的是,我是否必须像这样输入换行符:\n还是使用HTML <br />会起作用?另外,我希望尽可能地保持HTML W3C验证。 - Phill Pafford
只要你正确地使用我在答案中提到的函数,就不需要担心HTML。 - Alix Axel
这与HTML换行符<br/>无关。在这里,它是不相关的。解决方案是进行base64编码,但如果您不想这样做,一个简单的\r\n就可以了。 - Brad
3个回答

7
你可以使用wordwrap()函数对内容进行处理,这样就不需要手动插入换行符了。
你是否考虑过使用许多可用的邮件库之一呢?例如PHPMailerPEAR MailSwiftMailer等。

wordwrap()会将字符本身添加到可视的HTML中吗?数据在一个包含多行数据的表格中,我不确定添加换行符或者<br />是否会导致数据格式显示问题。 - Phill Pafford
@Phill Pafford,除非他使用<pre>标签,否则使用wordwrap()来换行文本不会影响显示。这是我们在我工作的ESP所做的,邮件库也是这样做的。 - jasonbar
我认为wordwrap()函数可能有效,正在测试中。顺便问一下,如果只使用wordwrap($html)而没有参数,它的默认操作是什么? 看起来只是在空格处分割字符串(这正是我想要的,并且正在进行测试),只是想确认一下。 - Phill Pafford
1
@Phill Pafford,正确的做法是使用wordwrap($html)函数,它会在每75个字符(或更少,取决于单词断点)处将\n插入字符串中,但不会打断单词。 - jasonbar
1
我认为这是正确的答案。我在通过PHP的mail()函数发送电子邮件时,在990个字符后插入了空格。我添加了以下代码(在此答案之后),我的问题就解决了:mail($to,$subject,wordwrap($message,75,"\n",true),wordwrap($headers,75,"\n",true))。 - SG1

2

我正在XMLRPC服务中运行此程序,但imap_8bit()和imap_binary()都会崩溃。用法:使用return imap_8bit($html);而不是return $html;(imap_binary()同理)。我使用的对吗?目前SwiftMailer不是一个选项,因为它需要经过批准才能安装在生产服务器上。 - Phill Pafford
@Phill Pafford:你必须相应地设置mime头,如果没有查看你的代码,我无法告诉你是否正确。你考虑过使用SwiftMailer或任何其他电子邮件库,比如PHPMailer吗? - Alix Axel
更新了我的头文件以添加代码(请参见主要问题),仍然没有运气。 - Phill Pafford
@Phill:好的,我需要更多信息。你说的“崩溃”是什么意思?你是使用内置的mail()函数发送电子邮件吗? - Alix Axel
@Phill Pafford:帮我帮助你,为问题提供一些有用的上下文。你在哪里使用了 return $html;?你所说的“崩溃”是什么意思?有任何错误输出吗? - Alix Axel
显示剩余3条评论

1
实际上,这不是一个“邮件服务器”的问题。SMTP行限制规定了在传输过程中每行允许的字符数。SMTP RFC 允许每行最多1000个字符,默认安装的 postfix 限制为998个字符。如果您认为需要超过RFC,请联系您的托管提供商以增加您的SMTP行限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接