2

電子メールの問題で深刻な問題が発生しています。

要するに:

  1. HTMLテンプレートファイルの読み込みfopen
  2. %passwordこのようにマークされたいくつかの値を実際の値に置き換えるstr_replace
  3. 次の関数を介してメールを送信します。ここ$contentで、はロードされたhtmlテンプレートファイルです。

パブリック関数send($ receiver、$ subject、$ content){

    $header = "From:".sender. "\n";
    $header .= "MIME-Version:1.0" . "\n";
    $header .= "Content-type:text/html;charset=utf-8" . "\n";

    $mailText = $content;
    mail($receiver, $subject, stripslashes(iconv('utf-8', 'iso-8859-1', $mailText)) , $header);

}

サーバーはpostfix付きのDebianです。

メールテンプレートはで始まります

<html> <body style="background-color: #fff;"> <table border="0"...

問題は、それを再現することはできませんが、場合によっては、私がそこに入れなかったいくつかのスペースをメールで見つけることができるということです。最も問題となるのは、ユーザーとパスワードの文字列にあるものです。

他のすべては正しいようです!エンコーディングはOKで、HTMLは受け入れられ、すべてのメールを配信できます...

パスワードの生成:

public static function create_password($length = 12) {
        $characters = array("a", "b", "c", "d", "e", "f", "g", "h", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_");
        $password = "";
        for($i=0; $i<$length; $i++) {
            $index = rand(1, count($characters)) -1;
            $password .= $characters[$index];
        }
        $password = str_replace("__","_", $password);
        return $password;
    }

アイデアはありますか、どこから検索を開始しますか?

テンプレート、str_replace、postifix、クライアント、...?

これまでのところありがとう

4

4 に答える 4

4

まず、HTMLを別のファイルに保存し、ブラウザーで開きます。

スペースが表示されている場合、それはHTMLです。

見た目が良ければ、メールが壊れてしまいます。

マングリング

これは多くの場合、行が長すぎて、メールサーバーが80列(古代の標準)より長い行でファンキーな処理を実行するために発生します。

マングリングを防ぐために、私は次のことを提案します:

  1. ヘッダーを追加しContent-Transfer-Encoding: base64ます。

  2. chunk_split(base64_encode(...))電子メールの内容全体に適用します。

于 2012-06-15T16:38:39.287 に答える
2

私は最近これと同じ問題を抱えていましたがTo:、複数の電子メールアドレスを持つ回線で発生しました。技術的な詳細は次のとおりです。

PHPmail()のドキュメントによると:この文字列のフォーマットは» RFC2822に準拠している必要があります。これは$to$messageパラメータ用です。

特定のセクション:2.1.1。線の長さの制限

この標準では
、1行の文字数に2つの制限があります。文字の各行は 998文字以下である必要がありCRLFを除いて78文字以下である必要があります 。

998文字の制限は、1行に998文字を超えるメッセージを処理できないインターネットメッセージ形式のメッセージを送信、受信、または保存する多くの実装の制限によるものです。実装を受け取ることは、堅牢性のために、行内の任意の数の文字を処理するのに適しています。ただし、([RFC2821]のトランスポート要件に準拠して)1行あたりのCRおよびLFを含む1000文字を超えるメッセージを受け入れない実装が非常に多いため、実装ではそのようなメッセージを作成しないことが重要です。


より保守的な78文字の推奨事項は、これらのメッセージを表示するユーザーインターフェイスの多くの実装に対応する
ことです。このような
実装は、この
仕様の意図(および実際に情報が失われる場合は[RFC2821]の意図
)。繰り返しになりますが、この制限はメッセージに課せられますが、メッセージを表示する実装には負担がかかります

堅牢性のために、行内の任意の数の文字
(少なくとも998文字の制限まで)を処理するため。

これを克服する方法は、ウェブ全体で複数あります。

  1. PHPドキュメントから:$message = wordwrap($message, 70, "\r\n");
  2. ジャックの答えから:chunk_split(base64_encode(...))
  3. 経験から:foreach($emails as $email){ $to_email = $email."\n";}
于 2014-02-20T16:47:43.583 に答える
1

本文の最大行長を超えているようです。これが発生すると、メールクライアントはこのような奇妙なことを行います。すべてのボディコンテンツを1行にまとめるのではなく、\n新しい行を作成するために使用します。

このような

<html>
    <body style="background-color: #fff;">
        <table border="0"...

それ以外の

<html> <body style="background-color: #fff;"> <table border="0"...
于 2012-06-15T16:43:06.720 に答える
0

これ:

stripslashes(iconv('utf-8', 'iso-8859-1', $mailText));

渡された文字のいずれかがラテン語ではない場合(UTF8エンコード)、通知が生成されます。つまり、文字が混乱します(ラテン語以外の最初の文字がある場合は停止します)。

于 2012-06-15T16:57:13.547 に答える