Versuchen Sie, eine E-Mail mit der Google Mail API-Clientbibliothek für Java zu senden

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.

Vorbereitung

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'

Die Authentifizierung wurde gestartet

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.

Bekomme Token

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.

Mail-Datenerstellung

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.

API-Aufruf

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();

Recommended Posts

Versuchen Sie, eine E-Mail mit der Google Mail API-Clientbibliothek für Java zu senden
So senden Sie automatisch E-Mails mit Anhängen mithilfe der Google Mail-API in Python
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Ich habe versucht, E-Mails vom Sakura-Server mit Flask-Mail zu senden
Versuchen Sie, die aggregierten Ergebnisse der beiden Datensätze per E-Mail mit pykintone zu senden
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Holen Sie sich ein Zugriffstoken für die Pocket-API
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Versuchen Sie, mit VisualStudioCode eine Umgebung für MayaPython zu erstellen
Hinweise zu Transaktionen in der Java-Clientbibliothek im Datenspeicher
[Boto3] Suchen Sie mit der List Users API nach Cognito-Benutzern
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
[Python] Senden Sie eine E-Mail aus Google Mail mit einer zweistufigen Authentifizierungseinstellung
Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Versuchen Sie vorerst, die Docomo-Chat-Dialog-API zu verwenden
Erstellen Sie eine API mit Django
Versuchen Sie Auto Encoder mit Pytorch
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Rufen Sie die API mit python3 auf.
Gewähren Sie mit dem Befehl curl ein Zugriffstoken und POSTEN Sie die API