2014-11-04 13 views
11

Następujący kod pomyślnie wysyła wiadomość e-mail przy użyciu serwerów Gmail Google, ale dopiero po obniżeniu ustawień zabezpieczeń konta Google do "Zezwalaj na aplikacje mniej bezpieczne".Jak używać OAuth 2.0 do wysyłania Gmaila z Indy?

Poniższy kod (pierwotnie z Remy LeBeau) nie zawiera OAuth 2.0, który jest wymagany, jeśli nie chcesz, aby Twoi użytkownicy podjęli trudną decyzję o obniżeniu ich ustawień bezpieczeństwa, aby pozwolić Twojej aplikacji odnieść sukces. Jak włączyć OAuth 2.0 do rozwiązania Indy, aby spełnić wyższy standard bezpieczeństwa Google?

Roztwór roboczy:

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

Czy sprawdziłeś [Wątek] (https://forums.embarcadero.com/thread.jspa?threadID= 107724 & tstart = 975) i [ten projekt] (https://github.com/lordcrc/IndySASLOAuth2)? –

+1

Mam włączoną weryfikację dwuetapową na moim koncie Gmail (co wyłącza opcję "zezwalaj na mniej bezpieczne aplikacje"), a ja mogę zalogować się do Gmaila w Indy przy użyciu hasła aplikacji Google zamiast OAuth. –

+0

Hej, już rozmawiam z autorem oryginalnego rozwiązania - bardzo fajnie. Nie chcę polegać na żadnym rozwiązaniu, które wymaga od użytkownika zmiany ustawień konta Google - zanim moja aplikacja się powiedzie. Dodanie hasła do aplikacji Google do mojej aplikacji mobilnej Delphi XE5 oznacza, że ​​użytkownik nie musi wprowadzać żadnych zmian na swoim koncie Google - wtedy byłoby to świetne rozwiązanie. Czy możesz wyjaśnić, jak dodać hasło do aplikacji Google do projektu Delphi lub właściwości komponentu SMTP? – ImageBASE

Odpowiedz

-3

trzeba importować 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(); 
Powiązane problemy