E-Posta Kontrolü

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

E-Posta Kontrolü

Mesaj gönderen SimaWB »

Gmail, Yahoo, Yandex Mail yada Hotmail(Outlook) e-posta adreslerini periyodik olarak kontrol etmek için kullandığım kodların bir kısmını burada paylaşıp, açıklamaya çalışacağım. Umarım birilerinin işine yarar :)
Burada "kontrol"den kastım: e-posta sunucusunun Inbox klasöründe kaç e-posta var ve bunlardan kaç tanesi okunmamış. (Kısacası okunmamış e-postamız var mı onu kontrol ediyoruz :D )

Baştan belirteyim Delphi XE kullandım ve diğer versiyonlarda kontrol etmedim. Fakat sıkıntı olacağını zannetmiyorum.

Bilindiği üzere, e-posta servisleri farklı uygulamalardan e-postalarımızı kontrol edebilmemiz için IMAP protokolünü destekler. Biz de e-postalarımızı kontrol etmek için bunu kullanacağız. Elbette bu tarz kontrol işlemleri genelde arka planda çalıştırılmak istenecektir. Dolayısıyla Thread kullanmak kaçınılmaz.

Delphi ile birlikte gelen Indy bileşen kütüphanesi de kullanılabilir ama ben her zamanki gibi Synapse'yi kullanacağım. (Network işlemlerimde, Indy'e göre çok daha az sistem kaynağı tükettiği için ve kontrolün mümkün olduğunca bende olmasını istediğim için Indy kullanmaktan mümkün olduğunca kaçınır ve Synapse kullanırım)

Öncelikle desteklediğimiz IMAP sunucuları tanımlayalım

Kod: Tümünü seç

type
  TImapServer = (Gmail, Yahoo, Hotmail, Yandex); 
Bu sunucu tiplerinden IMAP Server adresini(linkini) döndürebileceğimiz bir başka tipe ihtiyacımız olacak:

Kod: Tümünü seç

TServerLink: array[TImapServer] of string = ( // Her serverın host adresi
    'imap.gmail.com',
    'imap.mail.yahoo.com',
    'imap-mail.outlook.com',
    'imap.yandex.com'
  );
E-posta üyelik bilgilerimizi tutmak için basit bir record tanımlayalım:

Kod: Tümünü seç

TAccount = record
  Password: string;
  UserName: string;
  Server: TImapServer;
end;
Bu TAccount tipiniz e-posta kontrolü yapacak thread'le haberleşmede kullanacağız.

Gelelim Thread'imize:
Thread'de kontrol işlemi tamamlandığında geri bildirim alabilmemiz için bir tip tanımlayalım. Eğer birden fazla sunucuyu kontrol etmek istersek Thread'ten dönen sonucun hangi e-posta adresimiz için olduğunu anlayabilmek adına bu dönüş tipine TAccount sınıfını da ekledim. Tabiki asıl amacımız olan mail sayısı ve okunmamış mail sayısı da bu tip içinde mevcut:

Kod: Tümünü seç

type
  TOnCompleted = procedure(MailAccount: TAccount; MailCount, UnreadMailCount: integer) of object;
Bir de kontrol aşamasında herhangi bir sorunla karşılaşıldığında geri bildirim için tip tanımlamalıyız:

Kod: Tümünü seç

TOnError = procedure(MailAccount: TAccount) of object;
Ben şimdilik bunu sadece Login başarılı değilse kullanacağım. Ama isteyen farklı hatalar yakalamak için de kullanabilir.

Yukarıda bahsettiğim Synapse kütüphanesi IMAP desteği için bize bir sınıf zaten hazırlamış durumda: TIMAPSend. Bu sınıf imapsend.pas uniti içindedir. Ayrıca SSL desteği de mevcuttur.

Aslında belki de açıklamaya bile gerek olmayan Thread unitimiz şu şekilde:

Kod: Tümünü seç

uses
  Classes, SysUtils, imapsend, ssl_openssl, uAccount;

type
  TOnCompleted = procedure(MailAccount: TAccount; MailCount, UnreadMailCount: integer) of object;
  TOnError = procedure(MailAccount: TAccount) of object;

  TImapThread = class(TThread)
  private
    IMAP: TIMAPSend;
    FAccount: TAccount;
    FMailCount, FUnreadCount: integer;
    FOnCompleted: TOnCompleted;
    FOnError: TOnError;
  protected
    procedure Execute; override;
  public
    constructor Create(AccountInfo: TAccount);
    destructor Destroy; override;

    property OnCompleted: TOnCompleted read FOnCompleted write FOnCompleted;
    property OnError: TOnError read FOnError write FOnError;
  end;

implementation

{ TImapThread }

constructor TImapThread.Create(AccountInfo: TAccount);
begin
  FAccount := AccountInfo;
  FMailCount := 0;
  FUnreadCount := 0;

  FreeOnTerminate := True;
  inherited Create(True);
end;

destructor TImapThread.Destroy;
begin
  inherited Destroy;
end;

procedure TImapThread.Execute;
begin
  IMAP := TIMAPSend.Create;
  try
    Imap.TargetHost := TServerLink[FAccount.Server];
    Imap.TargetPort := 993;
    Imap.UserName := FAccount.UserName;
    Imap.Password := FAccount.Password;
    Imap.FullSSL := True;
    if Imap.Login then
    begin
      if Imap.SelectFolder('Inbox') then
      begin
        FMailCount := Imap.SelectedCount;  //Tüm maillerin sayısı
        FUnreadCount :=Imap.StatusFolder('Inbox', 'UNSEEN'); //Okunmamış mail sayısı
        if Assigned(FOnCompleted) then
          FOnCompleted(FAccount, FMailCount, FUnreadCount);
      end;
      Imap.Logout;
    end
    else if Assigned(FOnError) then
      FOnError(FAccount);
  finally
    IMAP.Free;
  end;
end;

end.
Görüldüğü gibi oldukça basit bir thread ile kontrolü sağlayabiliyoruz.
Dikkat edilmesi gerekenler: TIMAPSend için imapsend ve SSL desteği için ssl_openssl uniti ekledik. Ayrıca kullandığımız tüm sunucuların IMAP portları ortak ve 993 olduğu için bunu kodda direk kullandık. (Farklı portları desteklemek isteyenler TAccount tipine port ekleyip kullanabilirler).
Kodlardan görüleceği üzere e-posta kontrolü sağlanırsa OnCompleted olayı tetiklenecek. Login işlemi başarısız olduğu takdirde ise OnError olayı tetiklenecek.

Kullanıma örnek:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  MailAccount: TAccount;
begin
  MailAccount.Server := Gmail;
  MailAccount.UserName := 'velibozatli';
  MailAccount.Password := 'benimsifrem :)';
  with TImapThread.Create(MailAccount) do
  begin
    OnCompleted := ThreadCompleted;
    OnError := ThreadError;
    Start; //Sanırım eski versiyonlarda Resume
  end;
end;

procedure TForm1.ThreadCompleted(Account: TAccount;  MailCount,
  UnreadMailCount: integer);
begin
  Memo1.Lines.Add(Format('%s:   %d/%d', [Account.UserName, UnreadMailCount, MailCount]));
end;
Başta da söylediğim gibi; umarım birilerinin işine yarar :D
There's no place like 127.0.0.1
Kullanıcı avatarı
lazymule
Üye
Mesajlar: 127
Kayıt: 16 Eki 2006 04:03
İletişim:

Re: E-Posta Kontrolü

Mesaj gönderen lazymule »

Teşekkürler Hocam
Evrende Ulaşılamayacak Tepe Yoktur !!!!
Yeterki İnsan Ulaşmak İstesin !!!!
http://www.maxiteknik.com
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: E-Posta Kontrolü

Mesaj gönderen xozcanx »

Elinize Sağlık Hocam. :bravo:
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
kaan_karabey
Üye
Mesajlar: 107
Kayıt: 01 May 2013 05:30

Re: E-Posta Kontrolü

Mesaj gönderen kaan_karabey »

Hocam Ben UnreadMailCount Sayısını ShowMessage İle Değil Şöyle Göstermek İstiyorum. Örnek Olarak ;

WinExec('C:\Gmail\popup\popup.exe',SW_Show); Bunu Nasıl Programa Ekleyebilirim? Birde Her 2 dk da Bir Bunu Göstermesi İçin Ne Yapabilirim?

Not: Sayı Yerine Aslında Şöyle Birşey Gösterecek Nasıl Ekleme Yapabilirim?

Resim
Sevgiler Yalan Olmuş Yalan Sahtekar Bırakıpta Bir Gün Seni Gitmeyecek Mi?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: E-Posta Kontrolü

Mesaj gönderen mrmarman »

Senin projen arka planda çalışıyor olacak değil mi ? Bir form tasarla, üzerindeki görüntü bu örneğini verdiğin şekilde olsun. Formun yerini değiştirmekten başka bir şey değil...

Kod: Tümünü seç

procedure FormAnim( Form:TForm; aWidth, aHeight: Integer; Goster:Boolean );
Var
  c             : Cardinal;
  boolDongudeKal: Boolean;
begin
  Form.Width  := aWidth;
  Form.Height := aHeight;
  Form.Left   := Screen.DesktopWidth  - Form.Width;
  if Goster then Form.Top    := Screen.DesktopHeight - 30
            else Form.Top    := Screen.DesktopHeight - Form.Height - 30;
  boolDongudeKal := True;
  while boolDongudeKal do
  begin
    if Goster then begin
      Form.Top := Form.Top - ( Form.Height div 50 );
      if Form.Top <= Screen.DesktopHeight - Form.Height - 30
        then boolDongudeKal := False;
    end else begin
      Form.Top := Form.Top + ( Form.Height div 50 );
      if Form.Top > Screen.DesktopHeight
        then boolDongudeKal := False;
    end;

    c := gettickcount + 10;
    while c > GetTickCount do begin
      Application.ProcessMessages;
      Sleep(1);
    end;
  end;
end;
Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  l, t, w, h : Integer;
begin
  With Self do begin
    l := left;
    t := top;
    w := width;
    h := height;
  end;

  FormAnim( self, 300, 300, True ); // veya FALSE ile de denersin.

  With Self do begin
    left  := l;
    top   := t;
    width := w;
    height:= h;
  end;
end;
Resim
Resim ....Resim
kaan_karabey
Üye
Mesajlar: 107
Kayıt: 01 May 2013 05:30

Re: E-Posta Kontrolü

Mesaj gönderen kaan_karabey »

Hocam Ben de Zaten Var Hazır Olarak Sadece Kodda Bir Kaç Değişiklik Yapmak İstiyorum.

1. si WinExec ile O Programı Açmak ve Onda Göstermek

Programı İndirmek İçin

http://www.dosya.tc/server2/c9sk0l/popup.zip.html

2.si Bir Kaç Dakikada Bir Gösterme Taki Okunana Kadar Okununca Gösterme İşlemi Bitecek

3.sü Bu İşlemleri Arkaplanda Yapacak
En son kaan_karabey tarafından 09 Tem 2015 02:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Sevgiler Yalan Olmuş Yalan Sahtekar Bırakıpta Bir Gün Seni Gitmeyecek Mi?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: E-Posta Kontrolü

Mesaj gönderen mrmarman »

Merhaba.
- Bahsettiğim şey açık sanırım.
- Ayrıca küçük bir soru WinExec ile neden ikinci bir programa kendini mahkum edesin ki ? Hem sistemler bunu virüs saldırısı olarak da algılama potansiyeli var...
- Verdiğim örnekte olsun kendi örneğinda olsun bir timer koyacak ve sistem saatinden güdümleyerek zaman arılığını elde ettiğinde senin metodunla açıklamak gerekirse WinExec çalıştıracaksın hepsi bu.
Resim
Resim ....Resim
kaan_karabey
Üye
Mesajlar: 107
Kayıt: 01 May 2013 05:30

Re: E-Posta Kontrolü

Mesaj gönderen kaan_karabey »

Hocam Şu Kodu Ekledim Sizin Dediğiniz Gibi Yaptım Butonu Tıklayınca Çalışıyor.Butona Tıklamadan Form2 Direk Açıldığında Gösterme Durumumuz Yok mu? On Show ve On Create İle Denedim Olmadı ve O Animasyonu Yaptıktan Sonra Kapanmasını İstiyorum Timerla Tekrar Çağırdığımda da Gösterdikten Sonra Kapanmasını İstiyorum

Kod: Tümünü seç

if UnreadMailCount > 0 then
begin
Form2.Show;
btnCheck.Enabled := True;
end
else
begin
ShowMessage('Okunmamış Mail Yok');
end;
Arkaplanda Çalaışması ve Timer Olayını Nasıl Yapacam Anlamadım?

Hocam Sanırım Arkaplan Kodu da Şu:

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
   AlphaBlend := true; 
   AlphaBlendValue := 0; //255 e Kadar Değer Verebilirsiniz ve Saydamlığını Ayarlıyabilirsiniz. 
   ShowWindow(Application.Handle, SW_HIDE); 
   SetWindowLong(Application.Handle, GWL_EXSTYLE, 
   GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);    
   ShowWindow(Application.Handle, SW_SHOW);
end;
Sevgiler Yalan Olmuş Yalan Sahtekar Bırakıpta Bir Gün Seni Gitmeyecek Mi?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: E-Posta Kontrolü

Mesaj gönderen mrmarman »

Örnek içerisinde şuna dikkatini çekmek istiyorum.

Kod: Tümünü seç

c := gettickcount + 10;
    while c > GetTickCount do begin
      Application.ProcessMessages;
      Sleep(1);
    end;
GettickCount + 10 eklediğin 10 yerine 1000 eklersen 1 saniye bekler, 2000 eklersen 2 saniye. Mesajı göster, dilediğin kadar saniye beklet sonra mesajı gizle. Metod bu.
Resim
Resim ....Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: E-Posta Kontrolü

Mesaj gönderen xozcanx »

mrmarman yazdı:...
Eyvah konu hortladı :)
Hocam uygulama üzerinde kullanıcıya bildirim yapılmasını istediler.Buradaki örnek gibi fakat farklı bir yöntemle istediğim gibi popup mesaj formunu gösteriyorum.
Sıkıntı şu uygulama çalışırken İnternet sayfasını açtık biraz forumda takılalım dedik :) Bu esnada bir bildirim geldi bizim internet sayfamız tam ekran olduğu için gelen bildirim mesajı arka planda kalıyor. yani tüm pencerelerin önüne geçemiyor ve bildirim geldiğini anlayamıyoruz. Böyle bir durum için nasıl bir yol izlememiz gerekir. :?:
Buradaki kodlarıda denedim sonuç aynı :?
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: E-Posta Kontrolü

Mesaj gönderen thelvaci »

xozcanx yazdı:
mrmarman yazdı:...
Eyvah konu hortladı :)
Hocam uygulama üzerinde kullanıcıya bildirim yapılmasını istediler.Buradaki örnek gibi fakat farklı bir yöntemle istediğim gibi popup mesaj formunu gösteriyorum.
Sıkıntı şu uygulama çalışırken İnternet sayfasını açtık biraz forumda takılalım dedik :) Bu esnada bir bildirim geldi bizim internet sayfamız tam ekran olduğu için gelen bildirim mesajı arka planda kalıyor. yani tüm pencerelerin önüne geçemiyor ve bildirim geldiğini anlayamıyoruz. Böyle bir durum için nasıl bir yol izlememiz gerekir. :?:
Buradaki kodlarıda denedim sonuç aynı :?
Kullanıcının dikkati cezbetmek için pek çok yol kullanılabilir. Örneğin, uygulamanızın trayicon desteği olur ve ballonhint ile mesaj verebilirsiniz; yada uygulamanızı SetForegroundWindow, SetTopWindow gibi apiler ile ön plana getirebilirsiniz yada FlashWindow/FlashWindowEx ile task manager'da uygulamanızın dikkat çekmesini sağlayabilirsiniz yada işletim sistemi Windows 10 ise TNotificationManager'ı kullanabilirsiniz vs.vs...
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: E-Posta Kontrolü

Mesaj gönderen xozcanx »

thelvaci yazdı:
xozcanx yazdı:
mrmarman yazdı:...
Eyvah konu hortladı :)
Hocam uygulama üzerinde kullanıcıya bildirim yapılmasını istediler.Buradaki örnek gibi fakat farklı bir yöntemle istediğim gibi popup mesaj formunu gösteriyorum.
Sıkıntı şu uygulama çalışırken İnternet sayfasını açtık biraz forumda takılalım dedik :) Bu esnada bir bildirim geldi bizim internet sayfamız tam ekran olduğu için gelen bildirim mesajı arka planda kalıyor. yani tüm pencerelerin önüne geçemiyor ve bildirim geldiğini anlayamıyoruz. Böyle bir durum için nasıl bir yol izlememiz gerekir. :?:
Buradaki kodlarıda denedim sonuç aynı :?
Kullanıcının dikkati cezbetmek için pek çok yol kullanılabilir. Örneğin, uygulamanızın trayicon desteği olur ve ballonhint ile mesaj verebilirsiniz; yada uygulamanızı SetForegroundWindow, SetTopWindow gibi apiler ile ön plana getirebilirsiniz yada FlashWindow/FlashWindowEx ile task manager'da uygulamanızın dikkat çekmesini sağlayabilirsiniz yada işletim sistemi Windows 10 ise TNotificationManager'ı kullanabilirsiniz vs.vs...
Hocam cevap için Çok teşekkürler, Anahtar kelimeye ihtiyaç vardı onuda söylediniz.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Cevapla