Envio de E-mail utilizando Indy
Ola pessoal, tudo bem?
Estou com uma certa dificuldade em meu simples sistema, onde preciso criar para enviar emails utilizando o gmail.
No meu form possui somente 2 Edits e um Memo e toda a programação é feita dentro do botão enviar.
Ao tentar enviar o e-mail, é retornado o erro "Access violation at address 0065299D in module 'PSistema.exe'. Write of address 00000016." Segue abaixo os códigos:
unit Unit1_eNVIO ;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
idSMTP,
idMessage,
idSSLOpenSSL,
idExplicitTLSClientServerBase;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
menMensagem: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LSMTP: TidSMTP ;
LMessage: TidMessage;
LSocketSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
// SEGURANÇA
With LSocketSSL do
begin
with SSLOptions do
begin
Mode := sslmClient;
Method := sslvTLsv1_2;
end;
Host := 'mtp.gmail.com';// smtp.gmail.com
Port := 587; // 587 (TLS)
end;
// SMTP
With LSMTP do
begin
IOHandler := LSocketSSL;
Host := 'mtp.gmail.com';
Port := 587;
AuthType := satDefault;
UserName:= 'vdmarchioti@gmail.com';
Password := '584621973mala';
UseTLS := utUseExplicitTLS ;
end;
// MENSAGEM
With LMessage do
Begin
From.Address := edit1.text; //destinatário
From.Name := edit1.text; //destinatário
Subject := edit2.text; //assunto
Body.Add(menMensagem.Lines.Text);
end;
Try
LSMTP.Connect;
LSMTP.Send(LMessage);
Showmessage('Mensagem Enviada com Sucesso');
Except
ON E: Exception do
Showmessage ('Ocorreu um erro ao enviar o e-mail. Mensagem de erro:'+e.Message);
End;
end;
end.
Alguém saberia me informar onde estou errando? Ou se possível me encaminharem um modelo somente para eu comparar e ver no que posso estar errando. Agradeço muito!
Estou com uma certa dificuldade em meu simples sistema, onde preciso criar para enviar emails utilizando o gmail.
No meu form possui somente 2 Edits e um Memo e toda a programação é feita dentro do botão enviar.
Ao tentar enviar o e-mail, é retornado o erro "Access violation at address 0065299D in module 'PSistema.exe'. Write of address 00000016." Segue abaixo os códigos:
unit Unit1_eNVIO ;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
idSMTP,
idMessage,
idSSLOpenSSL,
idExplicitTLSClientServerBase;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
menMensagem: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LSMTP: TidSMTP ;
LMessage: TidMessage;
LSocketSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
// SEGURANÇA
With LSocketSSL do
begin
with SSLOptions do
begin
Mode := sslmClient;
Method := sslvTLsv1_2;
end;
Host := 'mtp.gmail.com';// smtp.gmail.com
Port := 587; // 587 (TLS)
end;
// SMTP
With LSMTP do
begin
IOHandler := LSocketSSL;
Host := 'mtp.gmail.com';
Port := 587;
AuthType := satDefault;
UserName:= 'vdmarchioti@gmail.com';
Password := '584621973mala';
UseTLS := utUseExplicitTLS ;
end;
// MENSAGEM
With LMessage do
Begin
From.Address := edit1.text; //destinatário
From.Name := edit1.text; //destinatário
Subject := edit2.text; //assunto
Body.Add(menMensagem.Lines.Text);
end;
Try
LSMTP.Connect;
LSMTP.Send(LMessage);
Showmessage('Mensagem Enviada com Sucesso');
Except
ON E: Exception do
Showmessage ('Ocorreu um erro ao enviar o e-mail. Mensagem de erro:'+e.Message);
End;
end;
end.
Alguém saberia me informar onde estou errando? Ou se possível me encaminharem um modelo somente para eu comparar e ver no que posso estar errando. Agradeço muito!
Vinicius David
Curtidas 0
Melhor post
Lucas Santato
31/10/2022
No meu serviço usamos componentes do ACBr para enviar emails, porém você não está criando os objetos antes de usá-lo, por isso o Acess Violation, recomendo usar dentro de um try finally, para garantir que seja eliminado da memória, ficaria mais ou menos assim:
MeuObjeto: TMeuObjeto MeuObjeto: TMeuObjeto.Create(nil) // criando o objeto e alocando ele na memória try //Seus tratamentos e códigos... finally FreeAndNil(MeuObjeto) // limpando o objeto da memória
GOSTEI 1