![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 18.09.2004 Skąd: Tczew Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 ![]() 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ć)... Ten post edytował kamilus 20.01.2006, 02:32:52 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 16.12.2005 Skąd: Warszawa, Kabaty Ostrzeżenie: (0%) ![]() ![]() |
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. ![]() |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 18.09.2004 Skąd: Tczew Ostrzeżenie: (0%) ![]() ![]() |
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" ![]() 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 ![]() ![]() 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 ![]() 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ę ![]() |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 18.09.2004 Skąd: Tczew Ostrzeżenie: (0%) ![]() ![]() |
Wielkie dzięki
![]() 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 ![]() Na zaliczenie powinno starczyć - potem będę próbować rozbudować skrypt. notabene - iconv nie był po dekodowaniu wymagany ![]() Jeszcze raz wielce dziękuję. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.07.2025 - 15:55 |