Fórum ENVIAR E-MAIL PELO DELPHI - SSL Negotiation Failed #581548
18/05/2017
0
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
Curtir tópico
+ 0Posts
20/05/2017
Bruno Deuner
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!
Gostei + 0
20/05/2017
Wilton Santos
Só uma pergunta: Isso tudo é uma única Classe?
Nao seria melhor criar algumas FACTORY`s para algumas atividades?
Gostei + 0
20/05/2017
Wilton Santos
Qual seria o metodo chamado para simplesmente fazer um envio de email com um log de erro do sistema, por exemplo?
Gostei + 0
21/05/2017
Bruno Deuner
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.Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)