Datakent Ana Sayfa
Anasayfa Anasayfa > Diğer bölümler > C# & ASP.NET
  Aktif Konular Aktif Konular RSS: .net veya java ortamında POP3 Mail okumak
  Yardım Yardım  Hızlı Ara   Kayıt Ol Kayıt Ol  Giriş Giriş

.net veya java ortamında POP3 Mail okumak

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
aziz.alkurt Açılır Menü Göster
Admin Group
Admin Group
Simge

Kayıt Tarihi: 27.Ocak.2012
Bulundugu Yer: TRABZON
Online: Sitede Değil
Gönderilenler: 26
  Alıntı aziz.alkurt Alıntı  Yanıt YazCevapla Mesajın Direkt Linki 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.
Yukarı Dön
murat turan Açılır Menü Göster
Admin Group
Admin Group
Simge
Datakent

Kayıt Tarihi: 01.Ekim.2003
Bulundugu Yer: Turkey
Online: Sitede Değil
Gönderilenler: 1767
  Alıntı murat turan Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 02.Subat.2012 Saat 19:01
:) aziz iyi paylaşım olmuş.
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Menü Göster



Bu Sayfa 0,141 Saniyede Yüklendi. [power by : WebWiz]