2012-06-22 38 views
7

intento enviar un correo electrónico, pero tengo un problema, sin embargo, me encontré con este código en la web:SendEmail con componentes Indy

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, he observado 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 de antemano

+1

Una cosa es la adición de 'IdEMailAddress' a su cláusula de usos para que el compilador conoce el' TIdEmailAddressItem' , pero otra es que el ejemplo es básicamente incorrecto y es para Indy 9 (debido al tipo de autenticación 'atLogin'), ¿qué versión de Indy estás usando? Puede verificarlo si mantiene presionada la tecla 'CTRL' y hace clic en, p. 'IdSMTP' de su cláusula uses y luego verifique dónde está almacenado el' IdSMTP.pas'. Si está en la carpeta 'Indy9' o' Indy10'. – TLama

+0

ok gracias, ahora los errores han disminuido, pero ahora son 3 errores (he editado la primera publicación), tengo Indy9 e Indy10, pero cuando hago clic en idSMTP me sale un error: no se puede encontrar el archivo idSMTP.pas –

Respuesta

8

El código de su pregunta está escrito para Indy 9 y de su error del compilador parece que está utilizando Indy 10. Para los errores de compilación:

  • Undeclared identifier: Self - la Self es el puntero a la instancia de clase en sí y ya que no escribió el SendSimpleMail como método de clase, sino como un procedimiento independiente, no tiene ningún Self simplemente porque no tiene ninguna clase. El método de clase que podría escribir, por ejemplo, para su clase de formulario, como p. TForm1.SendSimpleMail, donde dentro de ese método el Self tendría el significado de la instancia TForm1, el formulario en sí.

  • 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.

me gustaría probar algo como esto (probado con Indy 10 se entrega 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; 
+0

Gracias, pero ahora tengo un último error: [Error de DCC] Unit1.pas (42): E2003 Identificador no declarado: 'satDefault' –

+2

No estaba seguro con eso, ya que en ['reference'] (http: // www.indyproject.org/docsite/html/TIdSMTP_AuthType.html) está el 'atDefault', pero en la versión enviada con Delphi 2009 es el' satDefault'. Intenta usar 'atDefault' en su lugar. – TLama

+1

¡Gracias, trabajo! : D –

0

para Google SMTP que debe utilizar 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 se puede compilar. Necesita hacer ajustes.

+0

No, el código es básicamente incorrecto Necesita crear una instancia de 'tIdSMTP', que no funcione con la clase misma. – TLama

+0

Sí, tienes razón. – tico

Cuestiones relacionadas