Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Odczytywanie maila przez stronę www, różne kodowania - różne efekty
niewiemjak
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 28.01.2015

Ostrzeżenie: (0%)
-----


Witam, stronę mam w UTF-8 - ok - nie mam innej opcji (chyba, że ktoś podsunie coś, ale póki co wiem, że zmiana tego kodowania niewiele zmieni)
piszę aplikację sprawdzającą jedną skrzynkę mailową... kodowania przychodzące na tą skrzynkę mogą być różne - najczęściej iso-8859-2 lub utf-8, rzadziej windowsowe (ale też mogą się zdarzyć i muszę to jakoś obsłużyć)
Nagłówki mam traficzne:
od: =?UTF-8?Q?Znaczki:_=C5=84 ?= temat: =?UTF-8?B?SmFrYcWbIHRyZcWbxIc=?=
od: =?iso-8859-2?Q?Znaczki=F1?= temat: =?iso-8859-2?B?dGVzdCBQb2xza2ljaCB6bmFjemvzdzogoabG0aPKILG25vGz6g==?=
Pytanie - jak to poprawnie wyświetlić?

Droga najdłuższa - wyciągać kodowanie i w zależności od kodowania zamieniać na PL znaki (co jednak jak pojawią się inne znaczki - w mailach mogą pojawić się też znaki diakrytyczne z innych języków - więc problem rozwiązany połowicznie i bardzo długo)...
(np explode('?',$subj) - i wyświetlić tylko $subj[3] - kodowanie $subj[1] i przelecieć tekst str_replace - długa operacja - analogicznie $from)

jest jakiś prostszy sposób?

Mój kod:
  1. if ($hdr = imap_check($mbox)) {
  2. echo "Num Messages " . $hdr->Nmsgs ."\n\n<br><br>";
  3. $msgCount = $hdr->Nmsgs;
  4. } else {
  5. echo "failed";
  6. }
  7. $MN=$msgCount;
  8. $overview=imap_fetch_overview($mbox,"1:$MN",0);
  9. $size=sizeof($overview);
  10.  
  11. echo "<table border=\"0\" cellspacing=\"0\" width=\"100%\">";
  12. $a=$size;
  13. for($i=$size-1;$i>=0;$i--){
  14.  
  15. $val=$overview[$i];
  16. $msg=$val->msgno;
  17. $from=$val->from;
  18. $date=$val->date;
  19. $subj=$val->subject;
  20. $seen=$val->seen;
  21.  
  22. // $from = ereg_replace("\"","",$from);
  23.  
  24. // MAKE DANISH DATE DISPLAY
  25. list($dayName,$day,$month,$year,$time) = split(" ",$date);
  26. $time = substr($time,0,5);
  27. $date = $day ." ". $month ." ". $year . " ". $time;
  28.  
  29. if ($bgColor == "#F0F0F0") {
  30. $bgColor = "#FFFFFF";
  31. } else {
  32. $bgColor = "#F0F0F0";
  33. }
  34.  
  35. if (strlen($subj) > 100) {
  36. $subj = substr($subj,0,99) ."...";
  37. }
  38. if (strlen($subj) == 0) {
  39. $subj = "Brak tematu";
  40. }
  41.  
  42. echo "<tr bgcolor=\"$bgColor\"><td colspan=\"2\">$from</td><td colspan=\"2\"><A HREF='mail.php?msgno=$a'>$subj</a></td>
  43. <td class=\"tblContent\" colspan=\"2\">$date</td></tr>\n";
  44. $a--;
  45. }
  46. echo "</table>";

Odbieranie pojedynczej wiadomości:
w pierwszej chwili myślałam o czymś takim

$msgBody = iconv("ISO-8859-2","UTF-8",$msgBody);

Ale to nie rozwiązuje problemów, jeśli już to

$msgBody = iconv("$wyciagnieteKodowanie","UTF-8",$msgBody);

Pytanie czy się da i czy ma to sens?


  1. function get_mime_type(&$structure) {
  2. $primary_mime_type = array("TEXT", "MULTIPART","MESSAGE", "APPLICATION", "AUDIO","IMAGE", "VIDEO", "OTHER");
  3. if($structure->subtype) {
  4. return $primary_mime_type[(int) $structure->type] . '/' .$structure->subtype;
  5. }
  6. return "TEXT/PLAIN";
  7. }
  8. function get_part($stream, $msg_number, $mime_type, $structure = false,$part_number = false) {
  9.  
  10. if(!$structure) {
  11. $structure = imap_fetchstructure($stream, $msg_number);
  12. }
  13. if($structure) {
  14. if($mime_type == get_mime_type($structure)) {
  15. if(!$part_number) {
  16. $part_number = "1";
  17. }
  18. $text = imap_fetchbody($stream, $msg_number, $part_number);
  19. if($structure->encoding == 3) {
  20. return imap_base64($text);
  21. } else if($structure->encoding == 4) {
  22. return imap_qprint($text);
  23. } else {
  24. return $text;
  25. }
  26. }
  27.  
  28. if($structure->type == 1){
  29. while(list($index, $sub_structure) = each($structure->parts)) {
  30. if($part_number) {
  31. $prefix = $part_number . '.';
  32. }
  33. $data = get_part($stream, $msg_number, $mime_type, $sub_structure,$prefix . ($index + 1));
  34. if($data) {
  35. return $data;
  36. }
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42.  
  43. $msgno=$_GET['msgno'];
  44. $dataTxt = get_part($mbox, $msgno, "TEXT/PLAIN");
  45. $dataHtml = get_part($mbox, $msgno, "TEXT/HTML");
  46.  
  47. if ($dataHtml != "") {
  48. $msgBody = $dataHtml;
  49. $mailformat = "html";
  50. } else {
  51. $msgBody = ereg_replace("\n","<br>",$dataTxt);
  52. $mailformat = "text";
  53. }
  54.  
  55. if ($mailformat == "text") {
  56. echo "<html><head><title>Messagebody</title></head><body bgcolor=\"white\">$msgBody</body></html>";
  57. } else {
  58. echo $msgBody;
  59. }
  60. function transformHTML($str) {
  61. if ((strpos($str,"<HTML") < 0) || (strpos($str,"<html") < 0)) {
  62. $makeHeader = "";
  63. if ((strpos($str,"<BODY") < 0) || (strpos($str,"<body") < 0)) {
  64. $makeBody = "\n<body>\n";
  65. $str = $makeHeader . $makeBody . $str ."\n</body></html>";
  66. } else {
  67. $str = $makeHeader . $str ."\n</html>";
  68. }
  69. } else {
  70. $str = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\">\n". $str;
  71. }
  72. return $str;
  73. }
  74.  
  75. if ($dataHtml != "") {
  76. $msgBody = transformHTML($dataHtml);
  77. } else {
  78. $msgBody = ereg_replace("\n","<br>",$dataTxt);
  79. $msgBody = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i","$1http://$2", $msgBody);
  80. $msgBody = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<A TARGET=\"_blank\" HREF=\"$1\">$1</A>", $msgBody);
  81. $msgBody = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$msgBody);
  82. }


Dzięki za porady
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


Troszku się zagalopowałeś smile.gif Nie ma sensu wymyślać koła na nowo, i Twoje "problemy" nie istnieją lub zostały już rozwiązane.

Ściągnij sobie gotowca np. http://squirrelmail.org/ przeanalizuj kod, i dopiero wtedy zacznij pisać coś własnego smile.gif
Go to the top of the page
+Quote Post
niewiemjak
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 28.01.2015

Ostrzeżenie: (0%)
-----


Dzięki... mam nadzieje ze łatwo da się wyłączyć możliwość tworzenia nowych wiadomości, zarządzanie wiadomościami etc i na stałe zdefiniować 'zalogowane' konto..
z doświadczenia w sumie - łatwiej coś usunąć niż dodać ;-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 09:52