2014-11-04 3 views
11

Следующий код успешно отправляет электронное письмо с использованием серверов 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; 
+4

ПРОВЕРЕНО Вы [эту тему] (https://forums.embarcadero.com/thread.jspa?threadID= 107724 & tstart = 975) и [этот проект] (https://github.com/lordcrc/IndySASLOAuth2)? –

+1

У меня есть учетная запись с двумя шагами, включенная в моей учетной записи Gmail (что отключает параметр «Разрешить менее безопасные приложения»), и я могу войти в Gmail с помощью Indy, используя пароль приложения Google вместо OAuth. –

+0

Эй, я уже общаюсь с автором оригинального решения - очень круто. Я не решаюсь полагаться на какое-либо решение, которое требует от пользователя внесения изменений в их настройки учетной записи Google - до того, как мое приложение будет успешным. Если добавление пароля приложения Google к моему мобильному приложению Delphi XE5 означает, что пользователю не нужно вносить какие-либо изменения в свою учетную запись Google, тогда это будет отличным решением. Не могли бы вы объяснить, как добавить пароль приложения Google в проект Delphi или свойства компонента SMTP? – ImageBASE

ответ

-3

Вам нужно импортировать Lib BackgroundMailLibrary

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();