Enviando Emails com Delphi + Indy 10

Delphi

21/10/2013

Depois de passar certo trabalho para configurar e testar, decidi postar aqui um código fonte bem simples e que funciona para envio de emails utilizando o delphi e indy 10.

Testes utilizando o Indy 10 para servidores Gmail, Hotmail, Yahoo e Servidor Próprio!

Abaixo segue o código fonte:

var
IdSMTP1: TIdSMTP;
Idmessage: TIdMessage;
TextoMsg: TidText;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
IdSMTP1 := TIdSMTP.create(nil);
IdSMTP1.ConnectTimeout := 10000;
IdSMTP1.ReadTimeout := 10000;

IdMessage := TIdMessage.create(nil);
IdMessage.Clear;
IdMessage.CharSet := 'iso-8859-1';
IdMessage.Encoding := MeMIME;
IdMessage.ContentType := 'multipart/related' ;
IdMessage.subject := 'Assunto';

textomsg := TIdText.Create(IdMessage.MessageParts);
textomsg.Body.Text := 'Se você consegue ler isto então é porque funcionou o teste!';
textomsg.ContentType := 'text/html';

if ((cbtipo.itemindex = 0) or (cbtipo.itemindex = 2)) then
begin
// GMAIL e YAHOO

if cbtipo.itemindex = 0 then
begin
idSMTP1.Host := 'smtp.gmail.com';
idSMTP1.Username := 'email@gmail.com';
idSMTP1.Password := 'senha';
end
else begin
idSMTP1.Host := 'smtp.mail.yahoo.com';
idSMTP1.Username := 'email@yahoo.com.br';
idSMTP1.Password := 'senha';
end;

IdMessage.from.address := idSMTP1.Username;
IdMessage.recipients.emailaddresses := 'teste@hotmail.com';

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;

//***************************** xxxxxxxxxxxxxxxx ***************************

if ((cbtipo.itemindex = 1) or (cbtipo.itemindex = 3)) then
begin
// HOTMAIL e SERVIDOR PROPRIO

idSMTP1.Port := 587;

if cbtipo.itemindex = 1 then
begin
idSMTP1.Host := 'smtp.live.com';
idSMTP1.Username := 'email@hotmail.com';
idSMTP1.Password := 'senha';
end
else begin
idSMTP1.Host := 'smtp.servidorproprio.inf.br';
idSMTP1.Username := 'email@servidorproprio.inf.br';
idSMTP1.Password := 'senha';
end;

IdMessage.from.address := idSMTP1.Username;
IdMessage.recipients.emailaddresses := 'teste@hotmail.com';

with idSMTP1 do
begin
IdSSL := nil;

try
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create( nil );
IdSMTP1.IOHandler := IdSSL;
UseTLS := utUseExplicitTLS;

IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.PassThrough := true;
except on E: Exception do
begin
IOHandler := TIdIOHandler.MakeDefaultIOHandler( nil );
UseTLS := utNoTLSSupport;
end;
end;
end;
end;

idSMTP1.Connect;

try
idSMTP1.send(IdMessage);
except
on E : Exception do
begin
Memo1.Lines.Add(e.Message);
end;
end;

idSMTP1.Disconnect;

IdMessage.Free;
IdSMTP1.Free;



Qualquer dúvida podem entrar em contato pelo email: diego_udesc@hotmail.com

Diego Bolognini

Diego Bolognini

Curtidas 1

Respostas

Deivison Melo

Deivison Melo

21/10/2013

Obrigado por compartilhar com o pessoal do fórum sua experiência com envio de e-mail´s!

É isso aí!

Abração e bons códigos!!
GOSTEI 0
Gilmar Silva

Gilmar Silva

21/10/2013

Obrigado, Obrigado, Obrigadoooooooo
GOSTEI 0
Gilmar Silva

Gilmar Silva

21/10/2013

Como penei até achar seu código, funcionou.. Obrigado.
GOSTEI 0
Carlos Eduardo

Carlos Eduardo

21/10/2013

Olhei
Gostei
Melhorei kkk

Pega o meu melhora e posta tbm :)

unit uClass_Mail;

interface

// É necessario Configurar o host
// no gmail basta Ativa o POP3 ou algo parecido

uses
  IdSMTP, IdSSLOpenSSL, IdMessage, IdText, IdAttachmentFile,
  IdExplicitTLSClientServerBase,Vcl.StdCtrls, System.SysUtils, Vcl.Dialogs,
  System.UITypes;

type
  TMail = Class
  Strict Private
    // Parametros de Configuração de Email
    Port: integer;    // porta do servidor de email     ex // ''''''''465'''''''' porta do gmail
    host: String;     // host do servidor de email      ex // ''''''''smtp.gmail.com'''''''' host do gmail
    UserName: string; // username do servidor de email  ex // ''''''''devsouza01@gmail.com''''''''
    Password: String; // Senha do Username(Email) do servidor de Email
    // Conteudo da Mensagem

  private
    IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
    IdSMTP: TIdSMTP;
    IdMessage: TIdMessage;
    IdText: TIdText;
    // Conteudo do Email
    FFromAddress: String;       // Endereco de Partida
    FFromName: String;          // Nome Do usuario de Partida
    FRecipientsAddress: String; // Endereco do Destinatario
    FBody: String;              // Corpo da Mensagem
    FSubject: String;           // Assunto
    FReplyToAddress: String;    // Responder a
    FAttachment: String;        // Caminho do Anexo
    procedure SetBody(const Value: String);
    procedure SetFromAddress(const Value: String);
    procedure SetFromName(const Value: String);
    procedure SetRecipientsAddress(const Value: String);
    procedure SetReplyToAddress(const Value: String);
    procedure SetSubject(const Value: String);
    procedure SetAttachment(const Value: String);
    function GetAttachment: String;
    function GetBody: String;
    function GetFromAddress: String;
    function GetFromName: String;
    function GetRecipientsAddress: String;
    function GetReplyToAddress: String;
    function GetSubject: String;
  Public
    // proriedades
    property FromAddress        : String read GetFromAddress write SetFromAddress;
    property FromName           : String read GetFromName write SetFromName;
    property ReplyToAddress     : String read GetReplyToAddress write SetReplyToAddress;
    property RecipientsAddress  : String read GetRecipientsAddress write SetRecipientsAddress;
    property Subject            : String read GetSubject write SetSubject;
    Property Body               : String read GetBody write SetBody;
    property Attachment         : String read GetAttachment write SetAttachment;

    // Metodos
    procedure Send(); // Procedure para enviar Email
    constructor Create();
    destructor Destroy();override;
  End;

implementation

{ TMail }

constructor TMail.Create;
begin
  // pegar do arquivo .ini ou Direto da base de dados
  Self.Port     := 465;
  Self.host     := ''''''''smtp.gmail.com'''''''';
  Self.UserName := ''''''''sistema.convexus@gmail.com'''''''';
  Self.Password := ''''''''@Function773'''''''';


  // instanciação dos objetos Necesarios
  IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create();
  IdSMTP := TIdSMTP.Create();
  IdMessage := TIdMessage.Create();
  try
    // Configuração do protocolo SSL (TIdSSLIOHandlerSocketOpenSSL)
    IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;

    // Configuração do servidor SMTP (TIdSMTP)
    IdSMTP.IOHandler := IdSSLIOHandlerSocket;
    IdSMTP.UseTLS := utUseImplicitTLS;
    IdSMTP.AuthType := satDefault;

    // Configuração do servidor de Email
    IdSMTP.Port     := Self.Port;
    IdSMTP.host     := Self.host;
    IdSMTP.UserName := Self.UserName;
    IdSMTP.Password := Self.Password;

  except
    on e: Exception do
      ShowMessage(''''''''Erro ao instanciar Email.'''''''');
  end;
end;

destructor TMail.Destroy;
begin
  FreeAndNil(IdSSLIOHandlerSocket);
  FreeAndNil(IdSMTP);
  FreeAndNil(IdMessage);
  inherited;
end;

function TMail.GetAttachment: String;
begin
  Result := FAttachment;
end;

function TMail.GetBody: String;
begin
  if Self.FBody.IsEmpty then
    raise Exception.Create(''''''''Corpo da Mensagem Vazio'''''''')
  else
    Result := FBody;
end;

function TMail.GetFromAddress: String;
begin
  Result := FFromAddress;
end;

function TMail.GetFromName: String;
begin
  Result := FFromName;
end;

function TMail.GetRecipientsAddress: String;
begin
  if Self.FRecipientsAddress.IsEmpty then
    raise Exception.Create(''''''''Sem destinatario.'''''''')
  else
    Result := FRecipientsAddress;
end;

function TMail.GetReplyToAddress: String;
begin
  Result := FReplyToAddress;
end;

function TMail.GetSubject: String;
begin
  if Self.FSubject.IsEmpty then
    raise Exception.Create(''''''''Sem Assunto.'''''''')
  else
    Result := FSubject;
end;

procedure TMail.Send;
begin
  try
    // Configuração da mensagem (TIdMessage)
    IdMessage.From.Address            := self.FromAddress;
    IdMessage.From.Name               := self.FromName;
    IdMessage.ReplyTo.EMailAddresses  := self.ReplyToAddress;
    IdMessage.Recipients.Add.Text     := self.RecipientsAddress;
    IdMessage.Subject                 := self.Subject;
    IdMessage.Encoding                := meMIME;

    // Configuração do corpo do email (TIdText)
    IdText := TIdText.Create(IdMessage.MessageParts);


    IdText.Body.Add(self.Body); // Corpo da mensagem

    IdText.ContentType := ''''''''text/html; charset=utf-8'''''''';// TextPlan = Texto Puro; Text/html = Formatado Com template

    //Opcional - Anexo da mensagem (TIdAttachmentFile)
    if not(Attachment.IsEmpty) then
      if FileExists(Self.Attachment) then
      begin
        TIdAttachmentFile.Create(IdMessage.MessageParts, Self.Attachment);
      end;

  except
    on e : Exception do ShowMessage(e.Message);
  end;

  try
    // Conexão e autenticação
    try
      IdSMTP.Connect;
      IdSMTP.Authenticate;
    except
      on e: Exception do
      begin
        //ShowMessage(e.Message);
        Exit;
      end;
    end;

    // Envio da mensagem
    try
      IdSMTP.Send(IdMessage);
      // ShowMessage(''''''''Mensagem Enviada!'''''''');
    except
      On e: Exception do ShowMessage(e.Message);
    end;
  finally
    // desconecta do servidor
    IdSMTP.Disconnect;
    // liberação da DLL
    UnLoadOpenSSLLibrary;
  end;
end;

procedure TMail.SetAttachment(const Value: String);
begin
  FAttachment := Value;
end;

procedure TMail.SetBody(const Value: String);
begin
  FBody := Value;
end;

procedure TMail.SetFromAddress(const Value: String);
begin
  FFromAddress := Value;
end;

procedure TMail.SetFromName(const Value: String);
begin
  FFromName := Value;
end;

procedure TMail.SetRecipientsAddress(const Value: String);
begin
  FRecipientsAddress := Value;
end;

procedure TMail.SetReplyToAddress(const Value: String);
begin
  FReplyToAddress := Value;
end;

procedure TMail.SetSubject(const Value: String);
begin
  FSubject := Value;
end;

end.

GOSTEI 0
Carlos Eduardo

Carlos Eduardo

21/10/2013

Olhei
Gostei
Melhorei kkk

Pega o meu melhora e posta tbm :)

unit uClass_Mail;

interface

// É necessario Configurar o host
// no gmail basta Ativa o POP3 ou algo parecido

uses
  IdSMTP, IdSSLOpenSSL, IdMessage, IdText, IdAttachmentFile,
  IdExplicitTLSClientServerBase,Vcl.StdCtrls, System.SysUtils, Vcl.Dialogs,
  System.UITypes;

type
  TMail = Class
  Strict Private
    // Parametros de Configuração de Email
    Port: integer;    // porta do servidor de email     ex // ''''''''465'''''''' porta do gmail
    host: String;     // host do servidor de email      ex // ''''''''smtp.gmail.com'''''''' host do gmail
    UserName: string; // username do servidor de email  ex // ''''''''devsouza01@gmail.com''''''''
    Password: String; // Senha do Username(Email) do servidor de Email
    // Conteudo da Mensagem

  private
    IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
    IdSMTP: TIdSMTP;
    IdMessage: TIdMessage;
    IdText: TIdText;
    // Conteudo do Email
    FFromAddress: String;       // Endereco de Partida
    FFromName: String;          // Nome Do usuario de Partida
    FRecipientsAddress: String; // Endereco do Destinatario
    FBody: String;              // Corpo da Mensagem
    FSubject: String;           // Assunto
    FReplyToAddress: String;    // Responder a
    FAttachment: String;        // Caminho do Anexo
    procedure SetBody(const Value: String);
    procedure SetFromAddress(const Value: String);
    procedure SetFromName(const Value: String);
    procedure SetRecipientsAddress(const Value: String);
    procedure SetReplyToAddress(const Value: String);
    procedure SetSubject(const Value: String);
    procedure SetAttachment(const Value: String);
    function GetAttachment: String;
    function GetBody: String;
    function GetFromAddress: String;
    function GetFromName: String;
    function GetRecipientsAddress: String;
    function GetReplyToAddress: String;
    function GetSubject: String;
  Public
    // proriedades
    property FromAddress        : String read GetFromAddress write SetFromAddress;
    property FromName           : String read GetFromName write SetFromName;
    property ReplyToAddress     : String read GetReplyToAddress write SetReplyToAddress;
    property RecipientsAddress  : String read GetRecipientsAddress write SetRecipientsAddress;
    property Subject            : String read GetSubject write SetSubject;
    Property Body               : String read GetBody write SetBody;
    property Attachment         : String read GetAttachment write SetAttachment;

    // Metodos
    procedure Send(); // Procedure para enviar Email
    constructor Create();
    destructor Destroy();override;
  End;

implementation

{ TMail }

constructor TMail.Create;
begin
  // pegar do arquivo .ini ou Direto da base de dados
  Self.Port     := 465;
  Self.host     := ''''''''smtp.gmail.com'''''''';
  Self.UserName := ''''''''DevSouza01@gmail.com'''''''';//'''''''''''''''''''''''Email de Voces Aki'''''''''''''''''''''''''''''''
  Self.Password := ''''''''@Function753'''''''';//'''''''''''''''''''''''''''''''''''''''''''''''Senha do email de Voces Aki'''''''''''''''''''''''''''''''


  // instanciação dos objetos Necesarios
  IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create();
  IdSMTP := TIdSMTP.Create();
  IdMessage := TIdMessage.Create();
  try
    // Configuração do protocolo SSL (TIdSSLIOHandlerSocketOpenSSL)
    IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;

    // Configuração do servidor SMTP (TIdSMTP)
    IdSMTP.IOHandler := IdSSLIOHandlerSocket;
    IdSMTP.UseTLS := utUseImplicitTLS;
    IdSMTP.AuthType := satDefault;

    // Configuração do servidor de Email
    IdSMTP.Port     := Self.Port;
    IdSMTP.host     := Self.host;
    IdSMTP.UserName := Self.UserName;
    IdSMTP.Password := Self.Password;

  except
    on e: Exception do
      ShowMessage(''''''''Erro ao instanciar Email.'''''''');
  end;
end;

destructor TMail.Destroy;
begin
  FreeAndNil(IdSSLIOHandlerSocket);
  FreeAndNil(IdSMTP);
  FreeAndNil(IdMessage);
  inherited;
end;

function TMail.GetAttachment: String;
begin
  Result := FAttachment;
end;

function TMail.GetBody: String;
begin
  if Self.FBody.IsEmpty then
    raise Exception.Create(''''''''Corpo da Mensagem Vazio'''''''')
  else
    Result := FBody;
end;

function TMail.GetFromAddress: String;
begin
  Result := FFromAddress;
end;

function TMail.GetFromName: String;
begin
  Result := FFromName;
end;

function TMail.GetRecipientsAddress: String;
begin
  if Self.FRecipientsAddress.IsEmpty then
    raise Exception.Create(''''''''Sem destinatario.'''''''')
  else
    Result := FRecipientsAddress;
end;

function TMail.GetReplyToAddress: String;
begin
  Result := FReplyToAddress;
end;

function TMail.GetSubject: String;
begin
  if Self.FSubject.IsEmpty then
    raise Exception.Create(''''''''Sem Assunto.'''''''')
  else
    Result := FSubject;
end;

procedure TMail.Send;
begin
  try
    // Configuração da mensagem (TIdMessage)
    IdMessage.From.Address            := self.FromAddress;
    IdMessage.From.Name               := self.FromName;
    IdMessage.ReplyTo.EMailAddresses  := self.ReplyToAddress;
    IdMessage.Recipients.Add.Text     := self.RecipientsAddress;
    IdMessage.Subject                 := self.Subject;
    IdMessage.Encoding                := meMIME;

    // Configuração do corpo do email (TIdText)
    IdText := TIdText.Create(IdMessage.MessageParts);


    IdText.Body.Add(self.Body); // Corpo da mensagem

    IdText.ContentType := ''''''''text/html; charset=utf-8'''''''';// TextPlan = Texto Puro; Text/html = Formatado Com template

    //Opcional - Anexo da mensagem (TIdAttachmentFile)
    if not(Attachment.IsEmpty) then
      if FileExists(Self.Attachment) then
      begin
        TIdAttachmentFile.Create(IdMessage.MessageParts, Self.Attachment);
      end;

  except
    on e : Exception do ShowMessage(e.Message);
  end;

  try
    // Conexão e autenticação
    try
      IdSMTP.Connect;
      IdSMTP.Authenticate;
    except
      on e: Exception do
      begin
        //ShowMessage(e.Message);
        Exit;
      end;
    end;

    // Envio da mensagem
    try
      IdSMTP.Send(IdMessage);
      // ShowMessage(''''''''Mensagem Enviada!'''''''');
    except
      On e: Exception do ShowMessage(e.Message);
    end;
  finally
    // desconecta do servidor
    IdSMTP.Disconnect;
    // liberação da DLL
    UnLoadOpenSSLLibrary;
  end;
end;

procedure TMail.SetAttachment(const Value: String);
begin
  FAttachment := Value;
end;

procedure TMail.SetBody(const Value: String);
begin
  FBody := Value;
end;

procedure TMail.SetFromAddress(const Value: String);
begin
  FFromAddress := Value;
end;

procedure TMail.SetFromName(const Value: String);
begin
  FFromName := Value;
end;

procedure TMail.SetRecipientsAddress(const Value: String);
begin
  FRecipientsAddress := Value;
end;

procedure TMail.SetReplyToAddress(const Value: String);
begin
  FReplyToAddress := Value;
end;

procedure TMail.SetSubject(const Value: String);
begin
  FSubject := Value;
end;

end.




No Create Altere o UserName e Password para o email De vcs :)
GOSTEI 0
Carlos Eduardo

Carlos Eduardo

21/10/2013

Evento do Click

procedure TForm1.Button4Click(Sender: TObject);
var
  Mail : TMail;
begin
  try
    Mail := TMail.Create;

    Mail.FromAddress        := 'DevSouza01@outlook.com';
    Mail.FromName           := 'Andre Souza dos Santos';
    Mail.ReplyToAddress     := 'DevSouza02@outlook.com';
    Mail.RecipientsAddress  := 'DevSouza01@gmail.com';
    Mail.Subject            := 'Assunto da Mensagem';
    Mail.Body               := 'Corpo da Mensagem';
    //Mail.Attachment         := OpenDialog.FileName;
    Mail.Send;

  finally
    FreeAndNil(Mail);
  end;
end;

GOSTEI 0
POSTAR