我正在使用Joomla中集成的PHPMailer库作为Joomla的电子邮件组件。它确实运行得很好,但是我遇到了用户使用1和1邮件服务器运行脚本的问题。他们可能会出现这样的错误:
2012-06-14 18:20:34 u65913791 1x1et0-1RocCH2xzU-00qzkq发送邮件后发生EE交易错误文本:msmtp.kundenserver.de[172.19.35.7]超过500行限制
另一个来自不同用户的例子:
数据结束后来自远程邮件服务器的SMTP错误:host mx00.1and1.co.uk[2212.227.15.134]:超过500行限制
行限制不是关于有多少行,而是一行中实际使用了多少字符,1和1限制为10240个字符(支持答案),这实际上是RFC 2822要求的10倍。
我认为这个问题是由于在提交电子邮件时使用了"错误"的行分隔符导致的,因此整个电子邮件作为一行到达电子邮件服务器。我想我需要确保在PHPMailer失败时在脚本中插入换行符
目前,我只是从所见即所得编辑器接收HTML内容,并将其放入PHPMailer对象:
// snip, $mail2send is the JMail instance, which inherits PHPMailer
$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody($mail->body);
// snip
如何插入适当的换行符?
使用chunk_split。这个函数是为像你这样的任务设计的,甚至它的默认值(拆分为76个字符)也是这样说的
所以你的代码将是
$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody(chunk_split($mail->body));
转换为内容传输编码,如base64或带引号的可打印编码,这两种编码都是为封装自由格式数据而设计的。QP对于偶尔具有8位字符和/或超长行的主要US-ASCII数据更有效。
当然,如果您的数据是HTML,并且在其他方面对SMTP是安全的,那么仅仅在您有空白的地方添加行终止符是一个稍微脆弱的解决方法(您确定在任何地方都没有行首字母"From"等吗?)
经过进一步调查,可以发现错误:在电子邮件线程中回复了几次后,嵌入的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;
}