Using Gmails Outgoing SMTP from DELPHI(Indy) using TLS

24,662

Solution 1

This code works for GMail:

begin
  IDSMTP1 := TIDSMTP.Create;
  IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create;
  try

    with IDSMTP1 do
    begin
      Host := srvr.Host;
      Port := srvr.Port;
      if (srvr.needAuthentication = 'Y') then
        AuthType := satDefault
      else
        AuthType := satNone;
      IOHandler := IdSSLIOHandlerSocketOpenSSL1;

      if (srvr.secureMode = 'Y') then
        UseTLS := utUseRequireTLS
      else
        UseTLS := utNoTLSSupport;

      Username := srvr.Username;
      Password := srvr.Password;
    end;

    idMBHTML := TIdMessageBuilderHTML.Create;
    Idmessage1 := TIDMessage.Create;

    try
      with idMBHTML do
      begin
        enc := TEncoding.Unicode;
        HTML.LoadFromStream(FEmlMsg.MsgBody, enc);
        for c := 0 to FEmlMsg.Attachmnts.Count - 1 do
          Attachments.Add(FEmlMsg.Attachmnts[c]);
        FillMessage(IDMessage1);
      end;

      with Idmessage1 do
      begin
        Subject := FEmlMsg.MsgSubject;
        From.Address := FEmlMsg.FromAddress;
        From.Name := FEmlMsg.FromName;
        Recipients.EMailAddresses := FEmlMsg.RecipientAddress;
        if FEmlMsg.ReceiptRecipientAddress <> '' then
          ReceiptRecipient.Address := FEmlMsg.ReceiptRecipientAddress;
        if FEmlMsg.ReceiptRecipientName <> '' then
          ReceiptRecipient.Name := FEmlMsg.ReceiptRecipientName;
      end;

      with IDSMTP1 do
      begin
        if not Connected then
          Connect;
        Send(IdMessage1);
      end;

    finally
      Idmessage1.Free;
      idMBHTML.Free;
    end;
  finally
    IDSMTP1.Free;
    IdSSLIOHandlerSocketOpenSSL1.Free;
  end;
end;

Solution 2

You need the SSL dll to make the IdSSLIOHandler work.

There is info at Indy SSL Website which redirect you to Fulgan Download Site

You can download one package suitable for your platform and then include the 2 dlls with your application. I myself are using that 2 dlls with the indy components to send mail through email for over 2 years. The only problem is the sending is quite slow.

Share:
24,662
DRokie
Author by

DRokie

Updated on May 10, 2020

Comments

  • DRokie
    DRokie almost 4 years

    I am using INDY to send Email using the SMTP client on port 25 with no problem.

    Now I need to send an Email using a Gmail account and for that I need to use TLS.

    Can anyone provide a simple sample on how to do that.

    Thanks

  • DRokie
    DRokie over 12 years
    have tested your self ? I get an error on connect: EIdOSSLCouldNotLoadSSLLibrary with message ' Could not load SSL library.'
  • Remy Lebeau
    Remy Lebeau over 12 years
    Make sure you are using the correct version of the OpenSSL DLLs for your version of Indy. Use Indy's WhichFailedToLoad() function to determine which portion(s) of OpenSSL failed to load.
  • Steve F
    Steve F over 12 years
    As Remy mentioned above, you have to include the OpenSSL DLL files along with your application. They should be in the same folder as the application executable or should be in the system path (eg System32 folder). You can download the latest files from the Indy website.