Envio de E-mail com Delphi 2010, Indy 10, OpenSSL e GMail
Código-Fonte, Delphi, Open Source, Programação abril 7th, 2011
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.
Tags: componente, Delphi, E-mail, Open Source