hbi*_*bit 5 php email phpmailer
我正在使用Joomla中集成的PHPMailer库来获取Joomla中的电子邮件组件.它确实工作得很好,但是我遇到了使用1and1邮件服务器运行脚本的用户的问题.他们可能会遇到这样的错误:
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 [212.227.15.134]:超出500行限制
行限制不是关于多少行,而是在一行中实际使用了多少字符,1和1限制为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
Run Code Online (Sandbox Code Playgroud)
如何插入适当的换行符?
使用chunk_split.这个功能是为像你这样的任务设计的,甚至它的默认设置(分成76个字符)也是如此.
所以你的代码将是
$mail2send->setSubject($mail->subject);
$mail2send->IsHTML(true);
$mail2send->setBody(chunk_split($mail->body));
Run Code Online (Sandbox Code Playgroud)
hbi*_*bit -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;
}
Run Code Online (Sandbox Code Playgroud)