Je suis censé utiliser l'API G Suite au travail, mais je ne trouve pas beaucoup de matériel, alors j'ai essayé de l'utiliser pour le moment.
Cette fois, le cadre d'application est Spring Boot. Essayer d'utiliser OAuth avec une application de bureau peut être un problème.
J'omettrai l'enregistrement dans la console API, l'acquisition de l'ID client OAuth et la configuration de l'URI de redirection car il existe de nombreux documents antérieurs.
Activez Gmail sur l'écran Bibliothèque de la console API. Ajoutez ensuite la bibliothèque cliente API à votre projet. Étant donné que la bibliothèque d'API Google est séparée pour chaque service, spécifiez la bibliothèque pour Gmail. Incluez également spring-boot-starter-mail pour le formatage des données de courrier.
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'
Pour profiter de l'API de Gmail, vous devez d'abord diriger l'utilisateur vers la page de connexion Google et recevoir un code d'autorisation à partir de là. La page source elle-même peut être séparée de l'URI de redirection.
À ce stade, consultez la Liste des étendues et définissez celle pour obtenir les privilèges requis.
De plus, vous ne pouvez pas obtenir de jeton d'actualisation à moins de le définir sur setAccessType (" offline "). SetApprovalPrompt (" force ")
. Dans ce cas, la période de validité expirera dans un jour.
private static final Collection<String> SCOPES = Arrays
.asList("https://mail.google.com/");
@GetMapping("/")
public void mail(@NonNull HttpServletResponse res)
throws GeneralSecurityException, IOException {
//L'authentification a commencé
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);
}
Notez que val dans ce qui précède est lombok.val, qui sert à omettre la déclaration de type.
Une fois approuvé par l'utilisateur, vous serez redirigé vers l'URI de redirection spécifié avec un code d'autorisation, et vous obtiendrez un jeton basé sur cela.
@GetMapping(PATH)
public String doMail(@RequestParam @NonNull final String code)
throws Exception {
//Paramètre de jeton
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);
Notez que si vous connaissez le jeton d'une manière ou d'une autre, vous pouvez ignorer le processus d'authentification de l'utilisateur en créant directement l'objet TokenResponse.
Les données de courrier elles-mêmes sont des données de texte encodées en Base64URL selon la RFC 2822. Si vous écrivez ceci avec StringBuilder etc., cela peut conduire à des vulnérabilités telles que l'injection d'en-tête, donc cette fois j'utiliserai MimeMessageHelper de Spring.
val email = new MimeMessageHelper(
this.javaMailSender.createMimeMessage(), "UTF-8");
email.setSubject("tester");
email.setTo("fuga@localhost");
email.setText("Hogehoge");
val baos = new ByteArrayOutputStream();
email.getMimeMessage().writeTo(baos);
val msg = new Message()
.setRaw(Base64.encodeBase64URLSafeString(baos.toByteArray()));
La seconde moitié de ce qui précède est comme décrit dans le Guide de Google.
Créez un objet Gmail avec un objet GoogleCredential contenant un jeton d'accès. Tout ce que vous avez à faire est de sélectionner l'API à partir de là et d'exécuter execute ().
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();
Recommended Posts