Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: funkcje imap_, a kwestia polska
Forum PHP.pl > Forum > PHP
kamilus
Mam następujący problem:
Napisałem już zaczątki klienta pocztowego w php. W założeniach ma być on prosty (na zaliczenie na studiach - potem będę go już sam rozbudowywał...), ale przede wszystkim musi odczytywać maile z polskimi krzaczkami.
Tutaj pojawia się problem.

Jako temat potrafi pojawić mi się coś takiego: =?iso-8859-2?Q?=B6=E6=B1ga?=
Nagłówek tego maila to(kocówka):
Kod
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain;
        charset="iso-8859-2"

śćąę


W zawartości są trzy znaczki: śćąę (zaraz po nagłówku widać)
Treść maila mi się wcale nie wyświetla...

Drugi mail to forward długiego tekstu (kilka maili) z gmaila
Nagłówek:
Kod
MIME-Version: 1.0
Content-Type: multipart/alternative;
        boundary="----=_Part_22559_5178235.1137717208644"
References: <d51319490601121346g3ad0851bn@mail.gmail.com>
         <3069c60b0601140217j473fe9b2u@mail.gmail.com>
         <d51319490601140509r75e9cdc5h@mail.gmail.com>

------=_Part_22559_5178235.1137717208644
Content-Type: text/plain; charset=ISO-8859-13
Content-Transfer-Encoding: base64
Content-Disposition: inline

Dalej oczywiście tekst zakodowany base64.

W treści wyświetlanej zaś pojawia mi się coś takiego:
Cytat
No to nie wiem czy rozpoczŕă mejla od końca czy teý poczŕtku. Ludzie zazwyczaj zaczynajŕ od poczŕtku - ja wićc bćdć jak zwykle przekorny i rozpocznć od końca haha.gif.


Moje pytania - jak przekonwertować temat i treśćtak, aby wyświetlane były poprawnie?
Wcześniej walczyłem z kwestią załączników - w końcu metodą prób i błędów uporałem się z tym. Teraz sen z powiek spędza mi właśnie ta konwersja. Podejrzewam także, iż gdy tylko zacznę pisać moduł do wysyłania maili to pojawi się kwestia odwrotna...

Dla zainteresowanych skrypt obejrzeć można tutaj http://www.tczewskie.pl/poczta (trzeba być zalogowanym - skrypt ma obsługiwać maile użytkowników serwera).

Z góry dziękuję wszystkim za pomoc smile.gif

Dopisane po chwili:
Dla testów wysłałem czystego maila z plskimi krzaczkami z gmaila.
Nagłówek:
Kod
Subject: =?ISO-8859-2?Q?testowy_=B6ci=B1gacz_=3DP?=
MIME-Version: 1.0
Content-Type: multipart/alternative;
        boundary="----=_Part_23263_19163984.1137720585949"

------=_Part_23263_19163984.1137720585949
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: base64
Content-Disposition: inline


Dla odmiany ten mail wyświetla się od razu prawidłowo (trzeba tylko temat odkodować)...
DzikiLis
Na początek zainteresuj się funkcjami imap_, szczególnie 8bit - komentarze.
Usuń znak '=', przelicz B6 na system dziesiętny (182) i skorzystaj z funkcji chr().

Problem jest jednak bardziej złożony. Idealny klient pocztowy powinien wyświetlić poprawnie wszystkie znaczki/krzaczki. Dlatego proponuję zastosować kodowanie UTF-8 i wszystkie przychodzące maile przed wyświetleniem konwertować z kodowania wskazanego w nagłówku maila właśnie do UTF-8.

Przy wysyłce konwertujesz z UTF-8 do domyślnego/wskazanego przez użytkownika kodowania.

Tutaj przyda się funkcja iconv(). Możesz też poszukać w necie (chociażby w komentarzach php.net) funkcji konwertujących z różnych kodowań do UTF-a i zrobić sobie własną funkcję. Będzie się czym pochwalić na zaliczeniu. smile.gif
kamilus
Konwertować na UTF-8 to akurat potrafię.
Problem polega na tym jak sprawdzić jakie jest kodowanie w danym akurat momencie? W temacie maila bowiem obecnie pojawia się np. ISO-8859- - to jeszcze bym przetrawił wyrażeniami regularnymi (szczerze jest to moja pięta acillesowa - nie znoszę wyrażeń regularnych - zawsze się w nich gubię - a po dziś dzień nie znalazłem do nich dokumentacji przyswajalnej dla takiego młotka jak ja)...
Jednak co jeśli ktoś wyśle maila w innym kodowaniu - np. CYR lub koreańskie krzaczki? Miałem nadzieję, iż istnieje coś gotowego do wykrywania "co to przyszło" winksmiley.jpg
Usuwanie = i przeliczanie na dziesiętny - dzięki - przyda się ten sposób - szkoda tylko, że będę musiał eregi_replace stosować, które spowolni działanie skryptu sad.gif (naprawdę nie potrafię zrozumieć składni wyrażeń regularnych sad.gif )...
Jak w prosty sposób wyciągnąć z wiadomości to w jakim systemie kodowania mail przyleciał? Rozbiłem tablicę i structure i headers i tam takowej informacji nie widzę. Zastanawiam się jak bezboleśnie wyciągnąć wartości content-type?
Obiekt structure->content->type zwraca bowiem samo text/plain czy jakikolwiek inny - nie zwraca natomiast informacji o kodowaniu znaków sad.gif
Eh - zostawiłem sobie klient pocztowy na sam koniec (jutro mam zaliczenie) i mam teraz poważny problem... A myślałem, że to załączniki będą największym. Przeglądałem kod UebiMiau - ale on ma swoje własne mechanizmy, które zupełnie inaczej wyciągają nagłówki wiadomości niźli funkcje imap_ z php...

Teraz zaś zajmuję się optymalizacją phpBB - droga przez mękę tongue.gif
mike
Obaj powinniście naprawdę poczytać manuala.
Wszystko załatwiają dwie funkcje: imap_mime_header_decode() i iconv()
Pierwsza z nich powie Ci w jakim kodowaniu jest fragment nagłówka, a z tą informacją pójdziesz do drugiej z nich i zmienisz kodowanie na jakie chcesz.

I po sprawie winksmiley.jpg
kamilus
Wielkie dzięki smile.gif
Może to wina zmęczenia - po prostu tej funkcji nie znalazłem...
Kombinowałem z mb_decode_mimeheader()

Co się okazało - jeden z maili, które teraz nadal źle się wyświetla źle wyświetlany jest również przez UebiMiau... A więc to już chyba nie moja wina smile.gif
Na zaliczenie powinno starczyć - potem będę próbować rozbudować skrypt.

notabene - iconv nie był po dekodowaniu wymagany winksmiley.jpg

Jeszcze raz wielce dziękuję.
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.