Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Odczytywanie maila przez stronę www
Forum PHP.pl > Forum > PHP
niewiemjak
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
CuteOne
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
niewiemjak
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ć ;-)
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.