SendEmail with Indy components
The code from your question is written for Indy 9 and from your compiler error seems you're using Indy 10. To your compiler errors:
Undeclared identifier: Self
- theSelf
is the pointer to the class instance itself and since you didn't write theSendSimpleMail
as a class method but just as a standalone procedure, you don't have anySelf
just because you don't have any class. The class method you could write for instance for your form class like e.g.TForm1.SendSimpleMail
, where inside of that method theSelf
would have meaning of theTForm1
instance, the form itself.And the rest of the errors you got because you were accessing the
TIdSMTP
class, not the object instance. Commonly used practice is to declare a local variable, create an object instance assigning it to that variable, work with that object (variable) and free the object instance.
I would try something like this (tested with Indy 10 shipped with Delphi 2009):
uses
IdSMTP, IdMessage, IdEMailAddress;
procedure SendSimpleMail;
var
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
IdEmailAddressItem: TIdEmailAddressItem;
begin
IdSMTP := TIdSMTP.Create(nil);
try
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.Port := 25;
IdSMTP.AuthType := satDefault;
IdSMTP.Username := '[email protected]';
IdSMTP.Password := 'password';
IdSMTP.Connect;
if IdSMTP.Authenticate then
begin
IdMessage := TIdMessage.Create(nil);
try
IdMessage.From.Name := 'User Name';
IdMessage.From.Address := '[email protected]';
IdMessage.Subject := 'E-mail subject';
IdMessage.Body.Add('E-mail body.');
IdEmailAddressItem := IdMessage.Recipients.Add;
IdEmailAddressItem.Address := '[email protected]';
IdSMTP.Send(IdMessage);
finally
IdMessage.Free;
end;
end;
IdSMTP.Disconnect;
finally
IdSMTP.Free;
end;
end;
Giacomo King Patermo
Updated on June 13, 2022Comments
-
Giacomo King Patermo almost 2 years
I try to send an email, but I have a problem, however, I found this code on the web:
Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdMessage, IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, IdBaseComponent, IdComponent, IdIOHandler, IdExplicitTLSClientServerBase, IdSMTPBase procedure SendSimpleMail; var Msg: TIdMessage; DestAddr: TIdEmailAddressItem; begin Msg := TIdMessage.Create(Self); //error here Msg.From.Text := 'name'; Msg.From.Address := '[email protected]'; Msg.Subject := 'Test'; DestAddr := Msg.Recipients.Add; DestAddr.Text := 'name'; DestAddr.Address := '[email protected]'; Msg.Body.Add('simple test mail.'); tIdSMTP.Host := 'smtp.gmail.com'; tIdSMTP.Port := 25; tIdSMTP.AuthenticationType := atLogin; //error here (2 error) tIdSMTP.Username := '[email protected]'; tIdSMTP.Password := 'password'; tIdSMTP.Connect; tIdSMTP.Authenticate; tIdSMTP.Send(Msg); tIdSMTP.Disconnect; end;
But however, I noted many mistakes and I am missing a component of Indy. Compiler errors:
[DCC Error] Unit1.pas(36): E2003 Undeclared identifier: 'Self' [DCC Error] Unit1.pas(46): E2233 Property 'Host' inaccessible here [DCC Error] Unit1.pas(47): E2233 Property 'Port' inaccessible here [DCC Error] Unit1.pas(48): E2003 Undeclared identifier: 'AuthenticationType' [DCC Error] Unit1.pas(48): E2003 Undeclared identifier: 'atLogin' [DCC Error] Unit1.pas(49): E2233 Property 'Username' inaccessible here [DCC Error] Unit1.pas(50): E2233 Property 'Password' inaccessible here [DCC Error] Unit1.pas(51): E2076 This form of method call only allowed for class methods [DCC Error] Unit1.pas(52): E2076 This form of method call only allowed for class methods [DCC Error] Unit1.pas(53): E2076 This form of method call only allowed for class methods [DCC Error] Unit1.pas(54): E2076 This form of method call only allowed for class methods [DCC Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Thanks for the help in advance