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