2014-11-04 13 views
11

Mã sau đây gửi thành công email bằng cách sử dụng máy chủ Gmail của Google, nhưng chỉ sau khi giảm cài đặt bảo mật tài khoản Google thành "Cho phép ứng dụng kém an toàn hơn".Tôi làm cách nào để sử dụng OAuth 2.0 để gửi Gmail từ Indy?

Mã được cung cấp bên dưới (ban đầu từ Remy LeBeau) không kết hợp OAuth 2.0, bắt buộc nếu bạn không muốn yêu cầu người dùng đưa ra quyết định có vẻ khó khăn để giảm cài đặt bảo mật của họ. Làm cách nào để kết hợp OAuth 2.0 vào giải pháp Indy để đáp ứng tiêu chuẩn bảo mật cao hơn của Google?

Giải pháp làm việc:

function TTabbedwithNavigationForm.SendEmailNow(FromStr, ToStr, Subject, 
MessageBody, Host: String; Port: Integer; UserName, Pass: String): Boolean; 
    begin 

///From Remy LeBeau Indy SMTP with SSL via gmail host 
Result := False; 

try 
    IdMessage1 := nil; 
    IdSSLIOHandlerSocketOpenSSL1 := nil; 
    IdSMTP1 := nil; 
    try 
    //setup mail message 
    try 
     IdMessage1       := TIdMessage.Create(nil); 
     IdMessage1.From.Address    := FromStr;//// change to league email 
     IdMessage1.Recipients.EMailAddresses := ToStr; 
     IdMessage1.Subject      := Subject; 
     IdMessage1.Body.Text     := MessageBody; 
     //if FileExists(datafilename) then 
     // IdAttachmentFile := TIdAttachmentFile.Create(IdMessage1.MessageParts, datafilename); 
    except 
     Exception.RaiseOuterException(Exception.Create('Could not create message, please try again later')); 
    end; 

//setup TLS 
try 
    IdSSLIOHandlerSocketOpenSSL1     := TIdSSLIOHandlersocketopenSSL.Create(nil); 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method  := sslvTLSv1; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode  := sslmUnassigned; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := []; 
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0; 
except 
    Exception.RaiseOuterException(Exception.Create('Could not create SSL handler, please try again later')); 
end; // of try ssl 

//setup SMTP 
try 
    IdSMTP1   := TIdSMTP.Create(nil); 
    IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 
    IdSMTP1.UseTLS := utUseExplicitTLS; 
    IdSMTP1.Host  := Host;//'smtp.gmail.com'; 
    IdSMTP1.Port  := Port;//587; 
    IdSMTP1.Username := UserName; // '[email protected]'; 
    IdSMTP1.password := Pass; //***gmail account password'; 
except 
    Exception.RaiseOuterException(Exception.Create('Could not create SMTP handler, please try again later')); 
end; // of try 

try 
    IdSMTP1.Connect; 
    try 
    IdSMTP1.Send(IdMessage1) ; 
    finally 
    IdSMTP1.Disconnect; 
    end; 
except 
    Exception.RaiseOuterException(Exception.Create('Could not send secure email, please try again later')); 
end; 
    finally 
    IdSMTP1.Free; 
    IdSSLIOHandlerSocketOpenSSL1.Free; 
    IdMessage1.Free; 
    Result := True; 
    end; 
except 
    on E: Exception do 
    begin 
    if E.InnerException <> nil then 
     ShowMessage('ERROR: ' + E.Message + #13#13 + E.InnerException.Message) 
    else 
     ShowMessage('ERROR: ' + E.Message); 
    end; 
end; 

/// End Remy LeBeau Code 

end; 
+4

Bạn đã kiểm tra [chủ đề này] (https://forums.embarcadero.com/thread.jspa?threadID= 107724 & tstart = 975) và [dự án này] (https://github.com/lordcrc/IndySASLOAuth2)? –

+1

Tôi đã bật xác minh 2 bước trên tài khoản Gmail của mình (vô hiệu hóa tùy chọn "cho phép ứng dụng kém an toàn hơn") và tôi có thể đăng nhập vào Gmail bằng Indy bằng mật khẩu ứng dụng Google thay vì OAuth. –

+0

Hey Tôi đã nói chuyện với tác giả của giải pháp ban đầu - rất tuyệt. Tôi do dự phải dựa vào bất kỳ giải pháp nào yêu cầu người dùng thực hiện thay đổi đối với cài đặt tài khoản Google của họ - trước khi đơn đăng ký của tôi thành công. Nếu thêm mật khẩu ứng dụng Google vào ứng dụng di động Delphi XE5 của tôi nghĩa là người dùng không phải thực hiện bất kỳ thay đổi nào đối với tài khoản Google của họ - thì đó sẽ là một giải pháp tuyệt vời. Bạn có thể giải thích cách thêm mật khẩu ứng dụng Google vào dự án Delphi hoặc thuộc tính thành phần SMTP không? – ImageBASE

Trả lời

-3

Bạn cần phải nhập khẩu BackgroundMailLibrary lib

BackgroundMail bm = new BackgroundMail(PasswordChangeActivity.this); 
              bm.setGmailUserName(mail id); 
              bm.setGmailPassword(Utils.decryptIt(password)); 
              bm.setMailTo(ownerEmail); 
              bm.setFormSubject(subject); 
              bm.setFormBody(body); 
              bm.send(); 
Các vấn đề liên quan