1

mail();PHP関数に奇妙な問題があります。

こんな感じで使う

$header  = "MIME-Version: 1.0" . "\r\n";
$header .= "Content-type: text/html; charset=utf-8" . "\r\n";
$header .= "Content-Transfer-Encoding: quoted-printable" . "\r\n";
$header .= "Reply-To:" . $email . "\r\n";
$header .= "From: Kontaktformular <noreply@thomas-glaser-foto.de>" . "\r\n";
mail( "mail.me@mail.com", "Message from " . $name . " through your website!", $message, $header );

すべてが期待どおりに機能します。メールが送信され、すべてが正しくエンコードされ、件名も問題ありません。

しかし、次のように二重引用符を一重引用符で変更すると、次のようになります。

$header  = 'MIME-Version: 1.0' . '\r\n';
$header .= 'Content-type: text/html; charset=utf-8' . '\r\n';
$header .= 'Content-Transfer-Encoding: quoted-printable' . '\r\n';
$header .= 'Reply-To:' . $email . '\r\n';
$header .= 'From: Kontaktformular <noreply@thomas-glaser-foto.de>' . '\r\n';
mail( 'mail.me@mail.com', 'Message from ' . $name . ' through your website!', $message, $header );

メールは引き続き送信されますが、件名は設定されていません。代わりに、それは

www-data@domain.com

特殊文字も破棄されます。そこで何が起こっているのですか?

4

3 に答える 3

5

特殊な改行文字 ( ) を入れるには、二重引用符が必要です"\r\n"。一重引用符を使用すると改行として扱われず、リテラル テキストとして扱われます。

PHP インタープリターは二重引用符内の要素を評価しますが、単一引用符に対しては評価しません。このため、何かを評価する必要がある場合 (変数、連結が不可能な場合、または改行などの特殊文字など) にのみ二重引用符を使用することをお勧めします。

于 2013-02-21T17:45:08.307 に答える
5

一重引用符はリテラル文字列用であり、変数は置換/展開されず、 and 以外のエスケープ シーケンス\'\\無視されます。コードを記述した方法では、改行を として二重引用符で囲む必要があることを除いて、単一引用符をそのままにしておくことができます"\r\n"

于 2013-02-21T17:46:35.753 に答える
1

マニュアルをお読みください:

http://php.net/manual/en/language.types.string.php

一重引用符

リテラルの一重引用符を指定するには、バックスラッシュ () でエスケープします。リテラルのバックスラッシュを指定するには、二重にします (\)。バックスラッシュの他のすべてのインスタンスは、リテラルのバックスラッシュとして扱われます。これは、\r や \n など、慣れている可能性のある他のエスケープ シーケンスが、特別な意味を持つのではなく、文字通り指定されたとおりに出力されることを意味します。

于 2013-02-21T17:46:21.257 に答える