2015-11-01 18 views
6

Tôi đã sử dụng Indy dưới Delphi để gửi tin nhắn qua tài khoản gmail, sử dụng các thành phần TIdSMTP và TIdMessage. Điều này hoạt động hoàn toàn tốt đẹp.Delphi - Indy - lưu bản nháp GMail

Tuy nhiên, khách hàng của tôi đã yêu cầu lưu thư vào thư mục DRAFTS để cho phép anh ta thực hiện thay đổi cho thư (được tạo lập trình) trước khi gửi thư.

GMail API có nghĩa vụ hỗ trợ điều này, nhưng các ví dụ được cung cấp không ở định dạng Delphi/Indy ... Tôi đang tìm các thay đổi lập trình tối thiểu vì vậy tôi muốn biết liệu có thể có trong các thành phần Indy không ? TIdMessage cho phép cờ "mfDraft", nhưng điều này không ngăn thư được gửi ngay lập tức khi sử dụng IdSMTP1.Send

+1

liên quan: http://stackoverflow.com/questions/ 1206275/create-messages-ie-drafts-in-gmail-với-imap-smtp – mjn

+0

Nó NÊN là thư mục dự thảo GMail ... – Jur

Trả lời

3

SMTP không có khái niệm về bản nháp. Bạn phải sử dụng IMAP để thay thế.

Sử dụng TIdIMAP4 để đăng nhập vào tài khoản Gmail, gọi phương thức SelectMailBox() để chọn thư mục dự thảo và sau đó gọi một trong các phương thức AppendMsg...() để lưu trữ thư nháp vào thư mục nếu cần.

Nếu bạn muốn thay đổi một dự thảo trước khi gửi đi, bạn sẽ phải lấy dự thảo hiện tại từ thư mục (một trong những Retrieve...() hoặc UIDRetrieve...() phương pháp) và chỉnh sửa được khi cần thiết, sau đó xóa bản nháp hiện tại từ thư mục (phương thức DeleteMsgs() hoặc UIDDeleteMsg()) và thêm bản nháp mới vào thư mục.

Để thực sự gửi bản nháp, bạn sẽ phải truy xuất và xóa thư nháp khỏi thư mục nháp, sau đó sử dụng SMTP để gửi.

2

OK, cho bất cứ ai đọc chủ đề này trong thời gian tới ... đây là đoạn code cần thiết: (GEBR và ww là tên người dùng và mật khẩu)

procedure DraftGMail(Info:TIdMessage; gebr,ww:string); 
var 


    IdIMAP41:TIdIMAP4; 
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; 
begin 

    IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.create; 
    try 
    IdSSLIOHandlerSocketOpenSSL1.Destination := 'imap.gmail.com:993'; 
    IdSSLIOHandlerSocketOpenSSL1.host := 'imap.gmail.com'; 
// IdSSLIOHandlerSocketOpenSSL1.MaxLineAction := maException; 
    IdSSLIOHandlerSocketOpenSSL1.Port := 993; 
    IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLversions := [sslvSSLv3]; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := []; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0; 

    IdIMAP41:= TIdIMAP4.create; 
    try 
     IdIMAP41.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 
     IdIMAP41.Host := 'imap.gmail.com'; 
     IdIMAP41.Password := ww; 
     IdIMAP41.Port := 993; 
//  IdSMTP1.SASLMechanisms := <>; 
     IdIMAP41.UseTLS := utUseImplicitTLS; 
     IdIMAP41.Username := gebr; 

     IdIMAP41.Connect; 
//  IdIMAP41.ListMailBoxes(Boxes); 
     IdIMAP41.SelectMailbox('[Gmail]/Drafts'); 
     IdIMAP41.AppendMsg('[Gmail]/Drafts',Info); 
     IdIMAP41.Disconnect; 

    finally 
     FreeAndNil(IdIMAP41); 
    end; 

    finally 
    FreeAndNil(IdSSLIOHandlerSocketOpenSSL1); 

    end; 
end; 
+0

Thật không may, mã này chỉ hoạt động đối với các tài khoản tiếng Anh; ví dụ: trên tên miền tiếng Hà Lan, tên hộp thư phải là "[Gmail]/Concepten" – Jur

+0

@Jur Tôi không chắc liệu SelectMailbox từ Indy có trả về một boolean hay không. Trong Synapse nó và bạn có thể làm một cái gì đó như thế này: 'nếu không Imap.SelectFolder ('[Gmail]/Drafts') sau đó Imap.SelectFolder ('[Gmail]/Concepten');'. Trong trường hợp đó, ngôn ngữ của tài khoản có thể được đặt thành tiếng Anh hoặc tiếng Hà Lan. Sau đó bạn cũng có thể làm điều này: 'Imap.AppendMess (Imap.SelectedFolder, m.Lines);' do đó bạn không cần phải cung cấp dự thảo hoặc khái niệm nữa. Bạn không bao giờ biết nếu có ai đó, ngay cả một người Hà Lan, đã đặt Gmail của mình thành tiếng Anh (như tôi). Vì vậy, bạn cần phải kiểm tra cả hai. – Rik

Các vấn đề liên quan