我在Joomla中使用PHPMailer library integrated in Joomla作为电子邮件组件。它确实工作得很好,但是我遇到了使用1and1邮件服务器运行脚本的用户的问题。他们可能会遇到这样的错误:
2012-06-14 18:20:34 u65913791发送邮件文本后1x1et0-1RocCH2xzU-00qzkq EE事务错误:msmtp.kundenserver.de [172.19.35.7] 超出500行限制 < / p>
来自不同用户的另一个例子:
数据结束后来自远程邮件服务器的SMTP错误: 主持人mx00.1and1.co.uk [212.227.15.134]:超过500行限制
行限制不是关于行数,而是单行中实际使用了多少个字符,1和1限制为10240个字符(支持答案) - 实际上是RFC 2822所需的10倍。< / p>
我认为问题是由于在提交电子邮件时使用“错误”的行分隔符导致整个电子邮件作为单行到达电子邮件服务器。我想我需要确保在我的脚本中插入换行符,因为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
如何插入适当的换行符?
答案 0 :(得分:5)
使用chunk_split。这个功能是为像你这样的任务设计的,甚至它的默认设置(分成76个字符)也是如此。
所以你的代码将是
$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody(chunk_split($mail->body));
答案 1 :(得分:0)
转换为内容传输编码,例如base64或quoted-printable,这两种编码都是为封装自由格式数据而设计的。 QP对于主要是US-ASCII数据的效率更高,偶尔会有8位字符和/或超长行。
当然,如果你的数据是HTML并且对于SMTP来说是安全的,那么只是在你有空白的地方添加行终止符是一个稍微脆弱的解决方法(你确定你没有行首字母“From”)等等?)
答案 2 :(得分:-1)
经过进一步调查后,可以发现错误:在电子邮件主题中的几个回复之后,嵌入的HTML消息不再有行中断。我想参与对话的电子邮件客户端就是这样做的。
为了克服这个问题,我使用以下函数进行HTML-tag-safe包装:
/* 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;
}