2012-06-22 12 views
7

tôi cố gắng để gửi một email, nhưng tôi có một vấn đề, tuy nhiên, tôi tìm thấy mã này trên trang web:SendEmail với các thành phần 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; 

Nhưng tuy nhiên, tôi ghi nhận nhiều sai lầm và tôi đang thiếu một thành phần của Indy. lỗi biên dịch:

[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 trước

+1

Một điều là thêm 'IdEMailAddress' quy định tại khoản sử dụng của bạn để làm cho trình biên dịch biết' TIdEmailAddressItem' , nhưng khác là ví dụ về cơ bản là sai và nó cho Indy 9 (vì kiểu xác thực 'atLogin'), bạn đang sử dụng phiên bản Indy nào? Bạn có thể kiểm tra xem bạn có giữ phím 'CTRL' không và nhấp vào ví dụ: 'IdSMTP' từ mệnh đề sử dụng của bạn và sau đó kiểm tra vị trí' IdSMTP.pas' được lưu trữ. Nếu nó nằm trong thư mục 'Indy9' hoặc' Indy10'. – TLama

+0

ok cảm ơn, bây giờ các lỗi được giảm, nhưng bây giờ là 3 lỗi (tôi đã chỉnh sửa bài đầu tiên), tôi có Indy9 và Indy10, nhưng khi tôi bấm vào idSMTP tôi nhận được một lỗi: Không thể xác định vị trí tập tin idSMTP.pas –

Trả lời

8

Mã từ câu hỏi của bạn được viết cho Indy 9 và từ lỗi biên dịch của bạn có vẻ như bạn đang sử dụng Indy 10. lỗi biên dịch của bạn:

  • Undeclared identifier: Self - các Self là con trỏ đến cá thể lớp bản thân và vì bạn không viết SendSimpleMail làm phương thức lớp học nhưng cũng giống như một quy trình độc lập, bạn không có bất kỳ Self chỉ vì bạn không có bất kỳ lớp nào. Phương thức lớp bạn có thể viết ví dụ cho lớp biểu mẫu của bạn, ví dụ: TForm1.SendSimpleMail, trong đó bên trong của phương thức đó, Self sẽ có ý nghĩa của cá thể TForm1, chính biểu mẫu đó.

  • Và phần còn lại của các lỗi bạn nhận được vì bạn đang truy cập vào lớp TIdSMTP, không phải là trường hợp đối tượng. Thực hành thường được sử dụng là khai báo một biến cục bộ, tạo một cá thể đối tượng gán nó cho biến đó, làm việc với đối tượng đó (biến) và giải phóng cá thể đối tượng.

tôi sẽ cố gắng một cái gì đó như thế này (thử nghiệm với Indy 10 vận chuyển với 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

Cảm ơn, nhưng bây giờ tôi có lỗi cuối cùng: [Lỗi DCC] Unit1.pas (42): E2003 Mã định danh không khai báo: 'satDefault' –

+2

Tôi không chắc chắn với điều đó, vì trong [tham chiếu'] (http: // www.indyproject.org/docsite/html/TIdSMTP_AuthType.html) có 'atDefault', nhưng trong phiên bản được chuyển với Delphi 2009, nó là' satDefault'. Vì vậy, hãy thử sử dụng 'atDefault' để thay thế. – TLama

+1

Cảm ơn bạn! : D –

0

Đối với google SMTP bạn cần phải sử dụng TLS hoặc SSL! http://support.google.com/mail/bin/answer.py?hl=en&answer=13287

Mẫu quy trình của bạn được viết cho INDY9 và nếu bạn sử dụng INDY10 không thể biên dịch. Bạn cần điều chỉnh.

+0

Không, mã cơ bản là sai. Bạn cần tạo một cá thể 'tIdSMTP', không hoạt động với chính lớp đó. – TLama

+0

Có, bạn đã đúng. – tico