GARANTIR DESCONTO

Fórum ENVIAR E-MAIL PELO DELPHI - SSL Negotiation Failed #581548

18/05/2017

0

Pessoal, preciso de ajuda para enviar e-mails a partir da minha aplicação.
O processo é aparentemente simples, mas não estou conseguindo. Sempre gera o erro "SSL NEGOTIATION FAILED". Quando retiro a segurança ele me gera outro erro
Já tentei de toda forma, já vi vários exemplos no site e modelos, mas não funciona na minha aplicação.
vejam meu código:

procedure TFrmSugerencias.btnEnviarClick(Sender: TObject);
  var
  // objetos necessários para o funcionamento
  IdSSL: TIdSSLIOHandlerSocketOpenSSL;
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  CaminhoAnexo: string;

begin
  // instanciação dos objetos
    IdSMTP := TIdSMTP.Create(nil);
    IdMessage := TIdMessage.Create(nil);
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  // Configuração do SSL
    IdSSL.SSLOptions.Method := sslvSSLv23;//sslvTLSv1;//
    IdSSL.SSLOptions.Mode := sslmClient;
    IdSSL.SSLOptions.VerifyMode := [];
    IdSSL.SSLOptions.VerifyDepth := 0;

  // Configuração do SMTP
    IdSMTP.IOHandler := IdSSL; //Aki você linka com o componente TIdSSLIOHandlerSocket
    IdSMTP.AuthType := satDefault;
    IdSMTP.UseTLS := utUseRequireTLS;
    IdSMTP.Port := 587;
    IdSMTP.Host := 'smtp.gmail.com';
    IdSMTP.Username := 'meu_email@gmail.com';
    IdSMTP.Password := 'minha_senha_gmail';

  try
   // Configuração da mensagem
    IdMessage.Clear;
    IdMessage.MessageParts.Clear;
    IdMessage.From.Address := 'meu_email@gmail.com';
    IdMessage.From.Name := 'WILTON';
    IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
    IdMessage.Recipients.EMailAddresses := 'e-mail_destinatariol@gmail.com';
    IdMessage.Subject := lblSugerencia.Caption;;
    IdMessage.Body.Text := (mmoSugerencia.Text);//'Corpo do e-mail';
    IdMessage.Body.Text := 'Data/Hora: ' + DateTimeToStr(Now);
    IdMessage.ContentType := 'Multipart/Related';
    IdMessage.Priority := mpNormal;

    // Tentativa de conexão e autenticação
    try
      IdSMTP.Connect;
      IdSMTP.Authenticate;
    except
      on E:Exception do
      begin
        MessageDlg('Erro na conexão e/ou autenticação: ' +
                    E.Message, mtWarning, [mbOK], 0);
        Exit;
      end;
    end;

    // Anexo da mensagem (opcional)
    CaminhoAnexo := 'C:\\Anexo.txt';
    if FileExists(CaminhoAnexo) then
      TIdAttachmentFile.Create(IdMessage.MessageParts, CaminhoAnexo);

    // Envio da mensagem
    try
      IdSMTP.Send(IdMessage);
      MessageDlg('Mensagem enviada com sucesso.', mtInformation, [mbOK], 0);
    except
      On E:Exception do
        MessageDlg('Erro ao enviar a mensagem: ' +
                    E.Message, mtWarning, [mbOK], 0);
    end;
  finally
    // liberação dos objetos da memória
    FreeAndNil(IdMessage);
    FreeAndNil(IdSSL);
    FreeAndNil(IdSMTP);
  end;
Wilton Santos

Wilton Santos

Responder

Posts

20/05/2017

Bruno Deuner

Boa tarde!
Tenho uma classe para envio e recebimento de e-mail's, da uma olhada nela, está funcionando perfeitamente:
https://github.com/brunodeuner/Tora/blob/master/Tora.Email.pas

lembrando que você tem que autorizar o envio de e-mail por aplicativos não seguros pelo link:
https://myaccount.google.com/lesssecureapps

Qualquer duvida estou a disposição!
Responder

Gostei + 0

20/05/2017

Wilton Santos

Puxa, legal.
Só uma pergunta: Isso tudo é uma única Classe?
Nao seria melhor criar algumas FACTORY`s para algumas atividades?
Responder

Gostei + 0

20/05/2017

Wilton Santos

Voce poderia colocar um exemplo da utilizacao desta classe em um form de envio de email?

Qual seria o metodo chamado para simplesmente fazer um envio de email com um log de erro do sistema, por exemplo?
Responder

Gostei + 0

21/05/2017

Bruno Deuner

Pergunta: Isso tudo é uma única Classe?
Resposta: São 3 classes, 1 para o envio, 1 para o recebimento e outra para centralizar elas, mas se quiser facilmente tu pode só usar uma delas, sem modificar a unit.

Pergunta: Voce poderia colocar um exemplo da utilizacao desta classe em um form de envio de email?
Reposta: Fiz um exemplo de ao clicar no botão você envia um e-mail.

Pergunta: Qual seria o metodo chamado para simplesmente fazer um envio de email com um log de erro do sistema, por exemplo?
Resposta: Usa o mesmo código do botão, para fazer o log de erros, poderia colocar o componente ApplicationEvents e no evento OnException você envia o e-mail.

unit Unit26;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm26 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DepoisDoEnvio(Sender: TObject; Status: Boolean);
  end;

var
  Form26: TForm26;

implementation

uses Tora.Email;

var
  Email: TEmail;

{$R *.dfm}

procedure TForm26.DepoisDoEnvio(Sender: TObject; Status: Boolean);
begin
  if Status then
    ShowMessage('Enviou com sucesso!')
  else
    ShowMessage('Falha ao enviar e-mail');
end;

procedure TForm26.Button1Click(Sender: TObject);
begin
  Email := TEmail.Create;
  with Email do
  begin
    Account.UserName := 'email';
    Account.Password := 'senha';
    Send.Assunto := 'assunto';
    Send.Texto.Text := 'conteudo do email';
    Send.Destino.Add('destino');
    Send.OnAfterSend := DepoisDoEnvio;
    Enviar;
  end;
end;

procedure TForm26.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Email.Cancel;
  FreeAndNil(Email);
end;

end.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar