php krzaczki w formularzu kontkatowym

php krzaczki w formularzu kontkatowym
Michał Pieczyński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0
Kopiuj
<?php
header('Content-Type: text/html; charset=utf-8');
$message_sent = false;

if(isset($_POST['email']) && $_POST['email'] != ''){
    if( filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ){
      //submit the form
      $userName = $_POST['name'];
      $userEmail = $_POST['email'];
      $messageSubject = $_POST['subject'];
      $message = $_POST['message'];
  
      $to = "design@michalpieczynski.pl";
      $body = "";
  
      $body .= "From: ".$userName. "\r\n";
      $body .= "Email: ".$userEmail. "\r\n";
      $body .= "Message: ".$message. "\r\n";
  
      mail($to,$messageSubject,$body);	
      
      $message_sent = true;
      echo('Wiadomość została wysłana'); 
      header( "refresh:3;url=kontakt.html" );
  }
}
?>

Mam taki formularz kontkatowy w php i wychodzą krzaczki jak dostaje wiadomość, Co zrobić żeby były polskie znaki a nie krzaczki?

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3622
1

Spróbuj do wiadomości dodać odpowiednie nagłówki.
Coś w stylu:

Kopiuj
$headers = [];
$headers[] = "Content-Type: text/plain; charset=UTF-8";
$headers[] = "From: {$userName} <{$userEmail}>";
$headers[] = "Reply-To: {$userEmail}";

$result = mail(
            $to,
            $encodedSubject,
            $body,
            implode("\r\n", $headers)
        );

Zwróć uwagę też na zmienna $result w tym kodzie.
Wykorzystaj ją do sprawdzenia czy wynik to naprawdę wysłanie wiadomości a nie błąd.
Dokumentacja:
https://www.php.net/manual/en/function.mail.php

L7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 435
1

@Michał Pieczyński - masz tutaj błąd logiczny:

Kopiuj
echo('Wiadomość została wysłana'); 
header( "refresh:3;url=kontakt.html" );

Wyrzuci "warning". A poza tym, po co wyświetlasz to na stronie, która wysyła email? Wyświetl tą wiadomość na stronie kontakt.html
Podobnie z header na górze - jeżeli nic nie "echujesz" to niepotrzebny jest Tobie ten header (chyba, że to nie jest cały kod)

Kupony Janusza
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Samo dodanie charset=UTF-8 w nagłówkach często nie wystarcza dla tematu wiadomości ($messageSubject). Jeśli w temacie pojawią się polskie znaki, większość klientów pocztowych i tak wyświetli krzaki. Temat musi być zakodowany zgodnie z RFC 2047.

Możesz to zrobić tak:
$encodedSubject = '=?UTF-8?B?' . base64_encode($messageSubject) . '?=';

W Twoim kodzie wrzucasz dane z $_POST bezpośrednio do nagłówków (przez zmienną $body). Atakujący może do pola "name" dopisać własne nagłówki (np. Bcc: spam@world.com) i wykorzystać Twój serwer do rozsyłania spamu. Zawsze filtruj dane wejściowe!

Gotowy, poprawiony fragment:

Kopiuj
$to = "design@michalpieczynski.pl";
$encodedSubject = '=?UTF-8?B?' . base64_encode($_POST['subject']) . '?=';

$headers = [
    'MIME-Version: 1.0',
    'Content-type: text/plain; charset=utf-8',
    'From: ' . str_replace(["\r", "\n"], '', $_POST['name']) . ' <' . $userEmail . '>',
    'Reply-To: ' . $userEmail
];

if(mail($to, $encodedSubject, $body, implode("\r\n", $headers))) {
    // Zamiast echo przed header, użyj sesji lub parametru w URL
    header("Location: kontakt.html?status=success");
    exit;
}
Michał Pieczyński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Kod działa jednak, problemem było złe kodowanie na poczcie, dzięki wszystkim za rady.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.