Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja ()mail - kodowanie.
Forum PHP.pl > Forum > Przedszkole
Lookdem
Witam, skorzystałem z jednego skryptu do wysyłania formularza kontaktowego na maila. Jednak po wysłaniu, nie widać polskich znaków. Czytałem, że powinienem dodać kodowanie :
  1. "Content-Type: text/plain; charset=UTF-8\r\n"

Kombinowałem z tym, jednak dopiero zaczynam z PHP i nie wiem w jakich miejscach trzeba to ustawić. Proszę o pomoc i krótkie uzasadnienie czemu właśnie tak.

Mój kod :
  1. <?
  2.  
  3. $mailto = "moj@mail";
  4. $cc = "";
  5. $bcc = "";
  6. $subject = "Temat";
  7. $vname = "Formularz kontaktowy";
  8.  
  9.  
  10. $email = $_POST['email'];
  11.  
  12. function validateEmail($email)
  13. {
  14. if(eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,3})?(\.[a-zA-Z]{2,3})?$', $email))
  15. return true;
  16. else
  17. return false;
  18. }
  19.  
  20.  
  21. if(strlen($_POST['name']) < 1 || strlen($_POST['message']) < 1 || validateEmail($email) == FALSE)
  22. {
  23. $emailerror = 'Błędy:';
  24.  
  25. if(empty($_POST['name']))
  26. {
  27. $emailerror .= '<li>Podaj imię i nazwisko.</li>';
  28. }
  29.  
  30. if(validateEmail($email) == FALSE)
  31. {
  32. $emailerror .= '<li>Podaj prawidłowy adres email</li>';
  33. }
  34.  
  35. if(empty($_POST['message']))
  36. {
  37. $emailerror .= '<li>Wpisz treść wiadomości.</li>';
  38. }
  39. }
  40. else
  41. {
  42. $emailerror .= "Twoja wiadomość została wysłana.";
  43.  
  44. // NOW SEND THE ENQUIRY
  45. $timestamp = date("F j, Y, g:ia");
  46.  
  47. $messageproper ="\n\n" .
  48. "Name: " .
  49. ucwords($_POST['name']) .
  50. "\n" .
  51. "Email: " .
  52. ucwords($email) .
  53. "\n" .
  54. "Comments: " .
  55. $_POST['message'] .
  56. "\n" .
  57. "\n\n" ;
  58.  
  59. $messageproper = trim(stripslashes($messageproper));
  60. mail($mailto, $subject, $messageproper, "From: \"$vname\" <".$_POST['e_mail'].">\nReply-To: \"".ucwords($_POST['first_name'])."\" <".$_POST['e_mail'].">\nX-Mailer: PHP/" . phpversion() );
  61. }
  62. ?>
  63.  
  64. <div id='emailerror'>
  65. <ul>
  66. <? echo $emailerror; ?>
  67. </ul>
  68. </div>


Z góry dziękuję i pozdrawiam smile.gif
prowseed
Cytat(Lookdem @ 24.01.2012, 00:57:38 ) *
Kombinowałem z tym, jednak dopiero zaczynam z PHP i nie wiem w jakich miejscach trzeba to ustawić. Proszę o pomoc i krótkie uzasadnienie czemu właśnie tak.


W nagłówku wiadomości, bo tak jest napisane w manual'u.
Lookdem
Cytat(prowseed @ 24.01.2012, 01:43:25 ) *
W nagłówku wiadomości, bo tak jest napisane w manual'u.


Przeglądałem wcześniej manual'a i próbowałem dodać coś takiego :
  1. $headers .= "Content-type: text/plain; charset=utf-8\r\n";
  2. $headers .="Content-Transfer-Encoding: 8bit";


Jedno z rozwiązań podanych w komentarzach. Jednak to nie pomogło, jakieś sugestie ? Może źle interpretuje czym jest nagłówek wiadomości.

Pozdrawiam
pianta_d
Ja mam tak

  1. Content-Type: text/plain; charset=\"utf-8\"


Strona, na której znajduje się formularz, kodowana w utf-8

działa


Pozdrawiam
Lookdem
Cytat(pianta_d @ 24.01.2012, 12:11:35 ) *
Ja mam tak

  1. Content-Type: text/plain; charset=\"utf-8\"


Strona, na której znajduje się formularz, kodowana w utf-8

działa


Pozdrawiam


Mógłyś napisać w którym miejscu to wstawić, żebym był pewien ? Próbowałem tyle wersji, że już się pogubiłem.
PS - Kodowanie strony oczywiście ustawione na utf-8, błędy wyświetlają się poprawnie z polskimi znakami.

Pozdrawiam
pianta_d
Przed wyświetleniem treści wiadomości


  1. // Nagłówki
  2. $naglowki = "From: $email\n";
  3. $naglowki .= "MIME-Version: 1.0\n";
  4. $naglowki .= "Content-Type: multipart/mixed;\n";
  5. $naglowki .= "\tboundary=\"___$znacznik==\"";
  6.  
  7.  
  8. // Treść listu
  9. $tresclistu="--___$znacznik==\n";
  10. $tresclistu .="Content-Type: text/plain; charset=\"utf-8\"\n";
  11. $tresclistu .="Content-Transfer-Encoding: 8bit\n";
  12. $tresclistu .="\n$formularz\n";
Lookdem
W moim przypadku będzie to ?
  1. $messageproper ="Content-Type: text/plain; charset=\"utf-8\"\n".
  2.  
  3. "Name: " .
  4.  
  5. ucwords($_POST['name']) .
  6.  
  7. "\n" .
  8.  
  9. "Email: " .
  10.  
  11. ucwords($email) .
  12.  
  13. "\n" .
  14.  
  15. "Comments: " .
  16.  
  17. $_POST['message'] .
  18.  
  19. "\n" .
  20.  
  21. "\n\n" ;
  22.  
pianta_d
Pokaż cały plik ORYGINALNY ...
Lookdem
Proszę, oryginalny przed zmianami :
  1. <?
  2.  
  3. $mailto = "moj@mail";
  4. $cc = "";
  5. $bcc = "";
  6. $subject = "Temat";
  7. $vname = "Formularz kontaktowy";
  8.  
  9.  
  10.  
  11.  
  12. $email = $_POST['email'];
  13.  
  14.  
  15. function validateEmail($email)
  16.  
  17. {
  18.  
  19. if(eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,3})?(\.[a-zA-Z]{2,3})?$', $email))
  20.  
  21. return true;
  22.  
  23. else
  24.  
  25. return false;
  26.  
  27. }
  28.  
  29.  
  30.  
  31.  
  32.  
  33. if(strlen($_POST['name']) < 1 || strlen($_POST['message']) < 1 || validateEmail($email) == FALSE)
  34.  
  35. {
  36.  
  37. $emailerror = 'Błędy:';
  38.  
  39.  
  40.  
  41. if(empty($_POST['name']))
  42.  
  43. {
  44.  
  45. $emailerror .= '<li>Podaj imię i nazwisko.</li>';
  46.  
  47. }
  48.  
  49.  
  50.  
  51. if(validateEmail($email) == FALSE)
  52.  
  53. {
  54.  
  55. $emailerror .= '<li>Podaj prawidłowy adres email</li>';
  56.  
  57. }
  58.  
  59.  
  60.  
  61. if(empty($_POST['message']))
  62.  
  63. {
  64.  
  65. $emailerror .= '<li>Wpisz treść wiadomości.</li>';
  66.  
  67. }
  68.  
  69. }
  70.  
  71. else
  72.  
  73. {
  74.  
  75. $emailerror .= "Twoja wiadomość została wysłana.";
  76.  
  77.  
  78.  
  79. // NOW SEND THE ENQUIRY
  80.  
  81. $timestamp = date("F j, Y, g:ia");
  82.  
  83.  
  84.  
  85. $messageproper ="\n\n" .
  86.  
  87. "Name: " .
  88.  
  89. ucwords($_POST['name']) .
  90.  
  91. "\n" .
  92.  
  93. "Email: " .
  94.  
  95. ucwords($email) .
  96.  
  97. "\n" .
  98.  
  99. "Comments: " .
  100.  
  101. $_POST['message'] .
  102.  
  103. "\n" .
  104.  
  105. "\n\n" ;
  106.  
  107.  
  108.  
  109. $messageproper = trim(stripslashes($messageproper));
  110.  
  111. mail($mailto, $subject, $messageproper, "From: \"$vname\" <".$_POST['e_mail'].">\nReply-To: \"".ucwords($_POST['first_name'])."\" <".$_POST['e_mail'].">\nX-Mailer: PHP/" . phpversion() );
  112.  
  113. }
  114.  
  115. ?>
  116.  
  117.  
  118.  
  119. <div id='emailerror'>
  120.  
  121. <ul>
  122.  
  123. <? echo $emailerror; ?>
  124.  
  125. </ul>
  126.  
  127. </div>
pianta_d
Ale nie masz pl znaków w odebranym e-mailu questionmark.gif
Lookdem
Niestety nie treść maila wygląda coś takiego :
Comments: To jest tre���� zam��wnia.
Sprawdzałem na dwóch skrzynkach pocztowych.
miniol
Plik z kodem php musi być zakodowany w UTF-8!

Kodowanie możesz zmienić np w notepad++
prowseed
  1. "From: \"$vname\" <".$_POST['e_mail'].">\nReply-To: \"".ucwords($_POST['first_name'])."\" <".$_POST['e_mail'].">\nX-Mailer: PHP/" . phpversion()


to jest Twoj naglowek, tam musisz dopisac. Nic Ci nie da dopsianei zmiennej headers skoro z niej nie korzystasz.
pianta_d
Bądź przed treścią listu. Ja mam tak

  1. // Nagłówki
  2. $naglowki = "From: $email\n";
  3. $naglowki .= "MIME-Version: 1.0\n";
  4. $naglowki .= "Content-Type: multipart/mixed;\n";
  5. $naglowki .= "\tboundary=\"___$znacznik==\"";
  6.  
  7.  
  8. // Treść listu
  9. $tresclistu="--___$znacznik==\n";
  10. $tresclistu .="Content-Type: text/plain; charset=\"utf-8\"\n";
  11. $tresclistu .="Content-Transfer-Encoding: 8bit\n";
  12. $tresclistu .="\n$zformularza\n";
  13.  
  14. // Załącznik
  15. $nazwa_tymczasowa = $_FILES["plik1"]["tmp_name"];
  16. $nazwa_pliku = $_FILES["plik1"]["name"];
  17.  
  18. if (is_uploaded_file($nazwa_tymczasowa))
  19. {
  20. $tresclistu .="--___$znacznik==\n";
  21. $tresclistu .="Content-Type: image/jpg\n";
  22. $tresclistu .="Content-Disposition: attachment;\n";
  23. $tresclistu .=" filename=\"$nazwa_pliku\"\n";
  24. $tresclistu .="Content-Transfer-Encoding: base64\n\n";
  25. $f = fopen($nazwa_tymczasowa, "rb");
  26. $dane = fread($f,filesize($nazwa_tymczasowa));
  27. fclose($f);
  28. $tresclistu .= chunk_split(base64_encode($dane));
  29. $tresclistu .="--___$znacznik==--\n";
  30. }
  31.  
  32. // wysłanie listu
  33. if (mail($odbiorca,$tytul,$tresclistu,$naglowki))
  34. {
  35. print "".$message."";
  36.  
  37. }
  38. else
  39. {
  40. print "".$error."";
  41. }
  42. }
Lookdem
miniol
Plik php oczywiście mam zakodowany, korzystam z kED wink.gif

prowseed

Wcześniej właśnie próbowałem tak:
  1. From: \"$vname\" <".$_POST['e_mail'].">\nReply-To: \"".ucwords($_POST['first_name'])."\" <".$_POST['e_mail']."Content-type: text/plain; charset=utf-8".">\nX-Mailer: PHP/" . phpversion() );


Jednak "krzaczki" dalej zostały, a do treści maila dopisywał się tekst w stylu :

>
X-Mailer: PHP/4.3.9

Content-type: text/plain; charset=utf-8
Name: Jan Kowalski
...
prowseed
Bo źle dopisujesz.
Skomentuj sobie funkcje mail tak by sie nie wysylala i wyprintuj na ekranie ten kawalek, ktory napiasles wczesniej i sprawdz co sie wyswietli- bedziesz wiedzial gdzie robisz blad.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.