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;
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)? –
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. –
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