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

Certa vez, tive que implementar uma funcionalidade no meu software que enviasse um e-mail automático para um cliente com um anexo. Porém, o usuário não queria que houvesse interação com o cliente de e-mail (Outlook, Thunderbird…) por questões organizacionais, portanto, o e-mail deveria ser enviado diretamente pela aplicação.
Após algumas pesquisas na internet, tentativas e testes, consegui implementar a função com sucesso. Hoje venho trazer a minha contribuição para a implementação dessa funcionalidade com o Delphi 7, configurando todos os parâmetros em tempo de execução. Let’s get started!

Atualização 08/06/2015: Se você estiver utilizando o Delphi XE, confira o outro artigo neste link!

Introdução

Neste exemplo, usarei as configurações do servidor do Gmail para o envio do e-mail, porém, nada impede que outro servidor seja utilizado, desde que as configurações sejam definidas corretamente.

Para implementar essa funcionalidade é necessário 3 componentes que fazem parte do conjunto Indy: TIdSMTP, TIdSSLIOHandlerSocket e TIdMessage. No exemplo deste artigo, os 3 componentes serão criados dinamicamente, ou seja, eles serão declarados, instanciados, utilizados e então liberados da memória em um único método.

Em primeiro lugar, precisamos das bibliotecas para conexão SSL. São duas DLLs que devem ser colocadas dentro da pasta onde está o executável. Clique aqui para baixá-las.

Codificação

Em seguida, já no projeto, devemos declarar as units que fazem referência à estes 3 componentes:

Por fim, basta implementar o código abaixo no botão que fará o envio do e-mail:

Ao clicar no botão, 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 estará “travada”. A solução é implementar uma tela de espera, exibir uma mensagem ou utilizar uma Thread para que o envio seja feito em um fluxo paralelo de processamento, evitando o efeito de travamento.

Embora as propriedades no exemplo acima tenham sido atribuídas em tempo de execução, elas podem ser simplesmente definidas em tempo de projeto, utilizando o Object Inspector do Delphi. Se for um e-mail com valores fixos (conta de e-mail, servidor, assunto), talvez essa possa ser a melhor opção. Do mesmo modo, você também pode definir alguns valores fixos em tempo de projeto e informar outros valores em tempo de execução, como o destinatário e o corpo da mensagem, digitados pelo usuário em caixas de texto. No exemplo, apenas decidi por definir tudo em tempo de execução para facilitar a compreensão.

Bônus

Caso você pretenda enviar um e-mail pelo Outlook desktop, a implementação também é bem simples!

Primeiro, declare a unit ComObj na uses do seu formulário:

 E no botão para envio do e-mail, use este código:

Espero que os ajudem!
Abraço e até a próxima!


André Celestino