0

データベースの内容を読み取り、それらの内容を電子メール メッセージに出力するための PHP スクリプトをいくつか作成しました。ときどき、スペース (0x20) 文字が出力に埋め込まれているのを目にすることがあります。たとえば、あるスクリプトでは、正確に「n」個の非スペース文字を含む PHP グローバル変数を参照しています。その変数が電子メール メッセージにダンプされると、(常にではありませんが) ときどき、文字列に空白が埋め込まれて表示されます (文字列 "n+1" の全長)。それ以外の場合、HTML タグ (<BR> など) は < BR> として表示されます (「B」の前のスペースに注意してください)。

スクリプトの動作に一貫性がないため (一部の電子メールは影響を受け、他の電子メールは影響を受けない)、問題を見つけることができないようです。

時々 BREAK タグにスペースを埋め込む PHP スクリプトへのリンクを同封します。データベースに特定のログイン情報を提供する行を削除しました。そうでなければ、他のすべては無傷です。以下のリンクにあるコード ファイルの 281 行目には、スペースが埋め込まれた BREAK コマンドが含まれています (上記のとおり)。これは一度だけ起こりました!

http://jem-software.com/temptest.txt

他に関連する可能性がある唯一の情報は、このスクリプト ファイルが、Joomla! ベースのウェブサイト。

編集1:

リカルドさん、ご提案ありがとうございます。ここにいくつかの明確化があります:

  1. データベースに挿入するために、電子メールを読んで結果を解析していません。正反対に、データベースから読み取り、その結果を使用して電子メールを作成しています。データベースをチェックして、使用された文字セットを確認し、文字セットを明示的に渡して、違いがあるかどうかを確認します。

  2. 私が参照しているデータベースは Joomla の外部にあるため、Joomla 関数を使用してデータベースにアクセスすることはありません。環境。これは、数年前に作成された PHP スクリプトから作成された既存のデータベースです。私の古いウェブサイトが Joomla を使用して書き直されたとき、PHP データベース アクセス コードをそのまま「移植」したかったので、これを可能にするために JUMI プラグインをインストールしました。

  3. データベースの文字コードを調べて、メールメッセージの文字コードと同期させます。

  4. 文字コードの問題により、ハードコードされた HTML タグに SPACE が挿入される仕組みがわかりません。このタグはデータベースからのものではなく、電子メールにリテラル文字列として入力されたものです。

4

1 に答える 1

0

これは奇妙な問題ですが、ここに私の 2 セントがあります。

1 つ目は、データベースとメール サブシステムにアクセスするために Joomla 関数を使用していないことです。これは機能する可能性がありますが、あまり良くありません。

2つ目は、これは文字セット/コードページの問題のような匂いがする.

文字セットの問題に関するいくつかの考慮事項を次に示します。

私はあなたのコードをすぐに読みましたが、何も間違っていませんでした。しかし、Joomla は UTF-8 を使用しており、クエリで UTF-8 が指定されていません (mysql_set_charset() がありません!)。これが最初の問題になる可能性があります。

2 つ目は、送信者の設定に応じて、読むメールの文字セットが異なることです。コードページの問題を適切に処理するようにしてください。以下は、メールの解析に使用する関数のスニペットです。

$mime = imap_fetchmime($this->connection, $this->messageNumber, $partNumber);
return $this->decodeMailBody($data,$mime); // QUOTED_PRINTABLE

function decodeMailBody($string,$mime) {
    $str = quoted_printable_decode($string);

    echo "<h3>mime: $mime; charset $charset</h3>";
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252
    $mimes = explode('charset=',$mime);
    foreach($mimes as $mimepiece) {
        $charset = $mimepiece;
    }       
    $charset = strtolower(trim($charset));
    if ($charset == 'utf-8') {
        return $str;
    } else {
        return iconv($charset, 'UTF-8', $str);
    }
}

最後に、解析後にメールをデータベースに挿入するときは、必ず utf-8 を使用してください。

于 2013-02-02T20:51:30.633 に答える