.net veya java ortamında POP3 Mail okumak |
Yanıt Yaz |
Yazar | |
aziz.alkurt
Admin Group Kayıt Tarihi: 27.Ocak.2012 Bulundugu Yer: FETHİYE Online: Sitede Değil Gönderilenler: 26 |
Alıntı Cevapla
Konu: .net veya java ortamında POP3 Mail okumak Gönderim Zamanı: 28.Ocak.2012 Saat 01:21 |
Öncelikle POP3 nedir,format yapıları nasıldır?
POP3 Internet Engineering Task Force üzerinide Request For Comment -1081 da resmi olarak protokol dahilinde tanımlıdır. (http://tools.ietf.org/html/rfc1081 AYRINTILI BİLGİ) Bu konu üzerinde uğraştıysanız "RETR 1" komutunun anlamını biliyorsunuzdur. MailServerinde bu komuta vereceği cevap (ilk line dışında --> +OK..... veya -ER.....)(tabi bu +OK ile bşlarsa) son line nında ".\r\n" gibi bittiğinide dikkate aldınız. Eger Stream Reader kullanıyorsanız kullanmamanızı tavsiye ederim. Neden ? Çünkü streamReader sizden Encoding tipi isteyecek, zaten default olarak ASCII gelir. Bunun dışında UTF-8 gibi encoding seçerseniz, uyumsuzluk yaşayacağınız garantidir. Kısaca ilk adımda Exception'a yakalanırsınız. bunun yerine stream.ReadByte() fonksiyonunu kullanıp gelen baytları dinamik genişleyebilecek bir ortama(Linked List gibi) atabilirseniz, Zaten header bölümleri ASCII encoding. Ordan body kısmının charset elementinin değerini alıp body kısmınıda ona göre encoding yapmanız gerekmektedir. Peki bu şekilde yapmassak sonuç olarak ne olur? Body kısmı "Merhaba Ben body kısmıyım" olsun sreamreader kullanırsanız byte kaybına uğrayarak "Merhaba Ben body k?sm?y?m" cevabı alırdınz. Dahada düzeltemessiniz. Header kısmı zaten ASCII standardına uymak zorundadır. Orada bir problem yaşanmaz. (Biliryorsunuz ASCII 7 bit olduğu için ç,ş,ü,.. gibi türkçe karakter içermez) Peki Mail konu kısmında (Mail formatında Headers-Subject) türkçe özel karakter kullandım bu ASCII de nasıl encoding yapılıyor. Söylediğim gibi Header bölümleri ASCII encoding olmalıdır. Bu gibi özel durumlar için geliştirilen yöntemler Quoted Printable veya Base 64 tür Mail için RAWDATA olarak atığınızda headers kısmının value bölümlerde (atıyorum subject headerinde) 3 farklı formatla karşılaşırsınız. 1. ihtimal düz ASCII formatı. (Eğer konu kısmı ascii karakterlerin dışına çıkmamışsa bu tercih edilir.) 2. ihtimal Quoted Printable örnek olarak konu "Merhaba Dünya" (ü özel karakter) olsun karşılaşağınız tablo şudur. "Subject: =?utf-8?Q?Merhaba_D=C3=BCnya?=" Bunun converti şu şekilde yapılır. Format olarak üç bölümdür. =? ile başlar ?= biter ve ayıraç olarak '?' kullanır. şimdi elimizde üç tane string var bunlar utf-8,Q, Merhaba_D=C3=BCnya?= birinci string yani "utf-8" encoding tipidir. ikinci string (bu aslında char olmak zorundadır) 'Q' Quoted Printable tipi oduğunu gösterir. Şimdi biz bunun Quoted Printable oduğunu öğrendik. 1. Adım Quoted Printable kurallarında '_' ile ' ' replace yapılır. "Merhaba_D=C3=BCnya" -> "Merhaba D=C3=BCnya" oldu 2. Adım '=' ile başlayan sonraki iki karakterin byte olduğunu gösterir. Text imiz içinde =C3 ve =BC var bunlar byte dilinde 0xC3 ve 0xBC karakterleridir. örneğin "string txt=Encoding.UTF8.getString(new []byte{0xC3, 0xBC} );" yaparsak txt değerinin 'ü' değerini aldığını görürüz. (Encodingte utf-8 kullanmamın sebebi o üç stringten ilkinin utf-8 olmasıdır.) Böylece textimiz "Merhaba Dünya" oldu. Encoding i dinamik nasıl seçeriz. Encoding.getEncodig("utf-8") gibi charseti içine yazarak İlgilenenler için söylüyorum. Burada dikkat edilmesi gereken hususlar var. Özellikle yahoo dan gelen maillerde karakter kodlaması için kullanılan encoding texti olarak charset="cp1254" geliyor. Microsoft buna gıcıklık olması için .net platformunda "cp1254" tipini tanımıyor. Bu zaten microsoft'un kendi kendine almış olduğu "cp1254" diye birşey yok "windows-1254" diye bişey var düşüncesinden kaynaklanıyor. Sırf bu yüzden encoding textini yazmak için koşul koymak zorunda kalıyoz.StartWith("cp") ise replace("cp","windows-") gibi. Tabi bu anlattığım en basit özenek şöylede olabilir. Bunuda tabi bu prensibi kullanarak çözersiniz. "Subject: Merhaba_D=?utf-8?Q?=C3=BC?=nya" da gelebilir. Hatta çoklu encoding tipi olarakta gelebilir. sözcük içinde "=?...?=" prensibi bir tane olacak diye kayide yok. onun dışında dipnot. utf-8 16 bit yani 2 byte alan kullanırken "windows-1254" tek alan kullnıyor. Onuda sizin belirlemeniz gerekmektedir. Mesela atıyorum "Subject: =?utf-8?Q?Merhaba_D=F3nya?=" gibi F3 ü salladım 3. İlhtimal Base64 Buda Quated Printeble gibi "Subject: =?utf-8?B?YTM0NZomIzI2OTsmIzM0NTueYQ==?=" burada aldığımız üç değer yani utf-8,B ve YTM0NZomIzI2OTsmIzM0NTueYQ== Diyorki 'utf-8' encoding kullanarak 'B' Base64 ten 'YTM0NZomIzI2OTsmIzM0NTueYQ==' stringi çevir. Quated Printable ye göre daha basittir. En azından byte larla uğraşmıyorsun. |
|
murat turan
Üye Profili
Özel Mesaj Yolla
Bu kullanıcıya ait mesajları bul
Üyenin Web Sitesie Git
Arkadaş Listeme Ekle
Admin Group Datakent Kayıt Tarihi: 01.Ekim.2003 Bulundugu Yer: Turkey Online: Sitede Değil Gönderilenler: 1798 |
Alıntı Cevapla Gönderim Zamanı: 02.Subat.2012 Saat 19:01 |
:) aziz iyi paylaşım olmuş.
|
|
Yanıt Yaz |
Forum Atla | Forum İzinleri Kapalı Foruma Yeni Konu Gönderme Kapalı Forumdaki Konulara Cevap Yazma Kapalı Forumda Cevapları Silme Kapalı Forumdaki Cevapları Düzenleme Kapalı Forumda Anket Açma Kapalı Forumda Anketlerde Oy Kullanma |