我对PHP mail();
函数有一个奇怪的问题。
像这样使用
$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
并且特殊字符也被破坏。那里发生了什么?
答案 0 :(得分:5)
需要双引号才能输入特殊的换行符("\r\n"
)。当您使用单引号时,它们不会被视为换行符,而是将它们视为文字文本。
PHP解释器将使用双引号来评估材质,但不会对单引号进行评估。因此,最佳做法是仅在需要评估某些内容时使用双引号(如变量,无法连接时,或者换行符等特殊字符)。
答案 1 :(得分:5)
单引号用于文字字符串,不替换/扩展变量,并且不遵守\'
和\\
以外的转义序列。您编写代码的方式可以保留单引号,除非您必须将换行符双引号为"\r\n"
。
答案 2 :(得分:1)
请阅读手册:
http://php.net/manual/en/language.types.string.php
单引号
要指定文字单引号,请使用反斜杠()对其进行转义。至 指定一个文字反斜杠,加倍(\)。所有其他实例 反斜杠将被视为字面反斜杠:这意味着 您可能习惯的其他转义序列,例如\ r或\ n,将是 按字面意思输出,而不是具有任何特殊含义。