Envio de E-mail utilizando Indy

CRUD - Delphi

30/10/2022

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!
Vinicius David

Vinicius David

Curtidas 0

Melhor post

Lucas Santato

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
POSTAR