Delphi ile gmail üstünden email gönderme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

Merhaba, mevcut kodlarınızı ve karşılaştığınız hatayı paylaşabilir misiniz?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

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.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

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
(472.93 KiB) 192 kere indirildi
Cevapla