Depois de alguma horas de pesquisa, devido, dificuldades no envio de e-mail usando uma conta do GMAIL e outras; tivemos que modificar o código para usar autenticação segura. Interessante que em algumas máquinas funcionava sem o serviço de autenticação (qdo descobrir o motivo eu digo, rsrsrs). Compartilho com vocês essas informações.

Alguns erros reportados durante as falhas de envio de e-mail foram: “Must issue a STARTTLS command first” (indicando que seria necessário TLS ou, autenticação de segurança) e depois de implentado o código abaixo sem baixar a OpenSSL na máquina “Could not load SSL library”.

Modificamos então, o código para permitir o envio de e-mails usando autenticação ou não. Usando autenticação, é necessário instalar a OpenSSL  e, declarar alguns units no seu código. Na web encontrei vários artigos sobre isso, mas, a maioria com informações incompletas, agradeço mesmo assim essas informações, pois me auxiliaram a entender o que precisaria fazer e, juntando as peças (copiando e colando) montei o código abaixo.

As ferramentas e recursos de desenvolvimento utilizadas são: Delphi 2010, Indy 10 (disp. no Delphi), OpenSSL e testado com uma conta do GMAIL.

Veja o código:

procedure TEnviaEmail.Execute;
var idSMTP1: TIdSMTP;
    idmessage1: TIdMessage;
    textomsg: TidText;
    IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  NameThreadForDebugging('EnviaEmail');
  erro := '';
 
  Synchronize(UpdateEmailEnviando);
  Try
    idSMTP1 := TIdSMTP.create(nil);
    idmessage1 := TIdMessage.create(nil);
 
    try
 
    // configura servidor SMTP
    idSMTP1.Host := host;     // smtp...
    idSMTP1.Username := username;
    idSMTP1.Password := password;
    idSMTP1.ConnectTimeout := 20000;
 
    // configurações adicionais servidor SMTP com autenticação
    if autenticacao then
    begin
      with idSMTP1 do
      begin
         IdSSL := nil;
         try
         port := 465;
         IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create( nil );
         IdSMTP1.IOHandler := IdSSL;
         UseTLS := utUseImplicitTLS;
         except on E: Exception do
            begin
              IOHandler := TIdIOHandler.MakeDefaultIOHandler( nil );
              UseTLS := utNoTLSSupport;
            end;
          end;
          if Assigned(IdSSL) then
          begin
            IdSSL.SSLOptions.Method := sslvSSLv3;
            IdSSL.SSLOptions.Mode := sslmClient;
          end;
          AuthType := satDefault;
      end;
 
    end;
 
    // configurando mensagem
    idmessage1.Clear;
    idmessage1.CharSet:='iso-8859-1';
    idmessage1.Encoding := MeMIME;
    idmessage1.ContentType:='multipart/related'   ;
    idmessage1.from.address := emailloja;  // e-mail do remetente
 
    // e-mail destinatario                                      |
    idmessage1.recipients.emailaddresses := emaildestinatario;
 
    // Assunto (titulo E-mail)
    idmessage1.subject := emailsubject;
 
    // Corpo da Mensagem (use aqui um HTML ou texto que deseja enviar
    // juntamente com a mensagem.
    textomsg := TIdText.Create(idmessage1.MessageParts);
    textomsg.Body.Text := 'Prezado Cliente,'+
    'Obrigado por comprar na nossa Empresa. Estamos encaminhando esse e-mail contendo'+
    ' ....';
    textomsg.ContentType := 'text/html';
 
    idSMTP1.Connect;
    if autenticacao then idSMTP1.Authenticate;
    idSMTP1.send(idmessage1);
    idSMTP1.Disconnect;
 
    Synchronize(UpdateEmailOK);
 
    except
       on e:exception do begin
       erro := e.message;
       Synchronize(UpdateEmailErro);
       end;
    end;
 
  Finally
    idmessage1.Free;
    if autenticacao then idSSL.Free;
    IdSMTP1.Free;
  End;
End;

Obs.: Não esqueça de declarar na uses: IdMessage, IdSMTP, IdMessageClient, IdExplicitTLSClientServerBase, IdSMTPBase, IdText, IdBaseComponent, IdComponent, IdSASL, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL;

Onde baixar e instalar a OpenSSL?

Para facilitar nossa vida, a Shinning Light Productions desenvolveu um instalador rápido e prático denominado Win32OpenSSL que é um projeto dedicado específicamente a prover uma instalação simples da OpenSSL. Vc pode baixar diretamente da página deles ou por exemplo no BaixaKi (etc). Existe uma versão “light” que instala apenas os recursos básicos (que devem ser suficientes) com pouco mais de 1M e, uma versão mais completa com aprox 8MB.

Posts Relacionados

Tags: , , ,



17 Comentários

  • At 2011.04.14 08:49, Solerman Kaplon said:

    Funciona em alguns micros pelo seguinte motivo: o acesso é feito com cache, se alguma aplicação acessou o email e a autenticação autorizou, todos os acessos subseqüentes daquele micro vai funcionar, independente do que você faça (mesmo que passe tipo de autenticação ou senha inválidos). Isso vale para qualquer programa, o mais comum é o usuário ter acessado com algum outlook, e depois disso passa a funcionar.

    • At 2011.04.15 11:16, admin said:

      Olá Solerman,

      Obrigado pela informação, é possível que tenha ocorrido exatamente isso na época.

      Sds

      • At 2011.05.10 17:26, irving dos santos gomes said:

        Excelente artigo.

        • At 2011.05.26 21:27, Marcelo Galvêas said:

          Caio achei o código interessante pois na verdade usa threads..
          poderia nos mostrar o código de atualização abaixo:
          (mostre a procedure)=> UpdateEmailEnviandovalew!

          • At 2011.05.26 22:07, caiooliveira said:

            Olá Marcelo,

            Segue o código:

            procedure TEnviaEmail.UpdateEmailEnviando;begin   FrmPrincipal.EmailsLog.Lines.Add('Enviando e-mail....'+chaveacesso);end;procedure TEnviaEmail.UpdateEmailOK;begin   FrmPrincipal.EmailsLog.Lines.Add('E-mail enviado com sucesso!. '+chaveacesso);end;procedure TEnviaEmail.UPdateEmailErro;begin FrmPrincipal.EmailsLog.Lines.Add('Erro ao enviar e=mail: ('+chaveacesso+'): '+username+'-'+'-'+erro)end;
            • At 2011.05.26 22:25, Anônimo said:

              Olá Marcelo,

              Quanto ao uso da thread, vc observou um detalhe importante, o envio de e-mail numa programação sem a thread pode travar o sistema no momento que o(s) e-mail(s) estão sendo enviados.

              sds

              • At 2011.06.07 20:14, Marcelo Guimarães Nogueira said:

                Parabens!!! Depois de tentar todas as alternativas possíveis a sua foi a única que funcionou.

                • At 2011.06.20 20:03, Franciel Silvestrini said:

                  Show cara, depois de 12 horas tentando de tudo foi o deu uma luz. Consegui fazer funcionar com Delphi 7. 
                  Obrigado por compartilhar!

                  • At 2011.07.05 14:36, Paladino Implacavel said:

                    Opa Caio! E aí, blz!
                    Cara, que componente vc usou da paleta Indy? Foi o TIdSMTP que você renomeou para TEnviaEmail?
                    Vlw!

                    • At 2011.07.07 18:29, Anônimo said:

                      Olá Paladino,

                      Repare que nesse caso eu criei uma Thread (TEnviaEmail); na uses vc. declara os componentes que precisa, veja no código acima.

                      Sds

                      • At 2011.08.21 16:32, Herdeson Araújo said:

                        Bom dia Caio,

                        Obrigado pelo artigo. mas quando compilo no delphi 2007 dá erro na seguinte linha:NameThreadForDebugging(‘EnviaEmail’);O que eu posso fazer.Grato,Herdeson.

                        • At 2011.09.29 14:29, Vincius Raubert Poletto Kactus said:

                          kra… muito obrigado … jah tava a 2 dias tentado resolver meu problema com o gmail … obrigadao msm

                          • At 2011.11.19 07:13, Anônimo said:

                            Tem como burlar o proxy e/ou firewall para enviar o e-mail? Tem algumas máquinas que não tem jeito de funcionar, memo utilizando o mesmo executável, com a mesma configuração de conta que funciona em outros micros.

                            • At 2012.02.23 07:15, Rodrigo Carvalho said:

                              Bom dia Caio, já tinha o envio normal de email, porém não conseguia enviar via gmail, deixei meu código igual ao seu, entretanto estou com o erro que você descreveu no inicio “Could not load SSL library”.
                              Já instalei o OpenSSL, entretando o erro persiste, sabe me dizer o que pode ser?

                              Abraço

                              • At 2012.06.02 16:43, samaritanosswdc silba gomis said:

                                quero manda emails pra muitas  pessoas do mesmo tempo  tem como   bota ai nesssi prejeto  ai ?

                                • At 2012.06.18 08:27, Bruno Manguinho said:

                                  Cara, funciona perfeitamente com o Windows XP mas no Seven da a mensagem: “Could not load SSL libraryies”

                                  Alguma dica?

                                  • At 2012.06.18 10:50, caiooliveira said:

                                    Instale o OpenSSL veja informações acima.

                                    You must be logged in to post a comment.