windows - EnviarEmail con componentes de Indy
delphi compiler-construction (2)
Intento enviar un correo electrónico, pero tengo un problema, sin embargo, encontré este código en la 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;
Pero, sin embargo, noté muchos errores y me falta un componente de Indy. Errores del compilador:
[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''
Gracias por la ayuda por adelantado
¡Para google smtp necesitas usar TLS o SSL! http://support.google.com/mail/bin/answer.py?hl=en&answer=13287
Su muestra de procedimiento es para INDY9 y si utiliza INDY10 no puede compilarse. Necesitas hacer ajustes.
El código de su pregunta está escrito para Indy 9 y de su error de compilación parece que está usando Indy 10. Para los errores de compilación:
Undeclared identifier: Self
- theSelf
es el puntero a la instancia de la clase en sí y ya que noSendSimpleMail
como método de clase, sino solo como un procedimiento independiente, no tienes ningúnSelf
solo porque no tienes ningún clase. El método de clase podría escribir, por ejemplo, para su clase de formulario como, por ejemplo,TForm1.SendSimpleMail
, donde dentro de ese método elSelf
tendría significado de la instancia deTForm1
, la forma misma.Y el resto de los errores que recibió porque estaba accediendo a la clase
TIdSMTP
, no a la instancia del objeto. La práctica comúnmente utilizada es declarar una variable local, crear una instancia de objeto asignándola a esa variable, trabajar con ese objeto (variable) y liberar la instancia del objeto.
Intentaré algo como esto (probado con Indy 10 enviado con 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;