2012-04-16 3 views
0

다음 메일 스크립트를 사용하고 있지만 일부 문자가 변환되는 것이 문제입니다. 일반적인 메일은 다음과 같습니다 :이 ($ 메시지 = filter_var가 ($이 _ POST [ '메시지', FILTER_SANITIZE_SPECIAL_CHARS가)) 추측 것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 

를 망쳐 놨어요. 그렇다면 그것을 안전하지 않게 변경하려면 어떻게해야합니까? 그리고 그 스크립트에 추가해야 할 다른 개선점이 있습니까?

<?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

+0

나는 모른다. 나는 PHP에 대한 경험이 거의 없다. 스크립트는 구입 한 템플릿에 포함되어있다. 나는 그것이 보안과 관련이 있고 물어 보지 않고 무언가를 엉망으로 만들고 싶지 않다고 생각했다.) – kannix

답변

0

정말 일을해야 할 유일한 것은 수신 클라이언트가 제대로 처리 할 수 ​​있는지 확인하기 위해 노력하고, 어쨌든 그 어떤 것도 보장 적이 없다 :이 경우 P

, 그것은 당신의 특별한 살이 문자를 HTML 엔터티 (예 : \n ->&#10)로 가져 오면 다시 고칠 작업을하지 않아도 이메일이 손상 될 수 있습니다. 필터를 없애면 좋을 것입니다.

+0

답변을 주셔서 감사합니다.이 필터를 제거 할 것입니다 .. (http://safalra.com/programming/php/contact -feedback-form /) 그들은 $ crack = eregi ("(\ r | \ n) (from : | from : | cc : | bcc :)", $ body); 나는 그런 것을 추가해야합니까 아니면 쓸모 없게해야합니까? – kannix

1

Slokun이 유효한 포인트입니다.

교체 :

$header = "From: ".$email; 
이메일의 내용이 HTML 엔티티를 포함하고 다른 언어로 나타나는 또한, 그것은 이메일 클라이언트를 수신하여 올바른 렌더링을 보장하기 위해 전자 메일 헤더에 다음을 추가 할 좋은 생각 일 것입니다

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

편집 :와

은 스크립트에서 위의 라인을 포함 할 경우 HTML 엔티티를 소독하라고하는 행을 제거 할 필요가 없습니다,라고 말했다 가졌어요. 현재 귀하의 문제는 이메일 클라이언트가 전자 메일 콘텐츠를 HTML이 아닌 순수 텍스트로 해석하지 않는다는 것입니다.

+0

좋아, HTML 메일로 보내려면 좋은 생각 같다 :) Slokuns 게시물에 대한 내 의견에 대해 어떻게 생각하십니까? – kannix

+0

@kannix 나는 구현 방식을 본 적이 없다고 말할 수는 없지만 방대한 메일 링 스크립트를 작성하는 데 익숙하지 않다. 일반적으로 저는 휠을 다시 발명하지 않고 잘 정립 된 검사 스크립트를 사용하려고합니다. 좋은 예가 phpMailer : http://phpmailer.worxware.com/ – trickyzter

+0

@kannix 모든 방법을 사용하여 정규식을 사용하지만, 'preg_match'로 'ereg'를 대체하는 것이 확실하다면 php 5.3에서 사용되지 않습니다. – trickyzter