Следующий код успешно отправляет электронное письмо с использованием серверов Gmail Google, но только после снижения настроек безопасности учетной записи Google на «Разрешить менее безопасные приложения».Как использовать OAuth 2.0 для отправки Gmail из Indy?
Код, предлагаемый ниже (первоначально от Remy LeBeau), не включает OAuth 2.0, который требуется, если вы не хотите, чтобы ваши пользователи пытались сделать свое жесткое решение, чтобы снизить уровень безопасности, чтобы ваше приложение преуспело. Как включить OAuth 2.0 в решение Indy, чтобы удовлетворить высокий стандарт безопасности Google?
Рабочий раствор:
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;
ПРОВЕРЕНО Вы [эту тему] (https://forums.embarcadero.com/thread.jspa?threadID= 107724 & tstart = 975) и [этот проект] (https://github.com/lordcrc/IndySASLOAuth2)? –
У меня есть учетная запись с двумя шагами, включенная в моей учетной записи Gmail (что отключает параметр «Разрешить менее безопасные приложения»), и я могу войти в Gmail с помощью Indy, используя пароль приложения Google вместо OAuth. –
Эй, я уже общаюсь с автором оригинального решения - очень круто. Я не решаюсь полагаться на какое-либо решение, которое требует от пользователя внесения изменений в их настройки учетной записи Google - до того, как мое приложение будет успешным. Если добавление пароля приложения Google к моему мобильному приложению Delphi XE5 означает, что пользователю не нужно вносить какие-либо изменения в свою учетную запись Google, тогда это будет отличным решением. Не могли бы вы объяснить, как добавить пароль приложения Google в проект Delphi или свойства компонента SMTP? – ImageBASE