PHP吃邮件序列所需的反斜杠(共享主机)

时间:2015-04-17 11:53:11

标签: php escaping email-headers

我知道有很多这样的主题,但我还没有找到令人满意的答案。

我在我的网页上的共享主机上的PHP会删除反斜杠(使用magic_quotes()或类似的东西吗?)来自即将使用mail()发送的表达式,因此它会更改:

<?php
$email_to = "myemail@address.com";
$email_subject = "Message from your webpage";

$name = $_POST['name'];
$email_from = $_POST['email'];
$subject = $_POST['subject'];
$message= $_POST['message'];

if($subject) {
die(); // $subject is a honeypot
}

$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
    die();
}

$email_message = "";
$email_message .= "Name: ".$name;
$email_message .= "Email: ".$email_from;
$email_message .= "Message: ".$message;

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$headers .= "From: " . $name . " <" . $email_from . ">" . "\r\n"; 
$headers .= "Reply-To: " . $email_from;

@mail($email_to, $email_subject, $email_message, $headers);
?>

进入这个:

$headers  = 'MIME-Version: 1.0' . "rn";
$headers .= 'Content-type: text/html; charset=utf-8' . "rn";
$headers .= 'X-Mailer: PHP/'.phpversion()."rn";
$headers .= "From: " . $name . " <" . $email_from . ">" . "rn"; 
$headers .= "Reply-To: " . $email_from;

此类电子邮件没有作者,没有适当的字符集,它们看起来很糟糕。我尝试了很多不同的功能,但似乎都没有。 有谁知道如何解决它?

编辑:我现在把整个代码放进去了。另外,var_export($ headers)显示了其中的最新内容string(136) "MIME-Version: 1.0rnContent-type: text/html; charset=utf-8rnX-Mailer: PHP/5.6.6rnFrom: dasda rnReply-To: asdasd@dasda.cz"

2 个答案:

答案 0 :(得分:1)

更新

请勿使用其网页编辑器编辑代码。

应该有一个代码编辑器。

他们使用cPanel作为控制面板吗?如果是这样寻找代码编辑器,它就在那里。

或者在本地工作站上使用FTP和编辑。这是首选方法。

我使用FileZilla for FTP和Notepad ++作为编辑器,它们可以很好地协同工作。

更新结束


你需要显示整个代码,了解你是如何得到“进入这个”的 如果那不是你正在做的事情,我想看看var_dump。

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'X-Mailer: PHP/'.phpversion()."\r\n";
$headers .= "From: " . $name . " <" . $email_from . ">" . "\r\n"; 
$headers .= "Reply-To: " . $_POST["email"] . "\r\n";

var_export($headers);

答案 1 :(得分:0)

您应该使用PHP的本机PHP_EOL,因为它与平台无关(请查看this question以供参考)。尝试修改你的代码:

$headers  = 'MIME-Version: 1.0' . PHP_EOL;
$headers .= 'Content-type: text/html; charset=utf-8' . PHP_EOL;
$headers .= 'X-Mailer: PHP/'.phpversion() . PHP_EOL;
$headers .= "From: " . $name . " <" . $email_from . ">" . PHP_EOL; 
$headers .= "Reply-To: " . $_POST["email"] . PHP_EOL;

修改

正如@misunderstood指出PHP_EOL不是一个好的解决方案,因为电子邮件标题应始终以序列结束。

我想,我为此找到了workaround。而不是\r\n尝试使用:

mb_convert_encoding('&#x000D;&#x000A;', 'UTF-8', 'HTML-ENTITIES')

http://en.wikipedia.org/wiki/Newline