5

JoomlaのメールコンポーネントにJoomlaに統合されたPHPMailerライブラリを使用しています。それは非常にうまく機能しますが、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行制限を超えました

行制限は、行数ではなく、1行で実際に使用される文字数であり、1and1は10240文字に制限されます(回答をサポート)。これは、RFC2822で必要とされる文字数の10倍です。

この問題は、電子メールの送信時に「間違った」行区切り記号を使用して、電子メール全体が1行として電子メールサーバーに到達することが原因であると考えられます。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

チャンクスプリットを使用します。この関数はあなたのようなタスクのために設計されており、そのデフォルト(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は、時折8ビット文字や長すぎる行を含む主にUS-ASCIIデータに対してより効率的です。

もちろん、データが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 に答える