Gmail-REST-API : 400 Bad Request + Fehlgeschlagen Voraussetzung
Ich versuche, mails zu versenden, basiert auf Gmail REST-API mit google java api-services. Ich habe die Konfiguration durch Google Develover Console-eine client-Anwendung heruntergeladen und p12-und json-Dateien.
Habe ich dieses Beispiel-Programme, https://developers.google.com/gmail/api/guides/sending#sending_messages...
Dieses Beispiel funktioniert, aber dies basiert auf GoogleAuthorizationCodeFlow. Ich will einfach nur, um Arbeit von server-zu-server direkt aufrufen, nicht einen browser öffnen, um ein access token... und ich habe es (das access-token), aber schließlich bekomme ich einen Bad Request.... Warum??? Ich glaube nicht, erhalten Sie mehr info nur als "Bad Request" und "Vorbedingung Fehlgeschlagen"
Basierend auf dieser ich Folgen Sie den nächsten Schritten:
-
Ersten Schritt: Erstellen Sie eine GoogleCredential-Objekt basierend auf meinem Kunden-Konto E-mail und p12-Datei generiert:
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) .setJsonFactory(new JacksonFactory()) .setServiceAccountId(serviceAccountUserEmail) .setServiceAccountScopes(scopes) .setServiceAccountPrivateKeyFromP12File( new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH)) .build();
Hier muss ich unterstreichen, dass ich viele Themen für die ussing ClientID statt ClientMail. Es muss @developer.gserviceaccount.com Konto statt .apps.googleusercontent.com . Wenn u don ' T senden Sie diese params ok , u erhalten eine "UNGÜLTIGE GEWÄHREN" - Fehler. Dies ist hier erklärt: https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization
-
Zweiten Schritt : Erstellen des Gmail-Dienstes basierend auf den Anmeldeinformationen:
Gmail gmailService = new Gmail.Builder(httpTransport, jsonFactory, credential) .setApplicationName(APP_NAME) .build();
-
Dritten Schritt Erstellen Sie ein Google-raw-Nachricht von einem MimmeMessage:
private static Message _createMessageWithEmail(final MimeMessage email) throws MessagingException, IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); email.writeTo(bytes); String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray()); Message message = new Message(); message.setRaw(encodedEmail); return message;
}
-
Vierten Schritt Aufrufen des Dienstes:
Message message = _createMessageWithEmail(email); message = service.users() .messages() .send(userId,message) .execute();
- Fünften Schritt : Resultat nach Ausführung...Hier erhalte ich die exception:
Exception in thread "main"
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Bad Request",
"reason" : "failedPrecondition"
} ],
"message" : "Bad Request"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
Eine Idee, was falsch ist oder was ist die Vorbedingung fehlgeschlagen??
- haben Sie jemals herausgefunden, was falsch war? Ich habe das gleiche Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich es geschafft, es funktioniert mit einem Google-Apps-domain:
1.- Mit einem google apps-Benutzer öffnen Sie die Entwickler-Konsole
2.- Erstellen Sie eine neue Projekt (ie MyProject)
3.- Gehen Sie zu [Apis & auth] > [Anmeldeinformationen] und erstellen Sie eine neue [Service-Konto] client-ID
4.- Kopieren Sie die [service-Konto]'s [Client-ID] (die ein wie xxx.apps.googleusercontent.com) für die spätere Verwendung
5.- Jetzt haben Sie Delegieren domain-große Vollmachten auf dem service-Konto, um zu autorisieren, Ihre appl Zugriff auf Benutzer-Daten, die im Auftrag von Benutzern in der Google Apps-domain
... so gehen Sie zu Ihrem google apps-domain admin-Konsole
6.- Gehen Sie zu [Sicherheit] - Abschnitt und finden Sie die [Erweiterte Einstellungen] (es kann ausgeblendet werden, so dass Sie würde müssen, klicken Sie auf [Show mehr..])
7.- Klicken Sie auf con [Manage API-Client-Zugriff]
8.- Fügen Sie den [Client-ID] können Sie die zuvor kopierten unter [4] in der [Client-Name] text box.
9.- Zu gewähren, Ihre app vollen Zugriff zu gmail, die [API Scopes], geben Sie im Textfeld: https://mail.google.com, https://www.googleapis.com/auth/gmail.compose, https://www.googleapis.com/auth/gmail.modify, https://www.googleapis.com/auth/gmail.readonly
(es ist sehr wichtig, dass Sie erfassen ALLE Bereiche)
Nun haben Sie alle Einstellungen gemacht,... jetzt ist der code:
1.- Erstellen Sie ein HttpTransport
2.- Erstellen Sie eine JSonFactory
3.- Erstellen Sie ein google-Anmeldeinformationen
HINWEIS: Bei setServiceAccountUser () - Methode verwenden, einen Benutzer aus Ihrer google apps-domain
4.- Erstellen Sie ein Gmail-Service
Können Sie jetzt tun, was immer Sie wollen, mit der GmailService wie senden Sie eine E-Mail 😉 wie beschrieben an https://developers.google.com/gmail/api/guides/sending
Vielen Dank für die ausführliche Antwort. Ich habe versucht diese Arbeit zu machen für asp.net MVC. Aber nachdem alles von den angegebenen Schritten, mein code, gab den gleichen Fehler.
Nachdem er 2 Tage zur Behebung dieses Fehlers, konnte ich dies lösen, in folgender Weise.
In ServiceAccountCredential.- Initialisierung-Konstruktor, müssen Sie angeben, die Benutzer-id, die Sie versuchen zu imitieren, mit diesem service-Konto.