[Delphi XE] Envio de e-mail com componentes Indy

Boa noite, leitores!
O título do artigo parece um pouco familiar, não é? Sim, já postei um artigo referente a envio de e-mails pelo Delphi 7 em dezembro de 2013, porém, após a publicação, notei que muitas, muitas dúvidas foram postadas nos comentários e enviadas por e-mail, principalmente por desenvolvedores que utilizam as versões da família XE do Delphi com Indy. Pois bem, vamos considerar que o artigo de hoje é um “remake” daquela dica, trazendo algumas modificações e melhorias, claro, direcionadas para o Delphi XE.

Introdução

Pessoal, para o exemplo apresentado no artigo, utilizarei novamente o servidor do Gmail, no entanto, nada impede o uso de outros servidores, desde que as configurações sejam definidas corretamente (servidor SMTP, porta, tipo de autenticação e protocolos de segurança).
Dessa vez, como estamos codificando a funcionalidade no Delphi XE, trabalharemos com 5 objetos do conjunto Indy, criados em tempo de execução: TIdSMTP, TIdMessage, TIdText, TIdAttachmentFile e TIdSSLIOHandlerSocketOpenSSL. Cada um destes objetos serão instanciados, interligados, utilizados e, após o envio, liberados da memória.

Primeiramente, é importante lembrar que as DLLs ssleay32.dll e libeay32.dll são necessárias para o envio do e-mail e devem ser copiadas para a mesma pasta onde está o executável. Muitos desenvolvedores copiam as DLLs para a pasta em que o arquivo DPROJ se encontra, já que o Delphi 7, por padrão, cria o arquivo executável na mesma pasta do projeto. Porém, as versões mais recentes do Delphi geram o executável no subdiretório \plataforma\configuração, como, por exemplo, Win32\Debug. É nesse diretório que as DLLs devem ser copiadas!

Antes que eu me esqueça, uma observação: existem várias versões disponíveis dessas DLLs. Já ajudei desenvolvedores que tentaram utilizar a versão compatível com o Delphi 7 em um projeto no Delphi XE e se depararam com alguns avisos de incompatibilidade. Portanto, para o Delphi XE, clique aqui para baixar a versão correta.

Codificação

Bom, mãos à obra!
Antes de iniciarmos a codificação, devemos declarar as units das classes do Indy na seção uses do formulário:

Em seguida, já podemos implementar o código de envio do e-mail (atentem-se aos comentários):

Ao realizar o envio, haverá uma pausa de alguns segundos durante a conexão, autenticação e envio da mensagem. Nesse meio tempo, teremos a impressão de que a aplicação não estará respondendo. Para evitar este efeito, eu sugiro implementar uma tela de espera (com um GIF animado, por exemplo), exibir uma mensagem de processamento ou utilizar uma Thread para que o envio seja feito em um fluxo paralelo de processamento.

Embora as propriedades no exemplo acima tenham sido atribuídas em tempo de execução, elas também podem, opcionalmente, ser definidas em tempo de projeto, utilizando o Object Inspector. Se o e-mail possui valores fixos (conta de e-mail, servidor, assunto), talvez essa possa ser a melhor opção devido à redução das linhas de código. Mesmo assim, alguns valores deverão ser informados em tempo de execução, como o destinatário e o corpo da mensagem, digitados pelo usuário em caixas de texto.

Só a título de conhecimento, caso a aplicação não esteja conseguindo se conectar ao servidor, talvez seja necessário alterar algumas configurações na conta do Gmail, conforme as orientações dispostas neste link.

Bônus 1

Para enviar um e-mail formatado em HTML, basta utilizar o objeto TIdText no exemplo acima e inserir as tags da linguagem:

Bônus 2

Caso esteja utilizando o servidor do Terra, utilize as configurações a seguir (colaboração do leitor Ricardo Silva):

Bônus 3

Aproveitando a dica acima, confira também as configurações do servidor do Office365:

 

Grande abraço, leitores! Até mais!


André Celestino