Email SMTP Delphi 7

08/07/2016

0

Boa tarde, alguém já conseguiu utilizar SMTP da paleta indy delphi 7. Atualizei o indy para versão 10 e fiz uma classe para receber os componentes de envio email.


Minha classe.

unit classSMTPMail;

interface
  uses Dialogs, SysUtils, Variants, dateutils, IdMessage, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
  IdMessageClient, IdSMTPBase, IdSMTP, IdServerIOHandler, IdSSL, IdSSLOpenSSL,
  IdAttachment, IdMessageParts, IdEmailAddress, IdAttachmentFile, Forms;

type
  newMail = class
    messageRecipient:string;
    messageCC : String;
    messageSubject : String;
    messageFromAddress : String;
    messageBodyAdd : String;
    messageAttachment : String;
    function sendMail() : Boolean;
  end;

implementation

uses uDMPrincipal, Biblioteca, Variaveis;

function newMail.sendMail : Boolean;
var
SMTPCon : TIdSMTP;
SMTPMsg : TIdMessage;
SMTPIOHandler : TIdSSLIOHandlerSocketOpenSSL;
SMTPAttachment : TIdAttachment;
begin
    SMTPCon := TIdSMTP.Create();
    SMTPMsg := TIdMessage.Create();
    SMTPIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create();
    DMPrincipal.db_SMTPMail.Open;
//    DMPrincipal.db_SMTPMail.Execute;
    SMTPCon.AuthType  := satDefault;
    SMTPCon.Host      := DMPrincipal.db_SMTPMailHOST.AsString;
    SMTPCon.Port      := DMPrincipal.db_SMTPMailPORT.AsInteger;
    SMTPCon.Username  := DMPrincipal.db_SMTPMailUSERNAME.AsString;
    SMTPCon.Password  := Decrypt(DMPrincipal.db_SMTPMailPASSWORD.Asstring, chave);
    SMTPCon.IOHandler := SMTPIOHandler;
    SMTPCon.UseTLS    := utUseExplicitTLS;
    with SMTPIOHandler do
        begin
            Destination            := DMPrincipal.db_SMTPMailHOST.AsString;
            Host                   := DMPrincipal.db_SMTPMailHOST.AsString;
            Port                   := DMPrincipal.db_SMTPMailPORT.AsInteger;
            SSLOptions.Method      := sslvSSLv3;
            SSLOptions.Mode        := sslmUnassigned;
            SSLOptions.VerifyMode  := [];
            SSLOptions.VerifyDepth := 0;
        end;
            //Preparar Mensagem...
            SMTPMsg.CharSet                   := 'utf-8';
            SMTPMsg.Encoding                  := meMIME;
            SMTPMsg.ContentType               := 'multipart/mixed';
            SMTPMsg.Priority                  := mpNormal;
            SMTPMsg.Date                      := Now;
            SMTPMsg.From.Name                 := 'Heitor Guarda Borges';
            SMTPMsg.Recipients.Add;
            SMTPMsg.Recipients.EMailAddresses := messageRecipient;   // Remetente
            SMTPMsg.From.Address              := messageFromAddress; // Destinatario
            if (messageCC <> '') then
            SMTPMsg.BccList.EMailAddresses    := messageCC;
            SMTPMsg.Subject                   := messageSubject; // Assunto
            SMTPMsg.Body.Add(messageBodyAdd); // Corpo

        if FileExists(messageAttachment) then
            SMTPAttachment := TIdAttachmentFile.Create(SMTPMsg.MessageParts, messageAttachment);

        try
            try
                SMTPCon.Connect();
                SMTPCon.Authenticate();
            except
              on E:Exception do
              begin
                MessageDlg('Erro ao conectar ao Serviço de Envio de Emails, se o problema persistir Contate o Administrador.'+#13+
                           'Falha na conexão e/ou autenticação: '+E.Message, mtWarning, [mbOK], 0);
                DMPrincipal.db_SMTPMail.Close;
                SMTPCon.Free;
                SMTPIOHandler.Free;
                Result := False;
                exit;
              end;
            end;
          SMTPCon.Send(SMTPMsg);
          SMTPCon.Disconnect();
          SMTPMsg.Clear;
          DMPrincipal.db_SMTPMail.Close;
        except
          on ex: exception do
          begin
            raise exception.Create('Falha no envio da mensagem.' + #13 + ex.Message);
            DMPrincipal.db_SMTPMail.Close;
            SMTPCon.Free;
            SMTPIOHandler.Free;
            Result := False;
            exit;
          end;
        end;
        Showmessage('Email enviado com sucesso para '+messageRecipient);
        DMPrincipal.db_SMTPMail.Close;        
        SMTPCon.Free;
        SMTPIOHandler.Free;
        Result := True;
end;

end.


Depois criei um formulário para usuário digitar os dados referente ao email

unit uFrmEnviaEmail;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, PngBitBtn, IdIOHandler, IdServerIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdAttachment,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdMessageParts,
  IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP,
  IdMessage, IdEmailAddress, IdAttachmentFile, ComCtrls;

type
  TFrmEnviaEmail = class(TForm)
    Panel1: TPanel;
    PngBtnFechar: TPngBitBtn;
    PngSend: TPngBitBtn;
    Label1: TLabel;
    GroupBox1: TGroupBox;
    edtRemet: TEdit;
    edtDest: TEdit;
    edtAssunto: TEdit;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    memoMSG: TMemo;
    lbAnexos: TListBox;
    PngBtnAnexar: TPngBitBtn;
    Panel2: TPanel;
    statusBar: TStatusBar;
    OpenDialog1: TOpenDialog;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure PngBtnFecharClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure PngSendClick(Sender: TObject);
    procedure PngBtnAnexarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmEnviaEmail: TFrmEnviaEmail;

implementation

uses classSMTPMail, uDMPrincipal, Biblioteca, Variaveis, UsuariosAcao;

{$R *.dfm}

procedure TFrmEnviaEmail.PngBtnFecharClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmEnviaEmail.FormShow(Sender: TObject);
begin
  DMPrincipal.db_SMTPMail.Open;
  Label1.Caption := 'Servidor(es) Ativo(s): '+IntToStr(DMPrincipal.db_SMTPMail.RecordCount);
  AcaoUser[0] := 'Acessou o uso do módulo '+FrmEnviaEmail.Caption;
  LogUsuario(DMPrincipal.Ado_usuariolog, FrmEnviaEmail.Caption, AcaoUser[0]);
end;

procedure TFrmEnviaEmail.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  DMPrincipal.db_SMTPMail.Close;
  AcaoUser[0] := 'Finalizou o uso do módulo '+FrmEnviaEmail.Caption;
  LogUsuario(DMPrincipal.Ado_usuariolog, FrmEnviaEmail.Caption, AcaoUser[0]);
end;

procedure TFrmEnviaEmail.PngSendClick(Sender: TObject);
var
  xsendmail : newMail;
  i: integer;
begin
    PngSend.Enabled              := False;
    Screen.Cursor                := crHourglass;
    statusBar.Panels[0].Text     := 'Aguarde...';
    xsendmail                    := newMail.Create;
    xsendmail.messageRecipient   := edtRemet.Text; // Remetente
    xsendmail.messageFromAddress := edtDest.Text; // Destinatario
    xsendmail.messageSubject     := edtAssunto.Text; // Assunto

    // corpo
    xsendmail.messageBodyAdd := '<html>';
    xsendmail.messageBodyAdd := '    <body>';
    xsendmail.messageBodyAdd := '        <h4>Prezado(a)</h4>';
    xsendmail.messageBodyAdd := '        <font>';
    xsendmail.messageBodyAdd := '        Para eventuais esclarecimentos, estamos em plena disposição.';
    xsendmail.messageBodyAdd := '        <hr>';
    xsendmail.messageBodyAdd := '        <font>';
    xsendmail.messageBodyAdd := '        '+MemoMSG.Text;
    xsendmail.messageBodyAdd := '        </font>';
    xsendmail.messageBodyAdd := '        <b><font>';
    xsendmail.messageBodyAdd := '        <hr>';
    xsendmail.messageBodyAdd := '        ''Isoft - ''
';
    xsendmail.messageBodyAdd := '        <font>';
    xsendmail.messageBodyAdd := '        ''rua paraguai, 3118''
';
    xsendmail.messageBodyAdd := '        </font>';
    xsendmail.messageBodyAdd := '        </font></b>';
    xsendmail.messageBodyAdd := '    </body>';
    xsendmail.messageBodyAdd := '</html>';

    // anexa os arquivos
    if lbAnexos.Items.Count > 0 then
    begin
      for i := 0 to lbAnexos.Items.Count -1 do
        xsendmail.messageAttachment := lbAnexos.Items.Strings[i];
    end;
    try
       except
          On Exc:Exception do
          begin
              ShowMessage('Erro ao carregar o anexo. Verifique o item anexado e tente novamente!');
              abort;
          end;
    end;

    if (xsendmail.sendMail()) then
    begin
        xsendmail.Destroy;
        statusBar.Panels[0].Text := 'Concluído!!!';
        Screen.Cursor   := crDefault;
        PngSend.Enabled := True;
    end
    else
    begin
        xsendmail.Destroy;
        statusBar.Panels[0].Text := 'Falha no envio do email!!!';
        Screen.Cursor   := crDefault;
        PngSend.Enabled := True;
    end;
end;

procedure TFrmEnviaEmail.PngBtnAnexarClick(Sender: TObject);
var
  i: integer;
begin
  if OpenDialog1.Execute then
  begin
    for i:= 0 to OpenDialog1.Files.Count -1 do
    if (lbAnexos.Items.IndexOf(OpenDialog1.Files[i]) = -1) then
      lbAnexos.Items.Add(OpenDialog1.Files[i])
  end;
end;

end.


e ai esta o codigo desse formulário, porém, ao executar esta me retornando erro "SSL negotiation failed"

Tenho as DLL libeay32.dll e ssleay32.dll dentro da pasta do meu projeto e ambas versao 0.9.8.17.

Onde pode esta o erro no meu codigo ou configuracao, se alguem tiver um exemplo funcionando ficarei muito grato
Iramar Junior

Iramar Junior

Responder

Posts

08/07/2016

Marcelo Calmon

Olá Iramar, tudo bem?

Estou com um problema parecido com o seu, até postei a situação no fórum. Acessando seu problema verifiquei que você consegui a versão0.9.8.17 das DLL libeay32 e ssleay32. Se não for incomodo para você, será possível enviá-las para meu email, mcsolucao@yahoo.com.br. Se eu obtiver sucesso com o meu problema lhe informo.

Obrigado.

Marcelo Calmon
Responder

09/07/2016

Hamilton Oliveira

Olá pessoa!

Tive o mesmo problema e depois de muitas tentativas descobri que o erro não era nos códigos e nem das dlls e sim na permissão do Gmail de acesso com "dispositivos menos seguros".
Você tem que ativar o seu acesso na sua conta do gmail para o acesso.
Veja mais no link https://support.google.com/accounts/answer/6010255?hl=pt-BR.

Estou usando o Delphi Xe7 e funcionou beleza.

Qualquer coisa posto o meu código pra você testar.

Abraço.
Responder

11/07/2016

Eduardo Silva

Tive o mesmo problema e depois de muitas tentativas descobri que o erro não era nos códigos e nem das dlls e sim na permissão do Gmail de acesso com "dispositivos menos seguros".

Eu já tintei isso e não funcionou a dois dias atras o meu sistema estava funcionando tudo beleza hoje não consigo mandar e-mails pelo sistema apresentando as mensagens 'Could not load SSL library.'ou 'connection closed gracefully' ou 'SSL is not available on this server.' eu estava utilizando as Dll indy_openssl096 não sei se tem uma versão mais atual para para o indy10 do Delphi7.
se alguém tiver essas Dlls mais atuais para o Delphi 7 e indy 10.1.5 favor passa o link de onde baixar e qual é a versão a ser baixada.
Responder

10/05/2023

Haroldo Junior

Tive o mesmo problema e depois de muitas tentativas descobri que o erro não era nos códigos e nem das dlls e sim na permissão do Gmail de acesso com "dispositivos menos seguros".

Eu já tintei isso e não funcionou a dois dias atras o meu sistema estava funcionando tudo beleza hoje não consigo mandar e-mails pelo sistema apresentando as mensagens 'Could not load SSL library.'ou 'connection closed gracefully' ou 'SSL is not available on this server.' eu estava utilizando as Dll indy_openssl096 não sei se tem uma versão mais atual para para o indy10 do Delphi7.
se alguém tiver essas Dlls mais atuais para o Delphi 7 e indy 10.1.5 favor passa o link de onde baixar e qual é a versão a ser baixada.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar