2014-11-04 2 views
11

Der folgende Code sendet erfolgreich eine E-Mail mit den Google Mail-Servern von Google, jedoch erst, nachdem die Sicherheitseinstellungen des Google-Kontos auf "Weniger sichere Apps zulassen" zurückgesetzt wurden.Wie verwende ich OAuth 2.0, um Gmail von Indy zu senden?

Der unten angebotene Code (ursprünglich von Remy LeBeau) enthält OAuth 2.0 nicht. Dies ist erforderlich, wenn Sie Ihre Benutzer nicht dazu auffordern möchten, die Sicherheitseinstellungen zu verringern, damit Ihre Anwendung erfolgreich ausgeführt werden kann. Wie integriere ich OAuth 2.0 in die Indy-Lösung, um den höheren Sicherheitsstandard von Google zu erfüllen?

Arbeitslösung:

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

Haben Sie überprüft [dieses Thema] (importieren https://forums.embarcadero.com/thread.jspa?threadID= 107724 & tstart = 975) und [dieses Projekt] (https://github.com/lordcrc/IndySASLOAuth2)? –

+1

Ich habe die Bestätigung in zwei Schritten für mein Google Mail-Konto aktiviert (wodurch die Option "Weniger sichere Apps zulassen" deaktiviert wird) und ich kann mich mit Indy mit einem Google App-Passwort anstelle von OAuth bei Google Mail anmelden. –

+0

Hey, ich spreche schon mit dem Autor der ursprünglichen Lösung - sehr cool. Ich zögere, mich auf eine Lösung zu verlassen, bei der der Nutzer eine Änderung an seinen Google-Kontoeinstellungen vornehmen muss - bevor meine Bewerbung erfolgreich ist. Wenn das Hinzufügen eines Google App-Passworts zu meiner Delphi XE5-Mobilanwendung bedeutet, dass der Nutzer keine Änderungen an seinem Google-Konto vornehmen muss, wäre dies eine großartige Lösung. Können Sie erklären, wie Sie dem Delphi-Projekt oder den SMTP-Komponenteneigenschaften ein Google App-Passwort hinzufügen? – ImageBASE

Antwort

-3

Sie benötigen 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(); 
Verwandte Themen