Delphi ile gmail üstünden email gönderme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fatihbarut
Üye
Mesajlar: 366
Kayıt: 15 Ara 2011 08:02

Delphi ile gmail üstünden email gönderme

Mesaj gönderen fatihbarut » 02 Oca 2018 01:02

Arkadaşlar,
gmail smtp server ile daha önce email gönderme için kullandığım kodlar çalışmıyor görünüyor.
2018 itibarı ile çalışan bir kod bilen var mı?
Selam.

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen ertank » 02 Oca 2018 01:12

Merhaba, mevcut kodlarınızı ve karşılaştığınız hatayı paylaşabilir misiniz?

fatihbarut
Üye
Mesajlar: 366
Kayıt: 15 Ara 2011 08:02

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen fatihbarut » 02 Oca 2018 01:17

IdSMTP1.Host := 'smtp.gmail.com'; // SMTP server host name

IdMessage1.Body.Add('Body text.');
IdMessage1.Subject := 'This message contains an attachment';
IdMessage1.From.Text := 'benimemail@yahoo.com';
IdMessage1.From.Name := 'Fatih';

Attachment := TIdAttachmentFile.Create(IdMessage1.MessageParts, ZipFileName);

Addressee := IdMessage1.Recipients.Add;
Addressee.Address := 'benimemail@yahoo.com'; // email address of recipient
Addressee.Name := 'fatih';

IdSMTP1.Username := 'benimemail@gmail.com'; // SMTP user name
IdSMTP1.Port := 465;
IdSMTP1.Password := 'asdasd123'; // SMTP user password
IdSMTP1.Connect;
IdSMTP1.Send(IdMessage1);
IdSMTP1.Disconnect;

465 nolu portu kullanınca Connection gracefuly closed hatası alıyorum. 587'de başka bir hata veriyor

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen ertank » 02 Oca 2018 03:03

Birkaç eksiğiniz var. Öncelikle IdSMTP.Authenticate() kullanmıyorsunuz. Ayrıca gördüğüm kadarıyla şifreli iletişim kurmuyorsunuz ki Gmail yıllardır şifreli iletişim talep eder.

Kullandığınız şifre Gmail üzerinden alınan uygulama şifresi mi? Yoksa gerçek kullanıcı şifresi mi kullanıyorsunuz? Gmail uygulama şifresi email gönderileri için gerekli denilebilir. Bu şifre de uzun zamandır gmail tarafından kullanılan bir uygulamadır.
https://support.google.com/accounts/answer/185833?hl=en

Yukarıdaki bilgiyi de verdikten sonra çalışır bir kod paylaşacağım.

fatihbarut
Üye
Mesajlar: 366
Kayıt: 15 Ara 2011 08:02

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen fatihbarut » 02 Oca 2018 03:10

Evet sanırım uygulama şifresinde takılıyorum.

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen ertank » 02 Oca 2018 05:09

Aşağıdaki gibi bir fonksiyon kullanarak genel olarak herhangi bir SMTP üzerinden e-mail gönderebilirsiniz. Bazı SMTP sunucuları belirli TLS sürümü veya Implicit, Explicit TLS veya SSLv2, SSLv3 gibi farklı bağlantı şekillerini zorunlu tutabilirler. O tür sunucular için fonksiyonu biraz daha geliştirmek gerekir.

Fonksiyon OpenSSL kütüphanesine (libeay32.dll, ssleay32.dll) ihtiyaç duyar. Bu dosyaları ekte bulabilirsiniz.

Kod: Tümünü seç

uses
  IdBaseComponent,
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  IdExplicitTLSClientServerBase,
  IdMessageBuilder,
  IdMessageClient,
  IdEmailAddress,
  IdSMTPBase,
  IdSMTP,
  IdSSLOpenSSL,
  IdMessage,
  IdAttachment,
  IdAttachmentFile;

function SendEmail(const Subject, FromName, FromEmail, RecipientName, RecipientEmail, MessageBody, AttachmentFile, SmtpServer, SmtpUsername, SmtpPassword: string; out ErrorMessage: string; const SmtpPort: Word = 587): Boolean;
var
  FIdMessage: TIdMessage;
  FIdAttachment: TIdAttachment;
  FIdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
  FIdSMTP: TIdSMTP;
  FIdMailAddressItem: TIdEMailAddressItem;
begin
  FIdMessage := TIdMessage.Create(nil);
  try
    FIdMessage.MessageParts.Clear();
    FIdMessage.Subject := Subject;
    FIdMessage.From.Name := FromName;
    FIdMessage.From.Address := FromEmail;
    FIdMailaddressItem := FIdMessage.Recipients.Add();
    FIdMailAddressItem.Name := RecipientName;
    FIdMailAddressItem.Address := RecipientEmail;
    FIdMessage.Body.Text := MessageBody;

    if FileExists(AttachmentFile) then
    begin
      FIdMessage.CharSet := 'utf-8';
      FIdMessage.AttachmentEncoding := 'MIME';
      FIdMessage.Encoding  := meMIME;
      FIdMessage.NoEncode  := False;
      FIdMessage.NoDecode  := False;
      FIdMessage.IsEncoded := True;

      FIdAttachment := TIdAttachmentFile.Create(FIdMessage.MessageParts, AttachmentFile);
    end
    else
    begin
      FIdMessage.ContentType := 'text/plain';
      FIdMessage.CharSet     := 'utf-8';
    end;

    FIdSMTP := TIdSMTP.Create(nil);
    try
      FIdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(FIdSMTP);
      try
        FIdSSLIOHandlerSocket.SSLOptions.Method      := sslvTLSv1_2;
        FIdSSLIOHandlerSocket.SSLOptions.SSLVersions := [sslvTLSv1_2];
        FIdSSLIOHandlerSocket.SSLOptions.Mode        := sslmUnassigned;
        FIdSSLIOHandlerSocket.PassThrough            := False;

        FIdSMTP.IOHandler := FIdSSLIOHandlerSocket;
        FIdSMTP.UseTLS    := utUseRequireTLS;
        FIdSMTP.AuthType  := satDefault;
        FIdSMTP.Host      := SmtpServer;
        FIdSMTP.Port      := SmtpPort;
        FIdSMTP.Username  := SmtpUsername;
        FIdSMTP.Password  := SmtpPassword;

        // Connect
        try
          FIdSMTP.Connect();
        except
          on E: Exception do
          begin
            ErrorMessage := E.Message;
            Exit(False);
          end;
        end;

        // Authenticate
        try
          FIdSMTP.Authenticate();
        except
          on E: Exception do
          begin
            ErrorMessage := E.Message;
            Exit(False);
          end;
        end;

        // Send the e-mail
        try
          FIdSMTP.Send(FIdMessage);
        except
          on E: Exception do
          begin
            ErrorMessage := E.Message;
            Exit(False);
          end;
        end;

        // Disconnect
        try
          if FIdSMTP.Connected() then FIdSMTP.Disconnect();
        except
          on E: Exception do
          begin
            ErrorMessage := E.Message;
            // No need to exit as message already delivered
          end;
        end;
      finally
        FIdSSLIOHandlerSocket.Free();
      end;
    finally
      FIdSMTP.Free();
    end;
  finally
    FIdMessage.Free();
  end;

  Result := True;
end;
Kullanımı aşağıdaki gibi olacaktır:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Error: string;
  Response: Boolean;
begin
  Response :=  SendEmail('test mesajı',
                         'Ali',
                         'ali@veli.com',  // gmail farklı domain adı için hata vermez. otomatik gmail.com yapar
                         'Hasan',
                         'hasan@abc.com',
                         'Delphi e-mail deneme mesajıdır. Silebilirsin.',
                         EmptyStr,
                         'smtp.gmail.com',
                         'abc@gmail.com',
                         '<gmail uygulama şifresi>',
                         Error,
                         587);
  if not Response then
  begin
    ShowMessage('E-mail gönderilemedi. Hata:' + sLineBreak + Error);
  end
  else
  begin
    ShowMessage('Email gönderildi');
  end;
end;
Dosya ekleri
openssl_dll.7z
(474.77 KiB) 8 kere indirildi

fatihbarut
Üye
Mesajlar: 366
Kayıt: 15 Ara 2011 08:02

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen fatihbarut » 03 Oca 2018 09:42

uygulama şifresini nasıl alabileceğime dair bir fikriniz var mı?
biraz karışık gibi...

fatihbarut
Üye
Mesajlar: 366
Kayıt: 15 Ara 2011 08:02

Re: Delphi ile gmail üstünden email gönderme

Mesaj gönderen fatihbarut » 03 Oca 2018 02:47

Ertan bey çok teşekkürler.
forumda csunguray'ın derlenmiş bir program kodu vardı. Gerçekten çok iyi çalıştı. Onunla işimi gördüm.

viewtopic.php?t=36038

Cevapla