Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz
Anket Başlığı: Bu tür projelerin devamını destekliyor musunuz?
Anket kapatılmıştır.
Evet, her zaman desteklerim.
100.00%
12 100.00%
Hayır- kullanacağımı zannetmiyorum.
0%
0 0%
Katılımcı sayısı: 12 100%
* Siz bu anket için oy kullanmışsınız. [Anket Sonuçlarını Göster]


Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
HHBMailComponent - Kolay Mail Gönderim Bileşeni [Delphi]
#1
Selamlar!

Birkaç gündür üstünde çalıştığım bileşen hakkında sizlere birkaç bilgi vermek isterim. @csunguray (Ayrıca teşekkürler.) ve internette bulduğum kaynakları birleştirerek; çok fazla sayıda arama sayısı olan "Delphi ile mail gönderme" başlığını ortadan kaldırmak adına yapmış olduğum araç ile kolayca mail gönderebilirsiniz. Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol üzerinden örnek elde edebilir ayrıca kurulum için tutorial dosyalarını inceleyebilirsiniz. Buraya uzunca yazıp can sıkacağıma PDF hazırlamak daha mantıklı geldi  Big Grin . Devam etmem gerekirse Indy bileşenini referans alan bileşen için Delphi'de Indy bileşeni kurulu olmalı. Hemen hemen tüm sürümlerde bu bileşenin kurulu gelmesinden dolayı(starter edition  sürümünde mevcut mu bilmiyorum, professional ve daha üstü için konuşuyorum.) bir sorun çıkartacağını düşünmüyorum. Umarım işinize yarayan bir araç olur.

Size bir soru sormak istiyorum; Böyle projelerin devamını gelmesini istiyor musunuz? Bu tür projeleri destekler misiniz?

Github linki: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol


Bileşen çalışırken;

Lbr6Vb.jpg

Saygılarımla,
Halil Han Badem.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#2
Merhaba,
Değerli paylaşımlarınız ve katkılarınız için teşekkür ederiz, ellerinize sağlık Halil Bey.
Bu ve benzeri çalışmaları tabi ki isteriz. Her defasında bocaladığımız mail gönderme işini bir bileşen haline getirmeniz de ayrıca güzel olmuş, Tebrikler!

Affınıza sığınarak bir kaç öneri ve istekte bulunacağım;

1- Bildiğiniz gibi Delphi bileşenleri uzun zamandan beri (2012 ve sonrasında) VCL ve FMX olmak üzere ikiye ayrılmış (Karma olanları da var; hem FMX hem VCL'de çalışabilen tek paketler) durumdadır. GitHub'ınıza baktığımda bu konuda bir açıklama göremedim (Kodlardan anlaşılıyor fakat herkes açıp da koda bakmıyor maalesef). 
2- GitHub'da paylaşmış olduğunuz Example/XE10.2 klasör adında bir düzeltme yapmanızda fayda var. Delphi XE sürümleri 8'e kadardır. Sekiz sürümünden sonra isimlendirmeler Delphi 10.1, 10.2, 10.3... şeklindedir. (Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol)
3- Delphi kod yazım standartlarında Type bildiriminden sonra yapılan tüm tanımlamalar T karakteri ile private bölümünde ise F karakteri ile başlaması gerekiyor.
4-Nil parametreli Create işlemlerinizin devamı niteliğinde olacak, destroy metodunu tamamlamadığınızı fark ettim.
5- Bileşenin ConnectTimeout süresi publish edilmeli diye düşünüyorum.
6- Attachment özelliği de olsa daha iyi olur.

Böyle basit şeylere neden takılıyorsunuz derseniz; daha profesyonel ve mükemmel olmak için ve bilen birileri tarafından olumsuz ilk izleniminin önüne geçmek için ufak tefek ayrıntıların son derece önemli olduğunu düşünüyorum.

Önerilerden sonra bir de isteklerim olacak (GitHub kullananlar için);
Projelerin GitHub'a yüklenmesine karşı olmadığımı belirterek sözlerime başlamak istiyorum.
1- Kodun kısa bir bölümünü ve kullanım şeklini DelphiCan'da paylaşmanız son derece önemli.
Neden derseniz?
Malumunuz bir çoğumuz Google ve benzeri arama motorlarında bir konu araştırırken çoğunlukla Delphi kod sözcüklerini kullanıyoruz.
Kodlar GitHub'da olduğuna göre, yapılan bir arama sonucu bizi GitHub'a yönlendirecektir. DelphiCan'a uğramayacaktır. Çorbada sizin de tuzunuzun olması için bu tip katkılarınızı bekliyoruz.
2- Birinci madde ile bağlantılı olarak, GitHub'a yüklenen bir projenin ilk açıklama bölümünde DelphiCan'da açmış olduğunuz konunun linkini paylaşma imkanınız olursa sevinirim. Bunun önemi de DelphiCan'ın tanıtımına katkıda bulunmuş olacak ve BackLink sayısını arttırarak arama motorlarında ve analiz araçlarında üst sıralarda görünmesini sağlayacaksınız.

Paylaşım için tekrar teşekkürler.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
(27-04-2018, Saat: 08:50)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,
Değerli paylaşımlarınız ve katkılarınız için teşekkür ederiz, ellerinize sağlık Halil Bey.
Bu ve benzeri çalışmaları tabi ki isteriz. Her defasında bocaladığımız mail gönderme işini bir bileşen haline getirmeniz de ayrıca güzel olmuş, Tebrikler!

Affınıza sığınarak bir kaç öneri ve istekte bulunacağım;

1- Bildiğiniz gibi Delphi bileşenleri uzun zamandan beri (2012 ve sonrasında) VCL ve FMX olmak üzere ikiye ayrılmış (Karma olanları da var; hem FMX hem VCL'de çalışabilen tek paketler) durumdadır. GitHub'ınıza baktığımda bu konuda bir açıklama göremedim (Kodlardan anlaşılıyor fakat herkes açıp da koda bakmıyor maalesef). 
2- GitHub'da paylaşmış olduğunuz Example/XE10.2 klasör adında bir düzeltme yapmanızda fayda var. Delphi XE sürümleri 8'e kadardır. Sekiz sürümünden sonra isimlendirmeler Delphi 10.1, 10.2, 10.3... şeklindedir. (Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol)
3- Delphi kod yazım standartlarında Type bildiriminden sonra yapılan tüm tanımlamalar T karakteri ile private bölümünde ise F karakteri ile başlaması gerekiyor.
4-Nil parametreli Create işlemlerinizin devamı niteliğinde olacak, destroy metodunu tamamlamadığınızı fark ettim.
5- Bileşenin ConnectTimeout süresi publish edilmeli diye düşünüyorum.
6- Attachment özelliği de olsa daha iyi olur.

Böyle basit şeylere neden takılıyorsunuz derseniz; daha profesyonel ve mükemmel olmak için ve bilen birileri tarafından olumsuz ilk izleniminin önüne geçmek için ufak tefek ayrıntıların son derece önemli olduğunu düşünüyorum.

Önerilerden sonra bir de isteklerim olacak (GitHub kullananlar için);
Projelerin GitHub'a yüklenmesine karşı olmadığımı belirterek sözlerime başlamak istiyorum.
1- Kodun kısa bir bölümünü ve kullanım şeklini DelphiCan'da paylaşmanız son derece önemli.
Neden derseniz?
Malumunuz bir çoğumuz Google ve benzeri arama motorlarında bir konu araştırırken çoğunlukla Delphi kod sözcüklerini kullanıyoruz.
Kodlar GitHub'da olduğuna göre, yapılan bir arama sonucu bizi GitHub'a yönlendirecektir. DelphiCan'a uğramayacaktır. Çorbada sizin de tuzunuzun olması için bu tip katkılarınızı bekliyoruz.
2- Birinci madde ile bağlantılı olarak, GitHub'a yüklenen bir projenin ilk açıklama bölümünde DelphiCan'da açmış olduğunuz konunun linkini paylaşma imkanınız olursa sevinirim. Bunun önemi de DelphiCan'ın tanıtımına katkıda bulunmuş olacak ve BackLink sayısını arttırarak arama motorlarında ve analiz araçlarında üst sıralarda görünmesini sağlayacaksınız.

Paylaşım için tekrar teşekkürler.
 Teşekkürler hocam. Yas itibari ile tecrübesizikler illa olacaktır. Dediklerinizi yapmaya koyuldum.

Önerilerinizi için tekrar teşekkürler Blush
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#4
Elinize emeğinize sağlık sevgili Halil bey, Fesih bey'e katılıyorum, bende genelde hep e-posta ile dosya gönderme kısmında takılmışımdır. Bir sonraki güncellemede attachment ekleme özelliği de olursa tadından yenmez Smile
Dmitry Kouzmenko ve Dmitry Yemanov ile çalışmış , Eski IBSurgeon personeli, Kıdemli Firebird Kurtarma Uzmanı, Firebird Foundation bağışçısı...
Cevapla
#5
(27-04-2018, Saat: 09:04)rmzgenius Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlElinize emeğinize sağlık sevgili Halil bey, Fesih bey'e katılıyorum, bende genelde hep e-posta ile dosya gönderme kısmında takılmışımdır. Bir sonraki güncellemede attachment ekleme özelliği de olursa tadından yenmez Smile

Üstat dün gece geç saatlerde(benim için 1 geç oluyor malum öğrenciyim) yayınlandığım için tanutunlarda eksikler var. Dediğiniz attachment olayı ise gunellemeg ile gelir sorun değil. Ama amacım bunu bir component grubu yapmak. Bu ve bunun gibi sıkıntı çıkaran konuları bir bileşen setinde halletmek. "Fesih ARSLAN" ustadin dediklerini bugün içerisinde yapmaya calisacagim. Teşekkürler Blush
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#6
Nacizane benim fikrim/tercihim bu tarz şeyleri komponent yapmak yerine kütüphane dosyası şeklinde yapmaktan yana. Component'in bir özelliği kaldırıldığında ya da isim değiştirdiğinde bazen ekranı açarken o özellikler silinebiliyor vs., bu yüzden komponent mantığındansa kütüphane mantığını tercih ederim.

Emeğinize sağlık
Cevapla
#7
(27-04-2018, Saat: 09:19)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlNacizane benim fikrim/tercihim bu tarz şeyleri komponent yapmak yerine kütüphane dosyası şeklinde yapmaktan yana. Component'in bir özelliği kaldırıldığında ya da isim değiştirdiğinde bazen ekranı açarken o özellikler silinebiliyor vs., bu yüzden komponent mantığındansa kütüphane mantığını tercih ederim.

Emeğinize sağlık

 Size bileşen güncellemeden sonraki sıkıntı için katılıyorum. Aslında 2 türlü yapılabilir bir bileşen(isteyen) birde kütüphane. Fikir için teşekkürler.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#8
Emeğinize sağlık güzel çalışma olmuş. Benimde zamanında örnek olarak yazdığım bir kod vardı. Şu Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol altında bulabilirsiniz.

(21-02-2017, Saat: 00:56)witalihakko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAynen fluent interface olarak geçiyor ben kod zincirleme diyorum. Bana göre kod karmaşıklığını gideren ve yönetimini kolaylaştıran bir yöntem . O yüzden de severek kullanıyorum. Bunun en güzel örneklerinden birini de mail göndermede görebiliriz. İnternette dolaşırken karşılaştığım mail gönderme Classını biraz değiştirerek kod zincirleme haline getirdim. Belki bazı arkadaşlara lazım olur diye buradan paylaşıyorum. İki metodu da içeriyor Class.

unit SendIndyMail;

interface

uses
 IdMessage, Classes, IdSMTP;

const
 SMTP_PORT_EXPLICIT_TLS = 587;

type
 TSSLEmail = class(TObject)
 private
   IdMessage: TIdMessage;
   SMTP: TIdSMTP;

   FBody: TStrings;
   FSMTPPort: Integer;
   FToEmail: string;
   FSubject: string;
   FSMTPServer: string;
   FCCEmail: string;
   FPassword: string;
   FBCCEmail: string;
   FSenderName: string;
   FUserName: string;
   FPriority: TIdMessagePriority;
   FSenderEmail: string;
   FSSLConnection: Boolean;

   // Getter / Setter
   procedure SetBody(const AValue: TStrings);

   procedure Init;
   procedure InitMailMessage;
   procedure InitSASL;
   procedure AddSSLHandler;

 public
   constructor Create; overload;
   constructor Create(const ASMTPServer: string;
     const ASMTPPort: Integer;
     const AUserName, APassword: string); overload;

   destructor Destroy; override;

   function SendEmail: TSSLEmail;

   // Properties
   function AddBCCEmail(AValue: string) : TSSLEmail;
   function AddBody(AValue: TStrings) : TSSLEmail;overload;
   function AddBody(AValue: string) : TSSLEmail;overload;
   function AddCCEmail(AValue: string) : TSSLEmail;
   function AddPassword(AValue: string) : TSSLEmail;
   function AddPriority(AValue: TIdMessagePriority) : TSSLEmail;
   function AddSenderEmail(AValue: string) : TSSLEmail;
   function AddSenderName(AValue: string) : TSSLEmail;
   function AddSMTPServer(AValue: string) : TSSLEmail;
   function AddSMTPPort(AValue: integer) : TSSLEmail;
   function AddSSLConnection(AValue: Boolean) : TSSLEmail;
   function AddToEmail(AValue: string) : TSSLEmail;
   function AddUserName(AValue: string) : TSSLEmail;
   function AddSubject(AValue: string) : TSSLEmail;

   property BCCEmail: string read FBCCEmail write FBCCEmail;
   property Body: TStrings read FBody write FBody;
   property CCEmail: string read FCCEmail write FCCEmail;
   property Password: string read FPassword write FPassword;
   property Priority: TIdMessagePriority read FPriority write FPriority;
   property SenderEmail: string read FSenderEmail write FSenderEmail;
   property SenderName: string read FSenderName write FSenderName;
   property SMTPServer: string read FSMTPServer write FSMTPServer;
   property SMTPPort: Integer read FSMTPPort write FSMTPPort;
   property SSLConnection: Boolean read FSSLConnection write FSSLConnection;
   property ToEmail: string read FToEmail write FToEmail;
   property UserName: string read FUserName write FUserName;
   property Subject: string read FSubject write FSubject;

 end;

function CreateSendMail:TSSLEmail;overload;
function CreateSendMail(const ASMTPServer: string;
 const ASMTPPort: Integer;
 const AUserName, APassword: string):TSSLEmail;overload;

implementation

uses
 IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
 IdMessageClient, IdSMTPBase, IdBaseComponent, IdIOHandler,
 IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin,
 IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5,
 IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest,
 IdSASLAnonymous, IdUserPassProvider;

function CreateSendMail:TSSLEmail;overload;
begin
 Result := TSSLEmail.Create;
end;

function CreateSendMail(const ASMTPServer: string;
 const ASMTPPort: Integer;
 const AUserName, APassword: string):TSSLEmail;overload;
begin
 Result := TSSLEmail.Create(ASMTPServer,ASMTPPort,AUserName,APassword);
end;

constructor TSSLEmail.Create;
begin
 inherited;

 Init;

 FBody := TStringList.Create;
end;

procedure TSSLEmail.Init;
begin
 SSLConnection := True;
 Priority := TIdMessagePriority.mpNormal;
end;

function TSSLEmail.AddSubject(AValue: string): TSSLEmail;
begin
 FSubject := AValue;
 Result := Self;
end;

function TSSLEmail.AddToEmail(AValue: string): TSSLEmail;
begin
 FToEmail := AValue;
 Result := Self;
end;

function TSSLEmail.AddUserName(AValue: string): TSSLEmail;
begin
 FUserName := AValue;
 Result := Self;
end;

constructor TSSLEmail.Create(const ASMTPServer: string;
 const ASMTPPort: Integer; const AUserName, APassword: string);
begin
 Create;

 SMTPServer := ASMTPServer;
 SMTPPort := ASMTPPort;
 UserName := AUserName;
 Password := APassword;
end;

destructor TSSLEmail.Destroy;
begin
 FBody.Free;

 inherited;
end;

// Setter / Getter -----------------------------------------------------------

procedure TSSLEmail.SetBody(const AValue: TStrings);
begin
 FBody.Assign(AValue);
end;

// Send the mail -------------------------------------------------------------

function TSSLEmail.SendEmail:TSSLEmail;
begin
 IdMessage := TIdMessage.Create;
 try
   InitMailMessage;

   SMTP := TIdSMTP.Create;
   try
     if SSLConnection then
     begin
       AddSSLHandler;

       if SMTPPort = SMTP_PORT_EXPLICIT_TLS then
         SMTP.UseTLS := utUseExplicitTLS
       else
         SMTP.UseTLS := utUseImplicitTLS;
     end;

     if (UserName<>'') or (Password<>'') then
     begin
       SMTP.AuthType := satSASL;
       InitSASL;
     end
     else
     begin
       SMTP.AuthType := satNone;
     end;

     SMTP.Host := SMTPServer;
     SMTP.Port := SMTPPort;
     SMTP.ConnectTimeout := 30000;
     SMTP.UseEHLO := True;
     SMTP.Connect;

     try
       SMTP.Send(IdMessage);
     finally
       SMTP.Disconnect;
     end;
   finally
     SMTP.Free;
   end;
 finally
   IdMessage.Free;
 end;
 Result := Self;
end;

// Prepare the mail ----------------------------------------------------------

procedure TSSLEmail.InitMailMessage;
begin
 IdMessage.ContentType := 'text/plain';
 IdMessage.Charset := 'UTF-8';
 IdMessage.Body := Body;
 IdMessage.Sender.Text := SenderEMail;
 IdMessage.From.Name := SenderName;
 IdMessage.From.Address := SenderEMail;
 IdMessage.ReplyTo.EMailAddresses := SenderEmail;
 IdMessage.Recipients.EMailAddresses := ToEmail;
 IdMessage.Subject := Subject;
 IdMessage.Priority := Priority;
 IdMessage.CCList.EMailAddresses := CCEMail;
 IdMessage.ReceiptRecipient.Text := '';
 IdMessage.BccList.EMailAddresses := BCCEMail;
end;

function TSSLEmail.AddBCCEmail(AValue: string): TSSLEmail;
begin
 if FBCCEmail = '' then
   FBCCEmail := AValue
 else
   FBCCEmail := FBCCEmail+','+AValue;

 Result := Self;
end;

function TSSLEmail.AddBody(AValue: TStrings): TSSLEmail;
begin
 FBody.Add(AValue.Text);
 Result := Self;
end;

function TSSLEmail.AddBody(AValue: string): TSSLEmail;
begin
 FBody.Add(AValue);
 Result := Self;
end;

function TSSLEmail.AddCCEmail(AValue: string): TSSLEmail;
begin
 if FCCEmail = '' then
   FCCEmail := AValue
 else
   FCCEmail := FCCEmail +','+AValue;
 Result := Self;
end;

function TSSLEmail.AddPassword(AValue: string): TSSLEmail;
begin
 FPassword := AValue;
 Result := Self;
end;

function TSSLEmail.AddPriority(AValue: TIdMessagePriority): TSSLEmail;
begin
 FPriority := AValue;
 Result := Self;
end;

function TSSLEmail.AddSenderEmail(AValue: string): TSSLEmail;
begin
 FSenderEmail := AValue;
 Result := Self;
end;

function TSSLEmail.AddSenderName(AValue: string): TSSLEmail;
begin
 FSenderName := AValue;
 Result := Self;
end;

function TSSLEmail.AddSMTPPort(AValue: integer): TSSLEmail;
begin
 FSMTPPort := AValue;
 Result := Self;
end;

function TSSLEmail.AddSMTPServer(AValue: string): TSSLEmail;
begin
 FSMTPServer := AValue;
 Result := Self;
end;

function TSSLEmail.AddSSLConnection(AValue: Boolean): TSSLEmail;
begin
 FSSLConnection := AValue;
 Result := Self;
end;

procedure TSSLEmail.AddSSLHandler;
var
 SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
 SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
 // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
 SSLHandler.SSLOptions.Method := sslvSSLv23;
 SSLHandler.SSLOptions.Mode := sslmClient;
 SSLHandler.SSLOptions.VerifyMode := [];
 SSLHandler.SSLOptions.VerifyDepth := 0;
 SMTP.IOHandler := SSLHandler;
end;

procedure TSSLEmail.InitSASL;
var
 IdUserPassProvider: TIdUserPassProvider;
 IdSASLCRAMMD5: TIdSASLCRAMMD5;
 IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
 IdSASLPlain: TIdSASLPlain;
 IdSASLLogin: TIdSASLLogin;
 IdSASLSKey: TIdSASLSKey;
 IdSASLOTP: TIdSASLOTP;
 IdSASLAnonymous: TIdSASLAnonymous;
 IdSASLExternal: TIdSASLExternal;
begin
 IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
 IdUserPassProvider.Username := UserName;
 IdUserPassProvider.Password:= Password;

 IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP);
 IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider;
 IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP);
 IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider;
 IdSASLSKey := TIdSASLSKey.Create(SMTP);
 IdSASLSKey.UserPassProvider := IdUserPassProvider;
 IdSASLOTP := TIdSASLOTP.Create(SMTP);
 IdSASLOTP.UserPassProvider := IdUserPassProvider;
 IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP);
 IdSASLExternal := TIdSASLExternal.Create(SMTP);
 IdSASLLogin := TIdSASLLogin.Create(SMTP);
 IdSASLLogin.UserPassProvider := IdUserPassProvider;
 IdSASLPlain := TIdSASLPlain.Create(SMTP);
 IdSASLPlain.UserPassProvider := IdUserPassProvider;

 SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1;
 SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5;
 SMTP.SASLMechanisms.Add.SASL := IdSASLSKey;
 SMTP.SASLMechanisms.Add.SASL := IdSASLOTP;
 SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous;
 SMTP.SASLMechanisms.Add.SASL := IdSASLExternal;
 SMTP.SASLMechanisms.Add.SASL := IdSASLLogin;
 SMTP.SASLMechanisms.Add.SASL := IdSASLPlain;
end;

end.

Normal Kullanımı :

procedure TForm1.btnNormalClick(Sender: TObject);
var
 Mail: TSSLEmail;
begin
 try
   Mail := TSSLEmail.Create('smtp.gmail.com',
                             465,
                             'hakanucaar@gmail.com',
                             'KendiEmailŞifren'
                           );

   try
     Mail.SenderName := 'Hakan Uçar Inc.';
     Mail.SenderEmail := 'hakanucaar@example.com';
     Mail.ToEmail := 'hakanucaar@yandex.com';
     Mail.Subject := edtKonu.Text;
     Mail.Body := mmoMesaj.Lines;

     Mail.SendEmail;
   finally
     Mail.Free;
   end;
 finally
   ShowMessage('Mesaj Normal Metod ile Gönderildi');
 end;
end;


Kod Zincirleme :

procedure TForm1.btnKodZincirClick(Sender: TObject);
begin
 try
   CreateSendMail('smtp.gmail.com',
                   465,
                   'hakanucaar@gmail.com',
                   'KendiEmailŞifren'
                 )
                  .AddSenderName('Hakan Uçar Inc.')
                  .AddSenderEmail('hakanucaar@gmail.com')
                  .AddToEmail('hakanucaar@yandex.com')
                  .AddSubject(edtKonu.Text)
                  .AddBody(mmoMesaj.Lines)
                  .SendEmail
                  .Free;
 finally
   ShowMessage('Mesaj Kod Zincirleme Metodu ile Gönderildi');
 end;
end;

Görünüm:

SendMail.gif
WWW
Cevapla
#9
(27-04-2018, Saat: 10:10)witalihakko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEmeğinize sağlık güzel çalışma olmuş. Benimde zamanında örnek olarak yazdığım bir kod vardı. Şu Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol altında bulabilirsiniz.

(21-02-2017, Saat: 00:56)witalihakko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAynen fluent interface olarak geçiyor ben kod zincirleme diyorum. Bana göre kod karmaşıklığını gideren ve yönetimini kolaylaştıran bir yöntem . O yüzden de severek kullanıyorum. Bunun en güzel örneklerinden birini de mail göndermede görebiliriz. İnternette dolaşırken karşılaştığım mail gönderme Classını biraz değiştirerek kod zincirleme haline getirdim. Belki bazı arkadaşlara lazım olur diye buradan paylaşıyorum. İki metodu da içeriyor Class.

unit SendIndyMail;

interface

uses
 IdMessage, Classes, IdSMTP;

const
 SMTP_PORT_EXPLICIT_TLS = 587;

type
 TSSLEmail = class(TObject)
 private
   IdMessage: TIdMessage;
   SMTP: TIdSMTP;

   FBody: TStrings;
   FSMTPPort: Integer;
   FToEmail: string;
   FSubject: string;
   FSMTPServer: string;
   FCCEmail: string;
   FPassword: string;
   FBCCEmail: string;
   FSenderName: string;
   FUserName: string;
   FPriority: TIdMessagePriority;
   FSenderEmail: string;
   FSSLConnection: Boolean;

   // Getter / Setter
   procedure SetBody(const AValue: TStrings);

   procedure Init;
   procedure InitMailMessage;
   procedure InitSASL;
   procedure AddSSLHandler;

 public
   constructor Create; overload;
   constructor Create(const ASMTPServer: string;
     const ASMTPPort: Integer;
     const AUserName, APassword: string); overload;

   destructor Destroy; override;

   function SendEmail: TSSLEmail;

   // Properties
   function AddBCCEmail(AValue: string) : TSSLEmail;
   function AddBody(AValue: TStrings) : TSSLEmail;overload;
   function AddBody(AValue: string) : TSSLEmail;overload;
   function AddCCEmail(AValue: string) : TSSLEmail;
   function AddPassword(AValue: string) : TSSLEmail;
   function AddPriority(AValue: TIdMessagePriority) : TSSLEmail;
   function AddSenderEmail(AValue: string) : TSSLEmail;
   function AddSenderName(AValue: string) : TSSLEmail;
   function AddSMTPServer(AValue: string) : TSSLEmail;
   function AddSMTPPort(AValue: integer) : TSSLEmail;
   function AddSSLConnection(AValue: Boolean) : TSSLEmail;
   function AddToEmail(AValue: string) : TSSLEmail;
   function AddUserName(AValue: string) : TSSLEmail;
   function AddSubject(AValue: string) : TSSLEmail;

   property BCCEmail: string read FBCCEmail write FBCCEmail;
   property Body: TStrings read FBody write FBody;
   property CCEmail: string read FCCEmail write FCCEmail;
   property Password: string read FPassword write FPassword;
   property Priority: TIdMessagePriority read FPriority write FPriority;
   property SenderEmail: string read FSenderEmail write FSenderEmail;
   property SenderName: string read FSenderName write FSenderName;
   property SMTPServer: string read FSMTPServer write FSMTPServer;
   property SMTPPort: Integer read FSMTPPort write FSMTPPort;
   property SSLConnection: Boolean read FSSLConnection write FSSLConnection;
   property ToEmail: string read FToEmail write FToEmail;
   property UserName: string read FUserName write FUserName;
   property Subject: string read FSubject write FSubject;

 end;

function CreateSendMail:TSSLEmail;overload;
function CreateSendMail(const ASMTPServer: string;
 const ASMTPPort: Integer;
 const AUserName, APassword: string):TSSLEmail;overload;

implementation

uses
 IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
 IdMessageClient, IdSMTPBase, IdBaseComponent, IdIOHandler,
 IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin,
 IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5,
 IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest,
 IdSASLAnonymous, IdUserPassProvider;

function CreateSendMail:TSSLEmail;overload;
begin
 Result := TSSLEmail.Create;
end;

function CreateSendMail(const ASMTPServer: string;
 const ASMTPPort: Integer;
 const AUserName, APassword: string):TSSLEmail;overload;
begin
 Result := TSSLEmail.Create(ASMTPServer,ASMTPPort,AUserName,APassword);
end;

constructor TSSLEmail.Create;
begin
 inherited;

 Init;

 FBody := TStringList.Create;
end;

procedure TSSLEmail.Init;
begin
 SSLConnection := True;
 Priority := TIdMessagePriority.mpNormal;
end;

function TSSLEmail.AddSubject(AValue: string): TSSLEmail;
begin
 FSubject := AValue;
 Result := Self;
end;

function TSSLEmail.AddToEmail(AValue: string): TSSLEmail;
begin
 FToEmail := AValue;
 Result := Self;
end;

function TSSLEmail.AddUserName(AValue: string): TSSLEmail;
begin
 FUserName := AValue;
 Result := Self;
end;

constructor TSSLEmail.Create(const ASMTPServer: string;
 const ASMTPPort: Integer; const AUserName, APassword: string);
begin
 Create;

 SMTPServer := ASMTPServer;
 SMTPPort := ASMTPPort;
 UserName := AUserName;
 Password := APassword;
end;

destructor TSSLEmail.Destroy;
begin
 FBody.Free;

 inherited;
end;

// Setter / Getter -----------------------------------------------------------

procedure TSSLEmail.SetBody(const AValue: TStrings);
begin
 FBody.Assign(AValue);
end;

// Send the mail -------------------------------------------------------------

function TSSLEmail.SendEmail:TSSLEmail;
begin
 IdMessage := TIdMessage.Create;
 try
   InitMailMessage;

   SMTP := TIdSMTP.Create;
   try
     if SSLConnection then
     begin
       AddSSLHandler;

       if SMTPPort = SMTP_PORT_EXPLICIT_TLS then
         SMTP.UseTLS := utUseExplicitTLS
       else
         SMTP.UseTLS := utUseImplicitTLS;
     end;

     if (UserName<>'') or (Password<>'') then
     begin
       SMTP.AuthType := satSASL;
       InitSASL;
     end
     else
     begin
       SMTP.AuthType := satNone;
     end;

     SMTP.Host := SMTPServer;
     SMTP.Port := SMTPPort;
     SMTP.ConnectTimeout := 30000;
     SMTP.UseEHLO := True;
     SMTP.Connect;

     try
       SMTP.Send(IdMessage);
     finally
       SMTP.Disconnect;
     end;
   finally
     SMTP.Free;
   end;
 finally
   IdMessage.Free;
 end;
 Result := Self;
end;

// Prepare the mail ----------------------------------------------------------

procedure TSSLEmail.InitMailMessage;
begin
 IdMessage.ContentType := 'text/plain';
 IdMessage.Charset := 'UTF-8';
 IdMessage.Body := Body;
 IdMessage.Sender.Text := SenderEMail;
 IdMessage.From.Name := SenderName;
 IdMessage.From.Address := SenderEMail;
 IdMessage.ReplyTo.EMailAddresses := SenderEmail;
 IdMessage.Recipients.EMailAddresses := ToEmail;
 IdMessage.Subject := Subject;
 IdMessage.Priority := Priority;
 IdMessage.CCList.EMailAddresses := CCEMail;
 IdMessage.ReceiptRecipient.Text := '';
 IdMessage.BccList.EMailAddresses := BCCEMail;
end;

function TSSLEmail.AddBCCEmail(AValue: string): TSSLEmail;
begin
 if FBCCEmail = '' then
   FBCCEmail := AValue
 else
   FBCCEmail := FBCCEmail+','+AValue;

 Result := Self;
end;

function TSSLEmail.AddBody(AValue: TStrings): TSSLEmail;
begin
 FBody.Add(AValue.Text);
 Result := Self;
end;

function TSSLEmail.AddBody(AValue: string): TSSLEmail;
begin
 FBody.Add(AValue);
 Result := Self;
end;

function TSSLEmail.AddCCEmail(AValue: string): TSSLEmail;
begin
 if FCCEmail = '' then
   FCCEmail := AValue
 else
   FCCEmail := FCCEmail +','+AValue;
 Result := Self;
end;

function TSSLEmail.AddPassword(AValue: string): TSSLEmail;
begin
 FPassword := AValue;
 Result := Self;
end;

function TSSLEmail.AddPriority(AValue: TIdMessagePriority): TSSLEmail;
begin
 FPriority := AValue;
 Result := Self;
end;

function TSSLEmail.AddSenderEmail(AValue: string): TSSLEmail;
begin
 FSenderEmail := AValue;
 Result := Self;
end;

function TSSLEmail.AddSenderName(AValue: string): TSSLEmail;
begin
 FSenderName := AValue;
 Result := Self;
end;

function TSSLEmail.AddSMTPPort(AValue: integer): TSSLEmail;
begin
 FSMTPPort := AValue;
 Result := Self;
end;

function TSSLEmail.AddSMTPServer(AValue: string): TSSLEmail;
begin
 FSMTPServer := AValue;
 Result := Self;
end;

function TSSLEmail.AddSSLConnection(AValue: Boolean): TSSLEmail;
begin
 FSSLConnection := AValue;
 Result := Self;
end;

procedure TSSLEmail.AddSSLHandler;
var
 SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
 SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
 // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
 SSLHandler.SSLOptions.Method := sslvSSLv23;
 SSLHandler.SSLOptions.Mode := sslmClient;
 SSLHandler.SSLOptions.VerifyMode := [];
 SSLHandler.SSLOptions.VerifyDepth := 0;
 SMTP.IOHandler := SSLHandler;
end;

procedure TSSLEmail.InitSASL;
var
 IdUserPassProvider: TIdUserPassProvider;
 IdSASLCRAMMD5: TIdSASLCRAMMD5;
 IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
 IdSASLPlain: TIdSASLPlain;
 IdSASLLogin: TIdSASLLogin;
 IdSASLSKey: TIdSASLSKey;
 IdSASLOTP: TIdSASLOTP;
 IdSASLAnonymous: TIdSASLAnonymous;
 IdSASLExternal: TIdSASLExternal;
begin
 IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
 IdUserPassProvider.Username := UserName;
 IdUserPassProvider.Password:= Password;

 IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP);
 IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider;
 IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP);
 IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider;
 IdSASLSKey := TIdSASLSKey.Create(SMTP);
 IdSASLSKey.UserPassProvider := IdUserPassProvider;
 IdSASLOTP := TIdSASLOTP.Create(SMTP);
 IdSASLOTP.UserPassProvider := IdUserPassProvider;
 IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP);
 IdSASLExternal := TIdSASLExternal.Create(SMTP);
 IdSASLLogin := TIdSASLLogin.Create(SMTP);
 IdSASLLogin.UserPassProvider := IdUserPassProvider;
 IdSASLPlain := TIdSASLPlain.Create(SMTP);
 IdSASLPlain.UserPassProvider := IdUserPassProvider;

 SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1;
 SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5;
 SMTP.SASLMechanisms.Add.SASL := IdSASLSKey;
 SMTP.SASLMechanisms.Add.SASL := IdSASLOTP;
 SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous;
 SMTP.SASLMechanisms.Add.SASL := IdSASLExternal;
 SMTP.SASLMechanisms.Add.SASL := IdSASLLogin;
 SMTP.SASLMechanisms.Add.SASL := IdSASLPlain;
end;

end.

Normal Kullanımı :

procedure TForm1.btnNormalClick(Sender: TObject);
var
 Mail: TSSLEmail;
begin
 try
   Mail := TSSLEmail.Create('smtp.gmail.com',
                             465,
                             'hakanucaar@gmail.com',
                             'KendiEmailŞifren'
                           );

   try
     Mail.SenderName := 'Hakan Uçar Inc.';
     Mail.SenderEmail := 'hakanucaar@example.com';
     Mail.ToEmail := 'hakanucaar@yandex.com';
     Mail.Subject := edtKonu.Text;
     Mail.Body := mmoMesaj.Lines;

     Mail.SendEmail;
   finally
     Mail.Free;
   end;
 finally
   ShowMessage('Mesaj Normal Metod ile Gönderildi');
 end;
end;


Kod Zincirleme :

procedure TForm1.btnKodZincirClick(Sender: TObject);
begin
 try
   CreateSendMail('smtp.gmail.com',
                   465,
                   'hakanucaar@gmail.com',
                   'KendiEmailŞifren'
                 )
                  .AddSenderName('Hakan Uçar Inc.')
                  .AddSenderEmail('hakanucaar@gmail.com')
                  .AddToEmail('hakanucaar@yandex.com')
                  .AddSubject(edtKonu.Text)
                  .AddBody(mmoMesaj.Lines)
                  .SendEmail
                  .Free;
 finally
   ShowMessage('Mesaj Kod Zincirleme Metodu ile Gönderildi');
 end;
end;

Görünüm:

SendMail.gif

 Teknik bilgiler için teşekkürler üstat Smile  Birazdan Update bilgileri atacağım  Shy
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#10
Başlamadan önce belirtmek isterim, onlarca yazıp yanlışlıkla "F5" tuşuna basmam...

--- UPDATE ---

Herkese selamlar tekrardan! Bugün zaman dardı; bende elimden geldikçe geliştirmeye çalıştım bileşeni. İsterseniz ilk olarak güncellenen durumları görelim.

  • VCL desteği konusunda GitHub üzerinden bilgilendirme yapıldı.
  • GitHub ReadMe.md üzerinde "S.S.S" bölümü eklendi.
  • XE10.2 ibaresi yerine 10.2 ibaresi kullanıldı.
  • DelphiCan formu için "Detaylı bilgilendirme" ibaresi eklendi.
  • Private bölümünde tanımlı olan P ile başlayan parametreler F parametresi ile değiştirildi.
  • Type bölümünde bulunan F başlangıçlı tanımlar T ile değiştirildi.
  • ConnectionTimeOut published edildi.
  • Attachment özelliği getirildi.
  • Attachment özelliğine bağlı olarak; AttachContentID ve AttachContentType bölümleri published edildi.
  • Bazı durumlar standart yapıldı(CharSet: UTF-8).
  • Oluşturulan bileşenler destroy bölümüne; destroy şeklinde eklendi.
  • İstekler doğrultusunda projeye EXE dosyası eklendi. Bu durumda bileşeni kurmadan deneme yapabilirsiniz.
  • Bileşene ikon eklendi.
Bu özellikler umarım yaptığım bileşeni daha güzelleştirir. Belirtmek isterim ki; bileşeni geliştirmek serbesttir. Bunun için bileşenin dosyasında küçük bir not bıraktım(Üst kısımda). Gelelim bu bileşenin nasıl kullanıldığına;

Dosya göndermeden standart mail gönderimi:

 with HHBMailSend1 do
 begin
   SMTPHost := edtSMTPAddress.Text; //Not just Google; you can experiment in Yandex or Hotmail!
   SMTPPort := StrToInt(edtSMTPPort.Text);  //Search with Google to find the appropriate port! e.g "Google SMTP settings"
   SMTPMailAddress := edtMailAddress.Text ; //Enter the e-mail address.
   SMTPMailPassword := edtMailPassword.Text; //Enter the e-mail password.
   MailName := edtYourName.Text; //Enter the name you want to show.

   ClientMailName := 'ClientName'; //Enter the client name
   ClientMailAddress := edtClientMail.Text; //Enter the client mail address
   MailContent.Text := memoMailContent.Lines.Text; //Enter the mail content.
   MailSubject := edtMailSubject.Text;  // Enter the mail subject.

   Connect;  //Connecting...
   SendMail; //Sending...
end;

Dosya göndermek istediğinizde kullanım:

 with HHBMailSend1 do
 begin
  SMTPHost := edtSMTPAddress.Text; //Not just Google; you can experiment in Yandex or Hotmail!
  SMTPPort := StrToInt(edtSMTPPort.Text);  //Search with Google to find the appropriate port! e.g "Google SMTP settings"
  SMTPMailAddress := edtMailAddress.Text ; //Enter the e-mail address.
  SMTPMailPassword := edtMailPassword.Text; //Enter the e-mail password.
  MailName := edtYourName.Text; //Enter the name you want to show.

  ClientMailName := 'ClientName'; //Enter the client name
  ClientMailAddress := edtClientMail.Text; //Enter the client mail address
  MailContent.Text := memoMailContent.Lines.Text; //Enter the mail content.
  MailSubject := edtMailSubject.Text;  // Enter the mail subject.
  AttachFile := edtAttachFilePath.Text;
  AttachType := 'image/bmp';   //Bunun için site açıklama bölümünde verildi.
  AttachFileContentID := '111'; //Kafanıza göre herhangi bir ID verebilirsiniz.

  Connect;  //Connecting...
  SendMail; //Sending...
end;

Exclamation  Burada eğer herhangi bir AttachFile eklediğinizde otomatikman ContentType ve ContentID belirtmeniz gerek. Eğer eklemedeyseniz belirtmek zorunda değilsiniz.

Exclamation Aldığım bazı yorumlar doğrultusunda açıklamak istedim; Bileşen Indy bileşenlerini referans almakta. Indy bileşenlerinin zor kullanımından(En azından sabit isimleri için.) dolayı daha kolaylaştırılmış bir bileşen ürünüdür. Amaç sadece güvenilir(SSL/TLS bağlantısını sabit almakta) ve kolay bir şekilde mail gönderim işlemlerinizi gerçekleştirmektedir.

Exclamation Çok daha fazla soru için Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol adresini ziyaret ediniz.

Heart Bir isteğim var sizden; Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol projemin -eğer hakettiğini düşünüyorsanız- yıldızlamayı yapmanızı isterim.  Heart

Umarım çalışma hayatınızda kolaylık sağlar...

Güncelleme fikirleri için katkılarından dolayı;

@Fesih ARSLAN
@witalihakko
@rmzgenius
@edo (En kısa sürede kütüphane şeklinde upload edeceğim.)
Teşekkürler.

Ek olarak yaptığım bileşene "+10" puan vererek beni duygulandıran üstadım @uparlayan hocama ayrıca teşekkürler  Blush

Saygılarımla,
Halil Han Badem.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  delphi ile web servis yazmak. Kamuran Alpkaya 5 1.386 13-11-2018, Saat: 17:13
Son Yorum: enes6635
  Delphi IDE Donma (Kilitlenmiyor,Geçici Donma) nehirnnn 3 169 30-10-2018, Saat: 20:41
Son Yorum: Ahmet İPEKÇİ
  Delphi Bağlı Liste Ekleme,Silme,Listeleme narkotik 1 126 21-10-2018, Saat: 14:59
Son Yorum: sabanakman
  Delphi 10.2 Aes sorunu seci20 2 91 17-10-2018, Saat: 12:41
Son Yorum: seci20
  Delphi & FTP txt veri işleme Mr.Developer 21 722 28-09-2018, Saat: 08:21
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi