5

我正在将Joomla 中集成的 PHPMailer 库用于 Joomla中的电子邮件组件。它确实工作得很好,但是我遇到了用户使用 1and1 邮件服务器运行脚本的问题。他们可能会遇到这样的错误:

2012-06-14 18:20:34 u65913791 1x1et0-1RocCH2xzU-00qzkq EE 发送邮件文本后交易错误:msmtp.kundenserver.de[172.19.35.7] 500 超出线路限制

另一个用户的另一个例子:

数据结束后来自远程邮件服务器的 SMTP 错误:主机 mx00.1and1.co.uk [212.227.15.134]:超过 500 行限制

行限制不是关于多少行,而是在一行中实际使用了多少个字符,1and1 限制为 10240 个字符(支持答案)——这实际上是RFC 2822中要求的 10 倍。

我认为问题是由于在提交电子邮件时使用“错误”的行分隔符导致整个电子邮件作为单行到达电子邮件服务器。我想我需要确保在我的脚本中插入换行符,因为 PHPMailer 失败了。

目前我只是从 WYSIWYG 编辑器接收 HTML 内容并放入 PHPMailer 对象:

// snip, $mail2send is the JMail instance, which inherits PHPMailer
$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody($mail->body);   
// snip

如何插入适当的换行符?

4

3 回答 3

5

使用chunk_split。这个函数是为像你这样的任务设计的,甚至它的默认值(拆分为 76 个字符)也是如此。

所以你的代码将是

$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody(chunk_split($mail->body));  
于 2012-07-28T10:34:27.743 回答
0

转换为内容传输编码,例如 base64 或quoted-printable,这两种编码都是为封装自由格式数据而设计的。QP 对于主要是 US-ASCII 数据以及偶尔的 8 位字符和/或超长行更有效。

当然,如果您的数据是 HTML 并且它对 SMTP 来说是安全的,那么仅在您有空格的地方添加行终止符是一个稍微脆弱的解决方法(您确定在任何地方都没有行首“From”等吗? )

于 2012-07-28T15:17:09.963 回答
-1

经过进一步调查,可以确定错误:在电子邮件线程中多次回复后,嵌入的 HTML 消息不再有换行符。我猜是参与对话的电子邮件客户端做到了这一点。

为了克服这个问题,我使用以下函数进行 HTML 标记安全包装:

/* HTML-tag-safe wordwrap
 * from http://php.net/manual/de/function.wordwrap.php
 * by nbenitezl[arroba]gmail[dot]com
 */
function htmlwrap(&$str, $maxLength=76, $char="\r\n"){
    $count = 0;
    $newStr = '';
    $openTag = false;
    $lenstr = strlen($str);
    for($i=0; $i<$lenstr; $i++){
        $newStr .= $str{$i};
        if($str{$i} == '<'){
            $openTag = true;
            continue;
        }
        if(($openTag) && ($str{$i} == '>')){
            $openTag = false;
            continue;
        }
        if(!$openTag){
            if($str{$i} == ' '){
                if ($count == 0) {
                    $newStr = substr($newStr,0, -1);
                    continue;
                } else {
                    $lastspace = $count + 1;
                }
            }
            $count++;
            if($count==$maxLength){
                if ($str{$i+1} != ' ' && $lastspace && ($lastspace < $count)) {
                    $tmp = ($count - $lastspace)* -1;
                    $newStr = substr($newStr,0, $tmp) . $char . substr($newStr,$tmp);
                    $count = $tmp * -1;
                } else {
                    $newStr .= $char;
                    $count = 0;
                }
                $lastspace = 0;
            }
        } 
    }

    return $newStr;
}
于 2012-08-13T08:53:40.610 回答