Enviar e-mail para gmail (Indy)
Pelo muito que eu pesquisei por fóruns e blogs, enviar e-mail usando um programinha simples é igual cabeça de bacalhal. As pessoas falam que existe mas é difícil alguém demonstrar.
Estou tentando fazer algo muito simples. Clicar em um botão e enviar o texto para um e-mail.Eu escolhi o Gmail por que as pessoas falam que funciona com ele.
O meu código é esse:
Coloquei as dll's libeay32.dll e ssleay32.dll na pasta do projeto e também na pasta system32 do Windows.Porém quando eu clico no botão de enviar do meu programa, aparece um erro dizendo que não foi possível carregar SSL Library.
Eu já ativei lá no meu e-mail também para acessar o gmail de outros programas e tal.As dll's eu baixei daqui: http://indy.fulgan.com/SSL/Archive/indy_openssl096.zip
Meu Delphi é 2009.
Se alguém aí consegue enviar mensagem para um e-mail usando Delphi e pode me ajudar, fico muito agradecido.Vi inúmeros tutoriais sobre isso e muitos posts em foruns também, mas cada um com um problema mais cabeludo do que o outro e no final ou o post era abandonado ou a pessoa resolvia mas não ficava claro todos os mecanismos que foram utilizados para se obter um resultado satisfatório.
Se eu conseguir fazer isso vou criar um tutorial muito bem explicadinho e com links para download até do programa funcionando para ajudar outras pessoas.
Obrigado!
Estou tentando fazer algo muito simples. Clicar em um botão e enviar o texto para um e-mail.Eu escolhi o Gmail por que as pessoas falam que funciona com ele.
O meu código é esse:
procedure TForm1.Button1Click(Sender: TObject);begin with MSG do begin Body.Add('corpo da mensagem'); From.Address := 'programadorlegaldemais@gmail.com'; //opcional From.Name := 'Enviador'; //opcional Recipients.Add; Recipients.Items[0].Address := 'programadorlegaldemais@gmail.com'; Recipients.Items[0].Name := 'Receptor'; //opcional Subject := 'assunto da mensagem'; end;
try SMTP.Connect(); SMTP.Send(MSG); SMTP.Disconnect; Sleep(1000); except ShowMessage('Falha no envio!'); exit; end; ShowMessage('Mensagem enviada com sucesso!');end;
procedure TForm1.FormCreate(Sender: TObject);begin with SMTP do begin //AuthenticationType := atLogin; Host := 'smtp.gmail.com'; IOHandler := SSLSocket; Password := 'abcdef123'; Port := 465; Username := 'programadorlegaldemais@gmail.com'; //não esqueça o @gmail.com!! end;
SMTP.IOHandler := SSLSocket; {Trata a segurança e criptografia} SSLSocket.SSLOptions.Method := sslvSSLv2; SSLSocket.SSLOptions.Mode := sslmClient;
MSG.Priority := mpNormal; //prioridade
end;Coloquei as dll's libeay32.dll e ssleay32.dll na pasta do projeto e também na pasta system32 do Windows.Porém quando eu clico no botão de enviar do meu programa, aparece um erro dizendo que não foi possível carregar SSL Library.
Eu já ativei lá no meu e-mail também para acessar o gmail de outros programas e tal.As dll's eu baixei daqui: http://indy.fulgan.com/SSL/Archive/indy_openssl096.zip
Meu Delphi é 2009.
Se alguém aí consegue enviar mensagem para um e-mail usando Delphi e pode me ajudar, fico muito agradecido.Vi inúmeros tutoriais sobre isso e muitos posts em foruns também, mas cada um com um problema mais cabeludo do que o outro e no final ou o post era abandonado ou a pessoa resolvia mas não ficava claro todos os mecanismos que foram utilizados para se obter um resultado satisfatório.
Se eu conseguir fazer isso vou criar um tutorial muito bem explicadinho e com links para download até do programa funcionando para ajudar outras pessoas.
Obrigado!
Ricardo
Curtidas 0
Respostas
José Araújo
07/07/2011
Boa tarde!!
Cara criei um objeto especializado no envio de email.
Implementa ai e testa.
Cara criei um objeto especializado no envio de email.
Implementa ai e testa.
unit uSendEMail;
interface
uses
IdMessage, IdSMTP, uSystemConfig, SysUtils, uSystemUtils, Classes;
type
TSendEMail = class
private
FMailMessage: TIdMessage;
FSMTP: TIdSMTP;
FListMensage: TStringList;
{ Private declarations }
public
constructor Create;
destructor Destroy; override;
//
property ListMensage: TStringList read FListMensage write FListMensage;
procedure SendEMail;
{ Public declarations }
end;
implementation
{ TSendEMail }
constructor TSendEMail.Create;
begin
FListMensage := TStringList.Create;
//
FMailMessage := TIdMessage.Create( nil );
FMailMessage.Encoding := meMIME;
//
FSMTP := TIdSMTP.Create( nil );
FSMTP.AuthType := satNone;
FSMTP.Port := 25;
FSMTP.ReadTimeout := 0;
end;
destructor TSendEMail.Destroy;
begin
if FSMTP.Connected then
FSMTP.Disconnect;
//
FListMensage.Free;
FMailMessage.Free;
FSMTP.Free;
inherited Destroy;
end;
procedure TSendEMail.SendEMail;
begin
//setup SMTP
FSMTP.Host := 'smtp';
//
//setup mail message
FMailMessage.From.Address := 'endereco';
FMailMessage.Recipients.EMailAddresses := 'Destino';
//
FMailMessage.Subject := 'titulo';
FMailMessage.Body.Text := FListMensage.Text;
//
//send mail
try
try
FSMTP.Connect;
FSMTP.Send( FMailMessage );
except
on E: Exception do
ShowMsgWarning( E.message );
end;
finally
if FSMTP.Connected then
FSMTP.Disconnect;
end;
end;
end.
GOSTEI 0
Emerson Nascimento
07/07/2011
eu envio normalmente com esse código:
var
AutenticouSMTP: boolean;
begin
//** configura SMTP **
if ClienteSMTP.Connected then
try
ClienteSMTP.Disconnect;
except
end;
ClienteSMTP.Host := FParametrosEmail.SMTPHost; // atribui o host (pop.gmail.com)
ClienteSMTP.Port := FParametrosEmail.SMTPPorta; // atribui a porta (465)
if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao
begin
ClienteSMTP.Username := FParametrosEmail.SMTPUsername; // atribui o nome do usuario
ClienteSMTP.Password := FParametrosEmail.SMTPPassword; // atribui a senha
end
else
begin // se não requer autenticacao
ClienteSMTP.Username := ''; // limpa o usuario
ClienteSMTP.Password := ''; // limpa a senha
end;
if FParametrosEmail.SMTPSSL then // se requer conexao segura
begin
ClienteSMTP.IOHandler := SSLHandlerSMTP; // vincula o manipulador de SMTP ao cliente SMTP
ClienteSMTP.UseTLS := utUseImplicitTLS; // atribui ao cliente SMTP o suporte implícito a TLS
SSLHandlerSMTP.Port := ClienteSMTP.Port; // atribui a porta ao manipulador (igual a do cliente FTP)
SSLHandlerSMTP.Destination := ClienteSMTP.Host + ':' + IntToStr(ClienteSMTP.Port); // indica o destino da conexão (pop.gmail.com:465)
SSLHandlerSMTP.Host := ClienteSMTP.Host; // atribui o host (pop.gmail.com)
end
else
begin // se não requer conexao segura
ClienteSMTP.IOHandler := nil; // desvincula o manipulador de SMTP
ClienteSMTP.UseTLS := utNoTLSSupport; // indica que nao ha suporte a TLS
end;
AutenticouSMTP := False; // variavel para indicar se a autenticacao foi bem sucedida
// *** montagem da mensagem ***
// ****************************
// cabecalho
IdMessage1.Clear;
IdMessage1.ContentType := 'text/html';
IdMessage1.From.Address := FParametrosEmail.SMTPConta; // conta do remetente
IdMessage1.From.Name := FParametrosEmail.SMTPNomeExibicao; // nome do remetente
IdMessage1.Recipients.EMailAddresses := FParametrosEmail.SMTPDestinatarios; // destinatarios (separados por vírgula! não é ponto e vírgula!)
IdMessage1.Subject := 'Envio de email automatico'; // assunto
// corpo
IdMessage1.Body.Clear;
IdMessage1.Body.Add('<html>');
IdMessage1.Body.Add(' <body>');
IdMessage1.Body.Add(' <h4>SISTEMA DE EMAIL AUTOMATICO</h4>');
IdMessage1.Body.Add(' <font face="Verdana" size=2>');
IdMessage1.Body.Add(' Teste de envio de email');
IdMessage1.Body.Add(' <hr size=1 noshade>');
IdMessage1.Body.Add(' <font face="Courier New" size=2>');
IdMessage1.Body.Add('Isto é somente um exemplo que você pode tomar como base para gerar as suas mensagens');
IdMessage1.Body.Add(' </font>');
IdMessage1.Body.Add(' <b><font face="Tahoma" size=2 color="black">');
IdMessage1.Body.Add(' <hr size=1 noshade>');
IdMessage1.Body.Add(' EMITIDO AUTOMATICAMENTE PELO SISTEMA<br>');
IdMessage1.Body.Add(' <font color="blue">');
IdMessage1.Body.Add(' Boa semana');
IdMessage1.Body.Add(' </font>');
IdMessage1.Body.Add(' </font></b>');
IdMessage1.Body.Add(' </body>');
IdMessage1.Body.Add('</html>');
// efetua a conexao ao servidor SMTP
if not ClienteSMTP.Connected then
try
ClienteSMTP.Connect; // conecta ao SMTP
if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao
AutenticouSMTP := ClienteSMTP.Authenticate // efetua a atenticacao e retorna o resultado para a variável
else // se nao requer autenticacao
AutenticouSMTP := True; // assume que a conexao foi bem sucedida
except
on E:Exception do // em caso de erro gera um log com a mensagem de erro
ShowMessage('Não foi possível conectar ao servidor SMTP: '+E.Message);
end;
// se a conexao foi bem sucedida, envia a mensagem
if AutenticouSMTP and ClienteSMTP.Connected then
ClienteSMTP.Send(IdMessage1);
// depois de tudo pronto, desconecta do servidor SMTP
if ClienteSMTP.Connected then
ClienteSMTP.Disconnect;
end;
relação de objetos/classes utilizadas:
ClienteSMTP: TIdSMTP para comunicacao com o servidor SMTP
SSLHandlerSMTP: objeto TIdSSLIOHandlerSocketOpenSSL para uso de conexão segura
IdMessage1: objeto TIdMessage para geração da mensagem
FParametrosEmail: record para guardar os parâmetros de conexão
TParametrosEmail = record
SMTPHost, SMTPUsername, SMTPPassword: string;
SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string;
SMTPAutenticacao, SMTPSSL: boolean;
SMTPPorta: integer;
end;
exemplo de preenchimento do FParametrosEmail:
FParametrosEmail.SMTPConta := 'fulano_de_tal@gmail.com';
FParametrosEmail.SMTPNomeExibicao := 'Fulano de Tal';
FParametrosEmail.SMTPPassword := 'senhadofulanodetal';
FParametrosEmail.SMTPUsername := 'fulano_de_tal';
FParametrosEmail.SMTPHost := 'pop.gmail.com';
FParametrosEmail.SMTPPorta := 465;
FParametrosEmail.SMTPAutenticacao := True; // requer autenticacao
FParametrosEmail.SMTPSSL := True; // requer conexao segura
// destinatarios separados por virgula
FParametrosEmail.SMTPDestinatarios := 'emerson.en@ig.com.br,emerson.en@terra.com.br';
var
AutenticouSMTP: boolean;
begin
//** configura SMTP **
if ClienteSMTP.Connected then
try
ClienteSMTP.Disconnect;
except
end;
ClienteSMTP.Host := FParametrosEmail.SMTPHost; // atribui o host (pop.gmail.com)
ClienteSMTP.Port := FParametrosEmail.SMTPPorta; // atribui a porta (465)
if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao
begin
ClienteSMTP.Username := FParametrosEmail.SMTPUsername; // atribui o nome do usuario
ClienteSMTP.Password := FParametrosEmail.SMTPPassword; // atribui a senha
end
else
begin // se não requer autenticacao
ClienteSMTP.Username := ''; // limpa o usuario
ClienteSMTP.Password := ''; // limpa a senha
end;
if FParametrosEmail.SMTPSSL then // se requer conexao segura
begin
ClienteSMTP.IOHandler := SSLHandlerSMTP; // vincula o manipulador de SMTP ao cliente SMTP
ClienteSMTP.UseTLS := utUseImplicitTLS; // atribui ao cliente SMTP o suporte implícito a TLS
SSLHandlerSMTP.Port := ClienteSMTP.Port; // atribui a porta ao manipulador (igual a do cliente FTP)
SSLHandlerSMTP.Destination := ClienteSMTP.Host + ':' + IntToStr(ClienteSMTP.Port); // indica o destino da conexão (pop.gmail.com:465)
SSLHandlerSMTP.Host := ClienteSMTP.Host; // atribui o host (pop.gmail.com)
end
else
begin // se não requer conexao segura
ClienteSMTP.IOHandler := nil; // desvincula o manipulador de SMTP
ClienteSMTP.UseTLS := utNoTLSSupport; // indica que nao ha suporte a TLS
end;
AutenticouSMTP := False; // variavel para indicar se a autenticacao foi bem sucedida
// *** montagem da mensagem ***
// ****************************
// cabecalho
IdMessage1.Clear;
IdMessage1.ContentType := 'text/html';
IdMessage1.From.Address := FParametrosEmail.SMTPConta; // conta do remetente
IdMessage1.From.Name := FParametrosEmail.SMTPNomeExibicao; // nome do remetente
IdMessage1.Recipients.EMailAddresses := FParametrosEmail.SMTPDestinatarios; // destinatarios (separados por vírgula! não é ponto e vírgula!)
IdMessage1.Subject := 'Envio de email automatico'; // assunto
// corpo
IdMessage1.Body.Clear;
IdMessage1.Body.Add('<html>');
IdMessage1.Body.Add(' <body>');
IdMessage1.Body.Add(' <h4>SISTEMA DE EMAIL AUTOMATICO</h4>');
IdMessage1.Body.Add(' <font face="Verdana" size=2>');
IdMessage1.Body.Add(' Teste de envio de email');
IdMessage1.Body.Add(' <hr size=1 noshade>');
IdMessage1.Body.Add(' <font face="Courier New" size=2>');
IdMessage1.Body.Add('Isto é somente um exemplo que você pode tomar como base para gerar as suas mensagens');
IdMessage1.Body.Add(' </font>');
IdMessage1.Body.Add(' <b><font face="Tahoma" size=2 color="black">');
IdMessage1.Body.Add(' <hr size=1 noshade>');
IdMessage1.Body.Add(' EMITIDO AUTOMATICAMENTE PELO SISTEMA<br>');
IdMessage1.Body.Add(' <font color="blue">');
IdMessage1.Body.Add(' Boa semana');
IdMessage1.Body.Add(' </font>');
IdMessage1.Body.Add(' </font></b>');
IdMessage1.Body.Add(' </body>');
IdMessage1.Body.Add('</html>');
// efetua a conexao ao servidor SMTP
if not ClienteSMTP.Connected then
try
ClienteSMTP.Connect; // conecta ao SMTP
if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao
AutenticouSMTP := ClienteSMTP.Authenticate // efetua a atenticacao e retorna o resultado para a variável
else // se nao requer autenticacao
AutenticouSMTP := True; // assume que a conexao foi bem sucedida
except
on E:Exception do // em caso de erro gera um log com a mensagem de erro
ShowMessage('Não foi possível conectar ao servidor SMTP: '+E.Message);
end;
// se a conexao foi bem sucedida, envia a mensagem
if AutenticouSMTP and ClienteSMTP.Connected then
ClienteSMTP.Send(IdMessage1);
// depois de tudo pronto, desconecta do servidor SMTP
if ClienteSMTP.Connected then
ClienteSMTP.Disconnect;
end;
relação de objetos/classes utilizadas:
ClienteSMTP: TIdSMTP para comunicacao com o servidor SMTP
SSLHandlerSMTP: objeto TIdSSLIOHandlerSocketOpenSSL para uso de conexão segura
IdMessage1: objeto TIdMessage para geração da mensagem
FParametrosEmail: record para guardar os parâmetros de conexão
TParametrosEmail = record
SMTPHost, SMTPUsername, SMTPPassword: string;
SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string;
SMTPAutenticacao, SMTPSSL: boolean;
SMTPPorta: integer;
end;
exemplo de preenchimento do FParametrosEmail:
FParametrosEmail.SMTPConta := 'fulano_de_tal@gmail.com';
FParametrosEmail.SMTPNomeExibicao := 'Fulano de Tal';
FParametrosEmail.SMTPPassword := 'senhadofulanodetal';
FParametrosEmail.SMTPUsername := 'fulano_de_tal';
FParametrosEmail.SMTPHost := 'pop.gmail.com';
FParametrosEmail.SMTPPorta := 465;
FParametrosEmail.SMTPAutenticacao := True; // requer autenticacao
FParametrosEmail.SMTPSSL := True; // requer conexao segura
// destinatarios separados por virgula
FParametrosEmail.SMTPDestinatarios := 'emerson.en@ig.com.br,emerson.en@terra.com.br';
GOSTEI 0
Ricardo
07/07/2011
Ojuara, obrigado pela ajuda! Vou testar aqui e retorno dizendo o que aconteceu.
Emerson, você envia e-mails normalmente com esse código sem uso de alguma dll extra? Qual versão do Delphi você utiliza? Porque as pessoas sempre dizem coisas assim, mas geralmente o código sozinho não envia e-mail, não é? Saber apenas o código não ajuda (pelo menos foi o que eu vi na pesquisa que fiz). Geralmente o e-mail não é enviado devido a falta de alguma dll compatível ou o componente utilizado.
Obrigado pela atenção!
Emerson, você envia e-mails normalmente com esse código sem uso de alguma dll extra? Qual versão do Delphi você utiliza? Porque as pessoas sempre dizem coisas assim, mas geralmente o código sozinho não envia e-mail, não é? Saber apenas o código não ajuda (pelo menos foi o que eu vi na pesquisa que fiz). Geralmente o e-mail não é enviado devido a falta de alguma dll compatível ou o componente utilizado.
Obrigado pela atenção!
GOSTEI 0
Emerson Nascimento
07/07/2011
é preciso das dlls que você citou no seu post (libeay32.dll e ssleay32.dll). grave-as na pasta system32 ou na mesma pasta do executável. elas são necessárias devido ao uso de SSL na conexão. se o SMTP não usar conexão segura essas bibliotecas não serão necessárias.
GOSTEI 0
Ricardo
07/07/2011
Emerson, esse código aí eu coloco no botão enviar, não é?E essa relação de objetos/classes utilizadas. Em qual parte do código isso entraria?Vlw!
GOSTEI 0
Emerson Nascimento
07/07/2011
os objetos:
ClienteSMTP: TIdSMTP para comunicacao com o servidor SMTP
SSLHandlerSMTP: objeto TIdSSLIOHandlerSocketOpenSSL para uso de conexão segura
IdMessage1: objeto TIdMessage para geração da mensagem
são componentes da paleta Indy.
o mais fácil é você clicar no componente e soltar no seu form. você tem como opção criá-los via código, em tempo de execução.
agora TParametrosEmail você pode definir na seção type da unit, preferencialmente antes da definição do seu formulário. e a varíavel você pode declarar na seção private do formulário.
unit XXXXXXXX;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;
type
// definicao do record que guardará os parâmetros de configuração do email.
TParametrosEmail = record
SMTPHost, SMTPUsername, SMTPPassword: string;
SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string;
SMTPAutenticacao, SMTPSSL: boolean;
SMTPPorta: integer;
end;
TFormXXX = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FParametrosEmail: TParametrosEmail; // declaracao da variável
public
{ Public declarations }
end;
daí, você atribui as configurações do email onde você quiser. pode exemplo, no OnCreate do Form:
procedure TFormXXX.FormCreate(Sender: TObject);
begin
FParametrosEmail.SMTPConta := 'fulano_de_tal@gmail.com';
FParametrosEmail.SMTPNomeExibicao := 'Fulano de Tal';
FParametrosEmail.SMTPPassword := 'senhadofulanodetal';
FParametrosEmail.SMTPUsername := 'fulano_de_tal';
FParametrosEmail.SMTPHost := 'pop.gmail.com';
FParametrosEmail.SMTPPorta := 465;
FParametrosEmail.SMTPAutenticacao := True; // requer autenticacao
FParametrosEmail.SMTPSSL := True; // requer conexao segura
// destinatarios separados por virgula
FParametrosEmail.SMTPDestinatarios := 'emerson.en@ig.com.br,emerson.en@terra.com.br';
end;
ClienteSMTP: TIdSMTP para comunicacao com o servidor SMTP
SSLHandlerSMTP: objeto TIdSSLIOHandlerSocketOpenSSL para uso de conexão segura
IdMessage1: objeto TIdMessage para geração da mensagem
são componentes da paleta Indy.
o mais fácil é você clicar no componente e soltar no seu form. você tem como opção criá-los via código, em tempo de execução.
agora TParametrosEmail você pode definir na seção type da unit, preferencialmente antes da definição do seu formulário. e a varíavel você pode declarar na seção private do formulário.
unit XXXXXXXX;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;
type
// definicao do record que guardará os parâmetros de configuração do email.
TParametrosEmail = record
SMTPHost, SMTPUsername, SMTPPassword: string;
SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string;
SMTPAutenticacao, SMTPSSL: boolean;
SMTPPorta: integer;
end;
TFormXXX = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FParametrosEmail: TParametrosEmail; // declaracao da variável
public
{ Public declarations }
end;
daí, você atribui as configurações do email onde você quiser. pode exemplo, no OnCreate do Form:
procedure TFormXXX.FormCreate(Sender: TObject);
begin
FParametrosEmail.SMTPConta := 'fulano_de_tal@gmail.com';
FParametrosEmail.SMTPNomeExibicao := 'Fulano de Tal';
FParametrosEmail.SMTPPassword := 'senhadofulanodetal';
FParametrosEmail.SMTPUsername := 'fulano_de_tal';
FParametrosEmail.SMTPHost := 'pop.gmail.com';
FParametrosEmail.SMTPPorta := 465;
FParametrosEmail.SMTPAutenticacao := True; // requer autenticacao
FParametrosEmail.SMTPSSL := True; // requer conexao segura
// destinatarios separados por virgula
FParametrosEmail.SMTPDestinatarios := 'emerson.en@ig.com.br,emerson.en@terra.com.br';
end;
GOSTEI 0
Ricardo
07/07/2011
Ah sim, entendi!
Eu coloquei o código como vc me passou, mas na hora de criar o "oncreate" do form ou fazer qualquer outra coisa está dando um erro aqui no TForm1.Button1Click.
Está dizendo Expected '=' but '(' found.
E no Type está dando um erro dizendo Expected '@' but received 'record'.
E Expected the end of file but received an identifier 'Button1Click'
Pode dar uma olhada no código fazendo favor?
Eu coloquei o código como vc me passou, mas na hora de criar o "oncreate" do form ou fazer qualquer outra coisa está dando um erro aqui no TForm1.Button1Click.
Está dizendo Expected '=' but '(' found.
E no Type está dando um erro dizendo Expected '@' but received 'record'.
E Expected the end of file but received an identifier 'Button1Click'
Pode dar uma olhada no código fazendo favor?
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP;
type TForm1 = class(TForm) TParametrosEmail = record SMTPHost, SMTPUsername, SMTPPassword: string; SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string; SMTPAutenticacao, SMTPSSL: boolean; SMTPPorta: integer; ClienteSMTP: TIdSMTP; IdMessage1: TIdMessage; SSLHandlerSMTP: TIdSSLIOHandlerSocketOpenSSL; Button1: TButton; procedure Button1Click(Sender: TObject); private FParametrosEmail: TParametrosEmail; // declaracao da variável { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); //AQUI É ONDE DÁ O ERROvar AutenticouSMTP: boolean;begin //** configura SMTP ** if ClienteSMTP.Connected then try ClienteSMTP.Disconnect; except end ;
ClienteSMTP.Host := FParametrosEmail.SMTPHost; // atribui o host (pop.gmail.com) ClienteSMTP.Port := FParametrosEmail.SMTPPorta; // atribui a porta (465)
if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao begin ClienteSMTP.Username := FParametrosEmail.SMTPUsername; // atribui o nome do usuario ClienteSMTP.Password := FParametrosEmail.SMTPPassword; // atribui a senha end else begin // se não requer autenticacao ClienteSMTP.Username := ''; // limpa o usuario ClienteSMTP.Password := ''; // limpa a senha end;
if FParametrosEmail.SMTPSSL then // se requer conexao segura begin ClienteSMTP.IOHandler := SSLHandlerSMTP; // vincula o manipulador de SMTP ao cliente SMTP ClienteSMTP.UseTLS := utUseImplicitTLS; // atribui ao cliente SMTP o suporte implícito a TLS
SSLHandlerSMTP.Port := ClienteSMTP.Port; // atribui a porta ao manipulador (igual a do cliente FTP) SSLHandlerSMTP.Destination := ClienteSMTP.Host + ':' + IntToStr(ClienteSMTP.Port); // indica o destino da conexão (pop.gmail.com:465) SSLHandlerSMTP.Host := ClienteSMTP.Host; // atribui o host (pop.gmail.com) end else begin // se não requer conexao segura ClienteSMTP.IOHandler := nil; // desvincula o manipulador de SMTP ClienteSMTP.UseTLS := utNoTLSSupport; // indica que nao ha suporte a TLS end;
AutenticouSMTP := False; // variavel para indicar se a autenticacao foi bem sucedida
// *** montagem da mensagem *** // **************************** // cabecalho IdMessage1.Clear; IdMessage1.ContentType := 'text/html'; IdMessage1.From.Address := FParametrosEmail.SMTPConta; // conta do remetente IdMessage1.From.Name := FParametrosEmail.SMTPNomeExibicao; // nome do remetente IdMessage1.Recipients.EMailAddresses := FParametrosEmail.SMTPDestinatarios; // destinatarios (separados por vírgula! não é ponto e vírgula!) IdMessage1.Subject := 'Envio de email automatico'; // assunto
// corpo IdMessage1.Body.Clear; IdMessage1.Body.Add('<html>'); IdMessage1.Body.Add(' <body>'); IdMessage1.Body.Add(' <h4>SISTEMA DE EMAIL AUTOMATICO</h4>'); IdMessage1.Body.Add(' <font face="Verdana" size=2>'); IdMessage1.Body.Add(' Teste de envio de email'); IdMessage1.Body.Add(' <hr size=1 noshade>'); IdMessage1.Body.Add(' <font face="Courier New" size=2>'); IdMessage1.Body.Add('Isto é somente um exemplo que você pode tomar como base para gerar as suas mensagens'); IdMessage1.Body.Add(' </font>'); IdMessage1.Body.Add(' <b><font face="Tahoma" size=2 color="black">'); IdMessage1.Body.Add(' <hr size=1 noshade>'); IdMessage1.Body.Add(' EMITIDO AUTOMATICAMENTE PELO SISTEMA<br>'); IdMessage1.Body.Add(' <font color="blue">'); IdMessage1.Body.Add(' Boa semana'); IdMessage1.Body.Add(' </font>'); IdMessage1.Body.Add(' </font></b>'); IdMessage1.Body.Add(' </body>'); IdMessage1.Body.Add('</html>');
// efetua a conexao ao servidor SMTP if not ClienteSMTP.Connected then try ClienteSMTP.Connect; // conecta ao SMTP if FParametrosEmail.SMTPAutenticacao then // se requer autenticacao AutenticouSMTP := ClienteSMTP.Authenticate // efetua a atenticacao e retorna o resultado para a variável else // se nao requer autenticacao AutenticouSMTP := True; // assume que a conexao foi bem sucedida except on E:Exception do // em caso de erro gera um log com a mensagem de erro ShowMessage('Não foi possível conectar ao servidor SMTP: '+E.Message); end;
// se a conexao foi bem sucedida, envia a mensagem if AutenticouSMTP and ClienteSMTP.Connected then ClienteSMTP.Send(IdMessage1);
// depois de tudo pronto, desconecta do servidor SMTP if ClienteSMTP.Connected then ClienteSMTP.Disconnect;end;
end.GOSTEI 0
Emerson Nascimento
07/07/2011
Ah sim, entendi!
Eu coloquei o código como vc me passou
Eu coloquei o código como vc me passou
você NÃO colocou o código como eu te passei.
preste atenção no exemplo que eu te passei. a definição de TParametrosEmail fica totalmente destacada da definição do Form. são coisas distintas, mas você colocou um dentro do outro. misturou tudo.
o correto é assim:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP; type // a definição fica TOTALMENTE FORA da definição do formulário
TParametrosEmail = record
SMTPHost, SMTPUsername, SMTPPassword: string;
SMTPConta, SMTPNomeExibicao, SMTPDestinatarios: string;
SMTPAutenticacao, SMTPSSL: boolean;
SMTPPorta: integer;
end; TForm1 = class(TForm) ClienteSMTP: TIdSMTP; IdMessage1: TIdMessage; SSLHandlerSMTP: TIdSSLIOHandlerSocketOpenSSL; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } FParametrosEmail: TParametrosEmail; // declaracao da variável public { Public declarations } end; var Form1: TForm1;
GOSTEI 0
Ricardo
07/07/2011
É, realmente eu não tinha entendido o que era pra fazer e misturei as coisa (sou um infeliz por não nascer sabendo, mas fazer o que, não é?).
No final das contas, o código compilou certinho e adivinhem o que aconteceu! Apareceu o mesmo erro que o MEU código inicial dava, dizendo que não foi possível carregar a SSL library. (Legal, né?)
Se tivessem lido o que eu escrevi quando criei o tópico, veriam que eu já havia pesquisado pela internet e testado diversos códigos diferentes e que o código em si NÃO era o meu problema, mas sim a tal da SSL library que o programa não consegue carregar para enviar o email.
Agradeço muito a "ajuda" que recebi aqui, mas, desculpe a franqueza, só serviu pra me fazer perder tempo dando voltas pra retornar ao mesmo lugar de onde eu sai.
Vou tentar resolver o problema por conta própria mesmo. Se eu conseguir, como havia dito antes, vou fazer um tutorial explicando não só o "milagroso código", mas também versões dos programas utilizados, componentes, dll's, etc.Talvez eu consiga ajudar alguém com tão pouca experiência como eu e que também não saiba de tudo (do contrário, não teria criado um tópico pedindo ajuda).
Obrigado a todos que tentaram ajudar!
Problema Resolvido!!!
No final das contas, o código compilou certinho e adivinhem o que aconteceu! Apareceu o mesmo erro que o MEU código inicial dava, dizendo que não foi possível carregar a SSL library. (Legal, né?)
Se tivessem lido o que eu escrevi quando criei o tópico, veriam que eu já havia pesquisado pela internet e testado diversos códigos diferentes e que o código em si NÃO era o meu problema, mas sim a tal da SSL library que o programa não consegue carregar para enviar o email.
Agradeço muito a "ajuda" que recebi aqui, mas, desculpe a franqueza, só serviu pra me fazer perder tempo dando voltas pra retornar ao mesmo lugar de onde eu sai.
Vou tentar resolver o problema por conta própria mesmo. Se eu conseguir, como havia dito antes, vou fazer um tutorial explicando não só o "milagroso código", mas também versões dos programas utilizados, componentes, dll's, etc.Talvez eu consiga ajudar alguém com tão pouca experiência como eu e que também não saiba de tudo (do contrário, não teria criado um tópico pedindo ajuda).
Obrigado a todos que tentaram ajudar!
Problema Resolvido!!!
GOSTEI 0
Emerson Nascimento
07/07/2011
É, realmente eu não tinha entendido o que era pra fazer e misturei as coisa (sou um infeliz por não nascer sabendo, mas fazer o que, não é?).
No final das contas, o código compilou certinho e adivinhem o que aconteceu! Apareceu o mesmo erro que o MEU código inicial dava, dizendo que não foi possível carregar a SSL library. (Legal, né?)
Se tivessem lido o que eu escrevi quando criei o tópico, veriam que eu já havia pesquisado pela internet e testado diversos códigos diferentes e que o código em si NÃO era o meu problema, mas sim a tal da SSL library que o programa não consegue carregar para enviar o email.
Agradeço muito a "ajuda" que recebi aqui, mas, desculpe a franqueza, só serviu pra me fazer perder tempo dando voltas pra retornar ao mesmo lugar de onde eu sai.
Vou tentar resolver o problema por conta própria mesmo. Se eu conseguir, como havia dito antes, vou fazer um tutorial explicando não só o "milagroso código", mas também versões dos programas utilizados, componentes, dll's, etc.Talvez eu consiga ajudar alguém com tão pouca experiência como eu e que também não saiba de tudo (do contrário, não teria criado um tópico pedindo ajuda).
Obrigado a todos que tentaram ajudar!
Problema Resolvido!!!
No final das contas, o código compilou certinho e adivinhem o que aconteceu! Apareceu o mesmo erro que o MEU código inicial dava, dizendo que não foi possível carregar a SSL library. (Legal, né?)
Se tivessem lido o que eu escrevi quando criei o tópico, veriam que eu já havia pesquisado pela internet e testado diversos códigos diferentes e que o código em si NÃO era o meu problema, mas sim a tal da SSL library que o programa não consegue carregar para enviar o email.
Agradeço muito a "ajuda" que recebi aqui, mas, desculpe a franqueza, só serviu pra me fazer perder tempo dando voltas pra retornar ao mesmo lugar de onde eu sai.
Vou tentar resolver o problema por conta própria mesmo. Se eu conseguir, como havia dito antes, vou fazer um tutorial explicando não só o "milagroso código", mas também versões dos programas utilizados, componentes, dll's, etc.Talvez eu consiga ajudar alguém com tão pouca experiência como eu e que também não saiba de tudo (do contrário, não teria criado um tópico pedindo ajuda).
Obrigado a todos que tentaram ajudar!
Problema Resolvido!!!
como é???
eu também não nasci sabendo. sinceramente não entendi sua resposta.
mas vou ignorar. prefiro achar que você não entendeu o que eu disse, afinal uma mensagem escrita não têm entonação e talvez eu tenha sido mal interpretado.
de qualquer forma te mandei um programa compilado e já com as duas dlls. descompacte numa pasta e renomeie como foi instruído no email.
se o envio do email for bem sucedido, passo a acreditar que suas dlls estejam desatualizadas ou com algum tipo de problema.
GOSTEI 0
Ricardo
07/07/2011
Meu email é rickaurel@gmail.comEsse do código era apenas fictício.Obrigado por toda atenção.
GOSTEI 0
Adriano Carvalho
07/07/2011
olhe ai um codigo facil e util.
// Enviar email
Message1.Body.Clear;
Message1.From.Name := FrmMenu.codEmpre +' - '+frmMenu.empresa;
Message1.Subject := 'Erro Boleto';
Message1.Body.Add('Data/Hora.: '+ DateTimeToStr(Now));
Message1.Body.Add(form);
Message1.Body.Add(e.Message);
Message1.From.Address := 'fdp@uol.com.br';
Message1.Recipients.EMailAddresses := 'suportecp80@gmail.com';
SMTP.Host := 'smtps.uol.com.br';
SMTP.Username := '*****@uol.com.br';
SMTP.Password := '****';
SMTP.AuthType := satNone;
SMTP.Port := 25;
Application.ProcessMessages;
SMTP.Connect;
try
Application.ProcessMessages;
SMTP.Send(Message1);
finally
Application.ProcessMessages;
SMTP.Disconnect;
end;
GOSTEI 0
Emerson Nascimento
07/07/2011
Meu email é rickaurel@gmail.comEsse do código era apenas fictício.Obrigado por toda atenção.
recebeu o email? funcionou?
GOSTEI 0
Ricardo
07/07/2011
Recebi sim! Obrigado pela ajuda!Quando coloquei as dll's que me enviou o programa funcionou!
Fiz um tutorial de como fiz e disponibilizei o código e as dll'spara quando alguém estiver com o mesmo problema e precisar.
http://programandodetudo.blogspot.com/2011/07/enviando-email-com-programa-feito-em.html
Obrigado Emerson e todos os que me ajudaram!!!
Fiz um tutorial de como fiz e disponibilizei o código e as dll'spara quando alguém estiver com o mesmo problema e precisar.
http://programandodetudo.blogspot.com/2011/07/enviando-email-com-programa-feito-em.html
Obrigado Emerson e todos os que me ajudaram!!!
GOSTEI 0