Ir para conteúdo
Fórum Script Brasil
  • 0

Erro ao enviar e-mail


Vivendo&Aprendendo

Pergunta

Olá pessoal. Fiz um sistema de backup para minha aplicação e este deve enviar o arquivo para um e-mail de dentro do sistema mesmo.

Estou usando o Indy 9.0.18 e delphi 7.

Esse é o código que estou usando no botão enviar e-mail.

procedure TFrmBackup.BtnEmailClick(Sender: TObject);
begin
  IdSMTP.Host:= 'smtp.gmail.com';
  IdSMTP.Port:= 465;
  IdSMTP.Username:= 'XXXX';
  IdSMTP.Password:= 'XXXX';
  IdMessage.From.Address:= 'XXXX@gmail.com';
  IdMessage.From.Name:= 'Sistema de Backup';
  IdMessage.Recipients.EMailAddresses:= EdtPara.Text;
  IdSMTP.Connect(3000);
  Application.ProcessMessages;
  IdSMTP.Send(IdMessage);
  Application.MessageBox('E-Mail enviado com sucesso!','Aviso',mb_IconInformation +mb_ok);
  IdSMTP.Disconnect;
  EdtPara.Clear;
end;

O erro corre na linha em negrito.

Error conecting with SSL

 

 

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

isso não é um erro, é apenas uma mensagem de aviso

voce pode ignorar esse aviso teclando F9, e continuar o envio, no entanto,  não vai resolver a exceção.

isso ocorre quando a conexão é fechada antes de finalizar o envio

solução: Connection closed gracefully

Como o EIdConnClosedGracefully é uma exceção comum especialmente com determinados servidores, ele desce da EIdSilentException. Na guia Exceções de idioma das Opções do Debugger (Menu Ferramentas), você pode adicionar EIdSilentException à lista de exceções para ignorar. Depois disso, as exceções ainda ocorrerão no código e serão tratadas, mas o depurador não interromperá o programa para depurá-las.

ou veja em

http://www.swissdelphicenter.ch/en/showarticle.php?id=1

veja tambem se o problema esta no timeout do componente TIdSSLIOHandlerSocketOpenSSL:

Código:
IdSSLIOHandlerSocketOpenSSL1.ReadTimeout := 30000;

Veja tambem com relação ao GMail

http://tsdn.tecnospeed.com.br/blog-da-consultoria-tecnica-tecnospeed/post/corrigindo-o-erro-connection-closed-gracefully-gmail

em ultimo caso, voce ainda pode tentar outra versao do indy  ( voce não mencinou qual a versão do seu windows )

http://minhaweb2.zapto.org:9090/downloads/Indy10.rar

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

o ultimo link é um provedor particular, voce só conseguira baixar os arquivos se ele estiver ativo

com relação ao seu código...  testei aqui com o delphi 7 e usando a  versão do Indy 10.2.0.1 e funcinou corretamente

caso queira tentar outro código:

Componentes
IdSSLIOHandlerSocket1 = Vai na SSLOption= Method : sslvSSLv3
IdSMTP1
IdMessage1



Codigo :

Código:
IdSMTP1.Host     := 'smtp.gmail.com';
 IdSMTP1.Username := 'SuaContaGmailAqui';
 IdSMTP1.Password := 'SuaSenhaGmailAqui';
 IdSMTP1.Port     := StrToInt(Trim('465'));

 //-- requer autenticacao
 IdSMTP1.AuthenticationType:= atLogin;

 //-- conexao segura SSL

 IdSMTP1.IOHandler := IdSSLIOHandlerSocket1;


 IdMessage1.MessageParts.Clear;

 //-- ORIGEM
 IdMessage1.From.Address := Trim('Seu Endereço');
 IdMessage1.Subject      := Trim('Seu Titulo da Msg Pro Carinha');
 IdMessage1.Body.Text    := Trim('Sua Mensagem pro Carinha');

 //-- DESTINO
 IdMessage1.Recipients.EMailAddresses  := 'Email Do Carinha';
 IdMessage1.BccList.EMailAddresses     := '';
 IdMessage1.CCList.EMailAddresses      := '';
 
 if NOT IdSMTP1.Connected then
 IdSMTP1.Connect(2000);

 if IdSMTP1.Connected then begin
 //IdSMTP1.Authenticate;
 IdSMTP1.Send(IdMessage1);
 Application.ProcessMessages;
 
 IdSMTP1.Disconnect;

========================================================================

procedure TfrmENVIAR.FormCreate(Sender: TObject);
begin
with SMTP do
    begin
       AuthenticationType := atLogin;
       Host := 'smtp.gmail.com';
       IOHandler := SSLSocket;
       Password := 'senha';
       Port := 465;
       Username := 'nome@gmail.com';
    end;

    SSLSocket.SSLOptions.Method := sslvSSLv3;
    SSLSocket.SSLOptions.Mode := sslmClient;
end;


Botão ENVIAR:

begin

with MSG do
     begin


       Body.Text := memo1.text ;
       From.Address := 'email do remetente'; //opcional
       From.Name := 'Agenda'; //opcional
       Recipients.Add;
       Recipients.Items[0].Address := eddest.Text ;
       Recipients.Items[0].Name := eddest.Text ; //opcional
       Subject := 'Tarefas de hoje' ;
    end;

       try
       SMTP.Connect();
       SMTP.Send(MSG);
       SMTP.Disconnect;
    except
       ShowMessage('Falha no envio!');
       exit;
    end;


    ShowMessage('E-MAIL COM OS COMPROMISSOS FOI ENVIADO COM SUCESSO!');
    ;
    end;
email := TIdMessage.Create(nil);
serV := TIdSMTP.Create(nil);
if Autenticacao then
begin
SSL := TIdSSLIOHandlerSocket.Create(nil);
{ seta as propriedades do componente IdSMTP }
Serv.IOHandler := SSl;
serV.Port := 465;
end
else
serV.Port := 25;

serV.AuthenticationType := atLogin;
Serv.Username := Usuario;
Serv.Password := Senha;

serV.Host := Servidor;
{ Seta as propriedades do componente IdMessage }
email.From.Address := EmailRemetente;
email.Recipients.EMailAddresses := EmailDestinatario;
email.Subject := Assunto;
email.Body.Text := Mensagem;
{ insere os anexos }
for i := 0 to FAnexo.Count - 1 do
begin
TIdAttachment.Create(email.MessageParts,FAnexo.Strings[i]);
end;
{ envia o email }
try
try
serV.Connect(1000);
serV.Send(email);
except
raise EspdNFeEmail_EnviarEmailException.Create('Erro ao enviar Email Verifique as Configurações do Email');
end;
finally
if serV.Connected then
serV.Disconnect;
end;
end;

email.Free;
serV.Free;

if Autenticacao then
SSL.Free; 

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Abusando de sua boa vontade, teria como me enviar esse exemplo que você fez?

aslalexandre@hotmail.com

 

Segue abaixo todo meu código

unit UnBackup;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ShellAPI, StdCtrls, DB, ADODB, ExtCtrls,
  ComCtrls, Buttons, AbBase, AbBrowse, AbMeter, AbZBrows, AbZipper, AbArcTyp,
  Mask, DBCtrls, ShellCtrls, CommCtrl, ShlObj, ActiveX, Grids,
  DBGrids, MAPI, IdMessage, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, Gauges, WinSkinData, MSNPopUp,
  IdExplicitTLSClientServerBase, IdSMTPBase, IdIOHandlerStack, IdSSL;

const
  WM_ICONTRAY = WM_USER + 1;

type
  TFrmBackup = class(TForm)
    StbBarra: TStatusBar;
    Timer: TTimer;
    PnProg: TPanel;
    Zip: TAbZipper;
    SaveDlg: TSaveDialog;
    ListBox: TListBox;
    BtnBackup: TSpeedButton;
    BtnFechar: TSpeedButton;
    PnInf: TPanel;
    Label1: TLabel;
    IdSMTP: TIdSMTP;
   // IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    IdMessage: TIdMessage;
    BtnEmail: TSpeedButton;
    EdtPara: TEdit;
    LblPara: TLabel;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure TimerTimer(Sender: TObject);
    procedure BtnFecharClick(Sender: TObject);
    procedure MSNPopUpClick(Sender: TObject);
    procedure BtnBackupClick(Sender: TObject);
    procedure MSNPopUpURLClick(Sender: TObject; URL: String);
    procedure BtnEmailClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Function DataPorExtenso : String;
  end;

var
  FrmBackup: TFrmBackup;

implementation

uses UnDados, UnPrincipal;

{$R *.dfm}

//Função de data por extenso
function TFrmBackup.DataPorExtenso:String;
const
  Meses : Array [1..12] of String = ('Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro');
  Semana : Array [1..7] of String = ('Domingo','Segunda-Feira','Terça-Feira','Quarta-Feira','Quinta-Feira','Sexta-Feira','Sábado');
var Dia, Mes, Ano, DiaSem : Word;
begin
  DecodeDate(Date,Ano,Mes,Dia);
  DiaSem := DayOfWeek(Date);
  Result := Semana[DiaSem] + ', '+ IntToStr(Dia) +' de '+ Meses[Mes] + ' de ' + IntToStr(Ano);
end;

procedure TFrmBackup.TimerTimer(Sender: TObject);
begin
  StbBarra.Panels[0].Text := DataPorExtenso + ' - ' + TimeToStr(Time);
end;

procedure TFrmBackup.BtnFecharClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmBackup.MSNPopUpClick(Sender: TObject);
begin
  //Show;
end;

procedure TFrmBackup.BtnBackupClick(Sender: TObject);
var Origem, Destino, Nome : String;
begin
  ListBox.Font.Color := clBlack;
  ListBox.Font.Style := [];
  ListBox.Clear;
  ListBox.Items.Add('FECHANDO AS TABELAS DO BANCO DE DADOS!');
  DmDados.ConectaBanco.Connected := False;   
  ListBox.Items.Add(' ');
  ListBox.Items.Add('VERIFICANDO O ARQUIVO. AGUARDE!');
  ListBox.Items.Add(' ');
  ListBox.Items.Add('ARQUIVO VERIFICADO COM SUCESSO!');
  ListBox.Items.Add(' ');
  ListBox.Items.Add('COMPACTANDO O ARQUIVO!');
  Origem := ExtractFilePath(Application.ExeName)+'Dados\Dados.mdb';
  If SaveDlg.Execute Then
    Destino := SaveDlg.FileName;
  Nome := 'Backup '+ FormatDateTime('[dd-mm-yyyy] [hh-mm-ss]', Now) +'.zip';
  //MSNPopUp.Text := 'BackUp efetuado com sucesso! '+#13 +Nome;
  //MSNPopUp.ShowPopUp;
  BtnBackup.Enabled := False;
  Zip.StoreOptions := [soStripDrive, soStripPath, soRemoveDots, soRecurse];
  Zip.FileName := Destino;
  Zip.AddFiles(Origem, 0);
  Zip.CloseArchive;
  Zip.Save;
  RenameFile(Destino,Nome);
  MessageBeep(MB_ICONINFORMATION);
  ListBox.Items.Add(savedlg.FileName);
  ListBox.Items.Add(Nome);
  ListBox.Items.Add(' ');
  ListBox.Items.Add('CONCLUÍDO!');
  ListBox.Items.Add(' ');  
  ListBox.Items.Add('ABRINDO AS TABELAS DO BANCO DE DADOS!');
  ListBox.Items.Add(' ');
  BtnBackup.Enabled := True;
  DmDados.ConectaBanco.Connected := True;
  DmDados.Senhas.Active := True;
  //---------Configura a mensagem para ser enviada para o e-mail
  IdMessage.Subject:= Nome;
  IdMessage.Body.Add('Esta mensagem foi enviada pelo sistema.');
  IdMessage.Body.Add('Arquivo de backup do banco de dados do sistema.');
  IdMessage.Body.Add(' ');
  IdMessage.Body.Add('Backup do dia/hora: '+Nome);//+DateToStr(Date)+' - '+TimeToStr(Time));
  IdMessage.Body.Add(' ');
  IdMessage.Body.Add('Atenção! Sempre faça o backup diário!');
  //-------anexa o arquivo automaticamente
  //TIdAttachment.create(idmessage.MessageParts, TFileName(Nome));
end;

procedure TFrmBackup.MSNPopUpURLClick(Sender: TObject; URL: String);
begin
  Show;
end;

procedure TFrmBackup.BtnEmailClick(Sender: TObject);
begin
  IdSMTP.Host:= 'smtp.gmail.com';
  IdSMTP.Port:= 465;
  IdSMTP.Username:= 'aslalexandre@gmail.com';
  IdSMTP.Password:= 'aslale';
  IdMessage.From.Address:= 'aslalexandre@gmail.com';
  IdMessage.From.Name:= 'Sistema de Backup';
  IdMessage.Recipients.EMailAddresses:= EdtPara.Text;
  IdSMTP.Connect;//(3000);
  IdSSLIOHandlerSocketOpenSSL1.ReadTimeout := 30000;
  Application.ProcessMessages;
  IdSMTP.Send(IdMessage);
  Application.MessageBox('E-Mail enviado com sucesso!','Aviso',mb_IconInformation +mb_ok);
  IdSMTP.Disconnect;
  EdtPara.Clear;
end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

Seria tipo isso:

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdMessage, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, StdCtrls, IdServerIOHandlerSocket,
  IdServerIOHandler;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdSMTP1: TIdSMTP;
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    IdMessage1: TIdMessage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   with IdSMTP1 do
    begin
       AuthenticationType := atLogin;
       Host := 'smtp.gmail.com';
       IOHandler := Socket;
       Password := 'aslale';
       Port := 465;
       Username := 'aslalexandre@gmail.com';
    end;

   IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;
   IdSSLIOHandlerSocket1.SSLOptions.Mode := sslmBoth;

   IdMessage1.From.Address:= 'aslalexandre@gmail.com';

   //-- requer autenticacao
   IdSMTP1.AuthenticationType:= atLogin;

   //-- conexao segura SSL

   IdSMTP1.IOHandler := IdSSLIOHandlerSocket1;

   IdMessage1.MessageParts.Clear;

   //-- ORIGEM
   IdMessage1.From.Address := Trim('Seu Endereço');
   IdMessage1.Subject      := Trim('Sistema de Backup');
   IdMessage1.Body.Text    := Trim('Texto: Envio de Email - Teste');

   //-- DESTINO
   IdMessage1.Recipients.EMailAddresses  := 'aslalexandre@gmail.com';
   IdMessage1.BccList.EMailAddresses     := '';
   IdMessage1.CCList.EMailAddresses      := '';

   if NOT IdSMTP1.Connected then
      IdSMTP1.Connect(3000);

   if IdSMTP1.Connected then
   begin
      //IdSMTP1.Authenticate;
      IdSMTP1.Send(IdMessage1);
      Application.ProcessMessages;

      Application.MessageBox('E-Mail enviado com sucesso!','Aviso',mb_IconInformation +mb_ok);
      IdSMTP1.Disconnect;
  //EdtPara.Clear;
  end;

end;

end.

ou pode tentar esse exemplo:

http://programandodetudo.blogspot.com.br/2011/07/enviando-email-com-programa-feito-em.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Jhonas e mais uma vez obrigado pela atenção.

 

Olha realmente não sei o que estou fazendo de errado, pois não funciona aqui.

Uso win7 e já copiei seu código, baixei o exemplo que mandou e todos dão erro.

Agora está dando erro nessas linhas:

   with IdSMTP1 do
    begin
       AuthenticationType := atLogin;
e

   IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;
   IdSSLIOHandlerSocket1.SSLOptions.Mode := sslmBoth;

e

   //-- requer autenticacao
   IdSMTP1.AuthenticationType:= atLogin;

e

   if NOT IdSMTP1.Connected then
      IdSMTP1.Connect(3000);

Esse componente  IdSSLIOHandlerSocket1 é o mesmo que esse IdSSLIOHandlerSocketOpenSSL1?

No exemplo o erro acontece ao clicar no botão: Não foi possível conectar ao servidor SMTP. Cloud not load SSL lbrary

 

Link para o comentário
Compartilhar em outros sites

  • 0

veja... esses componentes.  Voce tem que coloca-los no Form ( estão nas Paletas do Indy )

    IdSMTP1: TIdSMTP;
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    IdMessage1: TIdMessage;

Erro: Não foi possível conectar ao servidor SMTP. Cloud not load SSL library

tem que ter a biblioteca SSL ( voce pode baixar da Internet )

Esse componente  IdSSLIOHandlerSocket1 é o mesmo que esse IdSSLIOHandlerSocketOpenSSL1?

acho que sim

OBS: quanto aos erros que voce reportou, aqui não acontece.  Então não posso te dizer o motivo dos erros na sua maquina.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

E isso mesmo Jhonas, nem me lembrava desse tópico. Parei de programar em Delphi em 2009 e voltei agora devido uma necessidade de um cliente. Neste tópico aí vocês resolveram meus problemas, mas usei o mesmo programa desenvolvido na época e ele mesmo está dando os erros.

Mas valeu.

Link para o comentário
Compartilhar em outros sites

  • 0

isso tem haver com a versão do indy que voce estava usando naquele tempo.

outra coisa que vi no Gmail...  foi implantado um sistema de criptografia ( SSL ) que dificulta um pouco as coisas e voce tem que configurar o seu email para habilitar o  ( POP e SMTP )

OBS: Tente alguns desses  Demos do proprio site da Indy

http://www.indyproject.org/Sockets/Demos/index.EN.aspx

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...