2012-04-16 55 views
0

我正在使用以下邮件脚本,但问题在于它会转换某些字符。 一个典型的邮件看起来是这样的:PHP邮件脚本换行符和特殊字符

Neue Nachricht von Mustermann, Max ([email protected]): 
Hallo Herr Platzhalter,
wie soeben besprochen, würden wir gern ein 
"Schild" mit der Aufschrift "Aufschrift" bei Ihnen 
bestellen.
Bitte teilen Sie uns doch mit, wie wir da 
verfahren müssen ... 
Ihnen einen schönen 
Urlaub!
Familie Mustermann 

我猜,这($消息= filter_var($ _ POST [ '消息'],FILTER_SANITIZE_SPECIAL_CHARS))弄乱它。那么,如何改变这种情况而不会使其不安全?还有其他改进,我应该添加到该脚本?

<?php 
    //Enter your email here 
    $your_email = "mymail"; 
    //Enter the subject of the mail here 
    $subject = "Kontakt Webseite"; 


    $name = $_POST['name']; 
    $email = $_POST['email']; 
    //Filter HTML characters 
    $message = filter_var($_POST['message'], FILTER_SANITIZE_SPECIAL_CHARS); 

    $error = "Fehler: "; 

    //Default message if unsuccessful and no other reason found 
    $return_message = $error."Leider hat das Versenden der Nachricht nicht geklappt, bitte schreiben Sie mir direkt an ".$your_email." eine E-Mail"; 
    if(strlen($name) > 0 && strlen($email) > 0 && strlen($message) > 0) { 
     if(filter_var(filter_var($email, FILTER_VALIDATE_EMAIL), FILTER_SANITIZE_EMAIL)) { 
      try { 
       $body = "Neue Nachricht von ".$name." (".$email."):\n".$message; 
       $header = "From: ".$email; 
       mail($your_email, $subject, $body, $header); 
       $return_message = "Die Nachricht wurde erfolgreich versendet, ich melde mich schnellst möglich bei Ihnen"; 
      } 
      catch(Exception $e) { } 
     } else { 
      $return_message = $error."Ihre E-Mail Adresse scheint ungültig zu sein."; 
     } 
    } else { 
     $return_message = $error."Ein oder mehrere Felder waren nicht ausgefüllt.";  
    } 
    echo $return_message; 
?> 
+0

它是否真的需要逃避通过邮件发送的字符串? PHP将处理任何问题,它不像你使用它的MySQL查询 – gosukiwi 2012-04-16 17:51:56

+0

我不知道..我几乎没有经验的PHP ..该脚本包含在一个买的模板。我认为这是一些与安全有关的事情,并且不想在没有询问的情况下搞砸东西;) – kannix 2012-04-16 17:55:26

回答

0

这将真正做的唯一的事情是努力确保接收客户端能够处理得当,而且也从来没有那无论如何任何保证:P

在这种情况下,它的转向你的特殊字符转换为HTML实体(例如,\n - >&#10),这会破坏您的电子邮件而无需大量工作来重新修复它们。摆脱过滤器,你应该很好。

+0

感谢您的回答,我将删除该过滤器..在此网站上(http://safalra.com/programming/php/contact他们正在使用类似这样的内容:$ crack = eregi(“(\ r | \ n)(to:| from:| cc:| bcc :)”,$ body);我应该添加一个这样的东西还是已经过时了? – kannix 2012-04-16 18:26:15

1

Slokun提出了一个有效的观点。此外,由于邮件内容包含HTML实体,似乎是另一种语言,这将是一个好主意,附加以下的电子邮件标题由接收的电子邮件客户端,以确保正确的渲染:

替换:

$header = "From: ".$email; 

有了:

$header = "From: " . $email . "\r\n"; 
$header .= "Content-type: text/html; charset=utf-8" . "\r\n"; 

编辑:说了这么多,如果您在脚本上线,你不会需要删除清理HTML实体线。您目前的问题是,接收电子邮件客户端不会将电子邮件内容解释为HTML,而是纯文本。

+0

好的,似乎是一个好主意,将它作为html邮件发送:)您如何看待我在Slokuns post下的评论? – kannix 2012-04-16 18:48:09

+0

@kannix我不能说我见过这种形式的实现,但我不习惯于构建大量的邮件脚本。通常我会尽量不重新发明轮子,并使用完善的审查脚本。一个很好的例子是phpMailer:http://phpmailer.worxware.com/ – trickyzter 2012-04-16 21:46:15

+0

@kannix通过一切手段利用正则表达式,但是如果你确实用'preg_match'替代'ereg',因为它已被弃用的PHP 5.3 – trickyzter 2012-04-16 21:50:33