Ich sollte die G Suite-API bei der Arbeit verwenden, kann aber nicht viel Material finden, daher habe ich vorerst versucht, sie zu verwenden.
Dieses Mal ist das Anwendungsframework Spring Boot. Der Versuch, OAuth mit einer Desktop-App zu verwenden, kann problematisch sein.
Ich werde die Registrierung in der API-Konsole, die Erfassung der OAuth-Client-ID und die Einstellung des Umleitungs-URI weglassen, da es viele frühere Dokumente gibt.
Aktivieren Sie Google Mail auf dem Bibliotheksbildschirm der API-Konsole. Fügen Sie dann die API-Clientbibliothek zu Ihrem Projekt hinzu. Da die Google API-Bibliothek für jeden Dienst getrennt ist, geben Sie die Bibliothek für Google Mail an. Fügen Sie außerdem Spring-Boot-Starter-Mail zum Formatieren von Mail-Daten hinzu.
build.gradle
// https://mvnrepository.com/artifact/com.google.apis/google-api-services-gmail
compile group: 'com.google.apis', name: 'google-api-services-gmail', version: 'v1-rev72-1.23.0'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.8.RELEASE'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail
compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.5.8.RELEASE'
Um die API von Google Mail nutzen zu können, müssen Sie den Nutzer zunächst zur Google-Anmeldeseite weiterleiten und von dort einen Autorisierungscode erhalten. Die Quellseite selbst kann vom Umleitungs-URI getrennt sein.
Sehen Sie sich zu diesem Zeitpunkt die Bereichsliste an und legen Sie diejenige fest, um die erforderlichen Berechtigungen zu erhalten. Außerdem können Sie ein Aktualisierungstoken nur erhalten, wenn Sie es auf "setAccessType (" offline "). SetApprovalPrompt (" force ")" setzen. In diesem Fall läuft die Gültigkeitsdauer an einem Tag ab.
private static final Collection<String> SCOPES = Arrays
.asList("https://mail.google.com/");
@GetMapping("/")
public void mail(@NonNull HttpServletResponse res)
throws GeneralSecurityException, IOException {
//Die Authentifizierung wurde gestartet
val jsonFactory = JacksonFactory.getDefaultInstance();
val transport = GoogleNetHttpTransport.newTrustedTransport();
val flow = new GoogleAuthorizationCodeFlow.Builder(transport,
jsonFactory, CLIENT_ID, CLIENT_SECRET, SCOPES).build();
val url = flow.newAuthorizationUrl().setAccessType("offline")
.setApprovalPrompt("force").setRedirectUri(REDIRECT_URI)
.build();
res.sendRedirect(url);
}
Beachten Sie, dass val oben lombok.val ist, um die Typdeklaration wegzulassen.
Nach der Genehmigung durch den Benutzer werden Sie mit einem Autorisierungscode zum angegebenen Umleitungs-URI umgeleitet und erhalten darauf basierend ein Token.
@GetMapping(PATH)
public String doMail(@RequestParam @NonNull final String code)
throws Exception {
//Token-Einstellung
val jsonFactory = JacksonFactory.getDefaultInstance();
val transport = GoogleNetHttpTransport.newTrustedTransport();
val token = new GoogleAuthorizationCodeTokenRequest(transport,
jsonFactory, CLIENT_ID, CLIENT_SECRET, code, REDIRECT_URI)
.execute();
val cred = new GoogleCredential.Builder().setJsonFactory(jsonFactory)
.setTransport(transport)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET).build()
.setFromTokenResponse(token);
Beachten Sie, dass Sie den Benutzerauthentifizierungsprozess überspringen können, wenn Sie das Token auf irgendeine Weise kennen, indem Sie das TokenResponse-Objekt direkt erstellen.
Die Mail-Daten selbst sind Base64URL-codierte Textdaten gemäß RFC 2822. Wenn Sie dies mit StringBuilder usw. schreiben, kann dies zu Sicherheitslücken wie der Header-Injection führen. Daher werde ich dieses Mal Spring's MimeMessageHelper verwenden.
val email = new MimeMessageHelper(
this.javaMailSender.createMimeMessage(), "UTF-8");
email.setSubject("Prüfung");
email.setTo("fuga@localhost");
email.setText("Hogehoge");
val baos = new ByteArrayOutputStream();
email.getMimeMessage().writeTo(baos);
val msg = new Message()
.setRaw(Base64.encodeBase64URLSafeString(baos.toByteArray()));
Die zweite Hälfte des oben genannten ist wie im Google-Handbuch beschrieben.
Erstellen Sie ein Google Mail-Objekt mit einem GoogleCredential-Objekt, das ein Zugriffstoken enthält. Alles was Sie tun müssen, ist die API von dort auszuwählen und execute () auszuführen.
val gmail = new Gmail.Builder(transport, jsonFactory, cred)
.setApplicationName("thud").build();
val res = gmail.users().messages().send(EMAIL, msg).execute();
// val res = gmail.users().labels().list(EMAIL).execute();
return res.toString();