Erhalten Sie E-Mails mithilfe der Google Mail-API in Java

Einführung

Ich habe versucht, die Google Mail-API in Java zu verwenden, aber selbst wenn ich sie gegoogelt habe, war ich traurig, dass nur Stapelüberlauf- und englische Artikel auf der offiziellen Website von Google veröffentlicht wurden, sodass ich einen Artikel auf Japanisch schreiben musste. habe gedacht.

Was du machen willst

Ich möchte den Text und die angehängten Dateien der in Google Mail empfangenen E-Mails mit Java abrufen.

Annahme

--Verwenden Sie Eclipse.

E-Mail, die Sie erhalten möchten

Dies ist eine Beispiel-E-Mail, um diese Zeit zu erhalten. 19.png Ich habe ein Bild eines Linux-Pinguins in die angehängte Datei angehängt.

Bibliothek importieren

Rufen Sie zur Vorbereitung auf die Verwendung der Google Mail-API zunächst die Google Mail-API-Bibliothek unter der folgenden URL ab. Gmail API Client Library for Java ; https://developers.google.com/api-client-library/java/apis/gmail/v1

Diejenigen, die MAVEN und GRADLE verwenden, können die Bibliothek installieren, indem sie den Anweisungen unter dem Link folgen. Wenn Sie eine solche Annehmlichkeit aus verschiedenen Gründen nicht nutzen können, laden Sie sie als Zip herunter und fügen Sie alle JAR-Dateien hinzu.

Authentifizierungseinstellungen

Führen Sie die folgenden zwei Dinge aus.

--Erstellen Sie ein Projekt in Ihrem Google-Konto.

Erstellen Sie ein Projekt

Greifen Sie auf die folgende URL zu und erstellen Sie ein Projekt. Ressourcenverwaltung; https://console.developers.google.com/cloud-resource-manager __1. Klicken Sie auf "Projekt erstellen" __ 13.png

__2. Geben Sie einen geeigneten Projektnamen ein und klicken Sie auf "Erstellen" __ 14.png

__3. Nach einer Weile wird ein Projekt erstellt __ Warten wir einen Moment 15.png

Aktivieren Sie die Google Mail-API

Greifen Sie über die folgende URL auf die API-Bibliothek von Google zu und aktivieren Sie die Google Mail-API. API-Bibliothek; https://console.developers.google.com/apis/library 6.png

Bereiten Sie den OAuth 2.0-Client vor

Greifen Sie auf die folgende URL zu, um einen OAuth 2.0-Client zu erstellen. Anmeldeinformationen; https://console.developers.google.com/apis/credentials

__1. Klicken Sie auf Anmeldeinformationen erstellen __ 7.png

__2. OAuth-Client-ID auswählen __ 8.png

__3. Wählen Sie "Andere", geben Sie ihm einen Namen und klicken Sie auf "Erstellen" __ 9.png

__4. Fertigstellung __ 11.png

__5. Laden Sie den privaten Schlüssel zur späteren Verwendung herunter __ Alles ist in Ordnung, aber speichern wir es als "client_secret.json". 12.png

__6 OAuth-Zustimmungsbildschirm entsprechend erstellen __ 10.png

Schreiben Sie Java

Der Verarbeitungsablauf ist ungefähr wie folgt, daher werden wir in der richtigen Reihenfolge fortfahren.

  1. Authentifizierung
  2. Nachrichten-ID abrufen
  3. Mail holen
  4. Körperdecodierung
  5. Laden Sie angehängte Dateien herunter

Authentifizierung

Führen Sie basierend auf dem zuvor erhaltenen privaten Schlüssel Authentifizierungsarbeiten durch, um ein Token für die Verwendung der API und ein Aktualisierungstoken für die Neuausstellung des Tokens zu erhalten.

__1. Platzieren Sie den zuvor erhaltenen privaten Schlüssel "client_secret.json" im Projekt __ 16.png

__2. Ich erhalte die für die Authentifizierung erforderlichen Informationen, z. B. das Aktualisierungstoken basierend auf dem privaten Schlüssel, erstelle jedoch einen Ordner im Projekt, um ihn zu speichern. __ Nennen Sie es vorerst "Anmeldeinformationen". 17.png

__3. Endlich Codierung __ Holen Sie sich ein Token zur Verwendung der API und ein Aktualisierungstoken zur erneuten Ausgabe des Tokens basierend auf dem privaten Schlüssel

//Json-Verarbeitung
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
//Umfang
List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
//Privat Schlüssel
String CLIENT_SECRET_DIR = "client_secret.json";
//Speicherordner für Konfigurationsdateien rund um die Authentifizierung
String CREDENTIALS_FOLDER = "credentials";
//HTTP-Kommunikation
NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

//Authentifizierung
//Den privaten Schlüssel lesen
FileInputStream in = new FileInputStream(new File(CLIENT_SECRET_DIR));
InputStreamReader reader = new InputStreamReader(in);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, reader);
//Authentifizierungseinstellungen
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
        clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER)))
                .setAccessType("offline").build();
//Authentifizieren
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

Zunächst die Erklärung der Konstanten

--_ JSON_FACTORY__: Objekt zur Verarbeitung von JSON. Die von der API zurückgegebenen Daten liegen im JSON-Format vor. --__ GELTUNGSBEREICH____: Wie viel Zugriff sollte Google Mail über die API erhalten? Die GmailScopes-Klasse sollte alle Konstanten enthalten. Wählen Sie daher die entsprechende Konstante aus und verwenden Sie sie. Wenn Sie GMAIL_READONLY auswählen, sollten Sie in der Lage sein, diesmal alles zu tun, was Sie möchten. Wählen Sie es also aus. --__ CLIENT_SECRET_DIR__: Der Pfad der privaten Schlüsseldatei. Dieses Mal habe ich den Namen "client_secret.json" direkt darunter gesetzt, sodass "client_secret.json" in Ordnung ist. --__ CREDENTIALS_FOLDER__: Der Pfad des Ordners zum Speichern der Dateien um die mit dem privaten Schlüssel erhaltene Authentifizierung. Legen Sie den oben erstellten Ordner fest. --__ HTTP_TRANSPORT__: Objekt für die HTTP-Kommunikation.

Als nächstes Erläuterung der Verarbeitung

//Den privaten Schlüssel lesen
FileInputStream in = new FileInputStream(new File(CLIENT_SECRET_DIR));
InputStreamReader reader = new InputStreamReader(in);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, reader);

Der private Schlüssel "client_secret.json" direkt darunter wird gelesen

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
    .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER)))
    .setAccessType("offline").build();

Ich habe die Einstellung zum Auslösen der Authentifizierung festgelegt.

//Authentifizieren
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

Führen Sie tatsächlich eine HTTP-Kommunikation durch, werfen Sie den privaten Schlüssel, rufen Sie das Token oder das Zugriffstoken ab und speichern Sie es im angegebenen Ordner. Wenn Sie es ausführen, sollten Sie einige Dateien im Ordner sehen, wie unten gezeigt. 18.png

Nachrichten-ID abrufen

Ich verwende eine API namens Liste der Nachrichten. Nachrichten ist eine API zum Abrufen, Senden und Bearbeiten von E-Mails. Die Liste enthält buchstäblich eine Liste der empfangenen E-Mails. Da es sich nur um eine Liste handelt, können Sie nur die Nachrichten-ID und die Thread-ID abrufen und den Text nicht sehen. Verwenden Sie get in messages, um den Text und detaillierte Daten abzurufen. Die Erklärung der offiziellen Website lautet vorerst wie folgt (amerikanisch)

Users.messages: list ; https://developers.google.com/gmail/api/v1/reference/users/messages/list

Das Lesen ist praktisch, da es die zum Auslösen der API erforderlichen Informationen, den erforderlichen Bereich, die Definition des zurückgegebenen JSON und den Beispielcode in verschiedenen Sprachen enthält. Es ist amerikanisch.

Erstellen Sie vorerst ein Objekt für den Google Mail-Dienst, führen Sie die Nachrichtenliste für dieses Objekt aus und fügen Sie die zurückgegebenen Daten in die Liste ein.

//Erstellen Sie einen Google Mail-Dienst
//Anwendungsname
String APPLICATION_NAME = "Test1";
//Greifen Sie auf Google Mail zu
Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();

//Post bekommen
//Nutzer
String USER = "me";
//Erhalten Sie alle E-Mails(Nur die Nachrichten-ID ist enthalten)
ListMessagesResponse messagesResponse = service.users().messages().list(USER).execute();
List<Message> messageList = messagesResponse.getMessages();

Beschreibung der Konstanten

--__ APPLICATION_NAME__: Der Name, der dem Objekt des zu erstellenden Google Mail-Dienstes gegeben werden soll. Angemessen.

Beschreibung der Verarbeitung

//Erstellen Sie einen Google Mail-Dienst
//Anwendungsname
String APPLICATION_NAME = "Test1";
//Greifen Sie auf Google Mail zu
Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();

Ich erstelle ein Objekt für den Google Mail-Dienst.


//Post bekommen
//Nutzer
String USER = "me";
//Erhalten Sie alle E-Mails(Nur die Nachrichten-ID ist enthalten)
ListMessagesResponse messagesResponse = service.users().messages().list(USER).execute();
List<Message> messageList = messagesResponse.getMessages();

Ich führe eine Liste von Nachrichten aus und speichere die Ergebnisse in einer Liste. Das Argument ist nur Benutzer. Ich möchte meine Mail sehen, also lege einfach "mich" hinein. Dadurch wird eine JSON-Liste erstellt, die nur die Nachrichten-ID und die Thread-ID enthält, wie unten gezeigt.

{
    "id": "1635e36ac0cf27ce",
    "threadId": "1635e36ac0cf27ce"
}

Post bekommen

Erhalten Sie außerdem detaillierte Daten wie Betreff und Text aus der Nachrichten-ID, um die Ziel-E-Mails einzugrenzen.

//Durchsuchen Sie alle E-Mail-Daten, um die Ziel-E-Mail zu finden
Message targetMessage = null;
for (Message message : messageList) {
    //Holen Sie sich alle Mail-Daten
    Message fullMessage = service.users().messages().get(USER, message.getId()).execute();
    //Header anzeigen
    for (MessagePartHeader header : fullMessage.getPayload().getHeaders()) {
        //Name ist Betreff in der Kopfzeile(Gegenstand)Rufen Sie die Nachrichten-ID der Nachricht ab, deren Wert "Testmail" ist.
        if (header.getName().equals("Subject") && header.getValue().equals("Test Email")) {
            targetMessage = fullMessage;
        }
    }
}

Um zunächst eine Entschuldigung zu finden, ist die Art und Weise, diesen Code zu schreiben, nicht sehr gut. Es ist besser, diesen Prozess in Methoden zu unterteilen und ihn zu einer Methode zu machen, die zurückgegeben wird, wenn die Zielmail gefunden wird, und ich würde es definitiv tun So werde ich es machen. Dieses Mal wollte ich als Beispielcode, der im Internet veröffentlicht werden soll, die gesamte Verarbeitung auf dieselbe Weise schreiben, also habe ich dies getan.

Abgesehen von Ausreden verwende ich die Nachrichten-ID aus der Liste der abgerufenen Nachrichten und die Get-API für Nachrichten in der Google Mail-API, um detailliertere Daten wie Betreff und Text zu erhalten. Ich bin. Wir suchen nach einer E-Mail mit dem Betreff "Test-E-Mail", um die Ziel-E-Mail in den erfassten Daten zu finden.

Variablenbeschreibung

--__ Nachricht targetMessage__: Variable zum Speichern der Zielmail

Beschreibung der Verarbeitung

//Holen Sie sich alle Mail-Daten
Message fullMessage = service.users().messages().get(USER, message.getId()).execute();

Derzeit lautet die offizielle Erklärung für get for messages wie folgt Users.messages : get; https://developers.google.com/gmail/api/v1/reference/users/messages/get

Wenn Sie die Benutzer- und Nachrichten-ID in das Argument einfügen und auslösen, werden detailliertere E-Mail-Informationen zurückgegeben.

{
    "historyId": "212543",
    "id": "1635e36ac0cf27ce",
    "internalDate": "1526294031000",
    "labelIds": [
        "IMPORTANT",
        "Label_8",
        "SENT"
    ],
    "payload": {
        "body": {
            "size": 0
        },
        "filename": "",
        "headers": [
            {
                "name": "MIME-Version",
                "value": "1.0"
            },
            {
                "name": "Received",
                "value": "by 10.179.15.206 with HTTP; Mon, 14 May 2018 03:33:51 -0700 (PDT)"
            },
            {
                "name": "Date",
                "value": "Mon, 14 May 2018 19:33:51 +0900"
            },
            {
                "name": "Delivered-To",
                "value": "[email protected]"
            },
            {
                "name": "Message-ID",
                "value": "<CAJsBAS7wAJm+gaUETbUzR1fyshn=zgu4mb5sexdKAv7+jHbmCA@mail.gmail.com>"
            },
            {
                "name": "Subject",
                "value": "Test Email"
            },
            {
                "name": "From",
                "value": "Fuga Hoge <[email protected]>"
            },
            {
                "name": "To",
                "value": "[email protected]"
            },
            {
                "name": "Content-Type",
                "value": "multipart/mixed; boundary=\"0000000000009360f1056c2805b7\""
            }
        ],
        "mimeType": "multipart/mixed",
        "partId": "",
        "parts": [
            {
                "body": {
                    "size": 0
                },
                "filename": "",
                "headers": [
                    {
                        "name": "Content-Type",
                        "value": "multipart/alternative; boundary=\"0000000000009360ec056c2805b5\""
                    }
                ],
                "mimeType": "multipart/alternative",
                "partId": "0",
                "parts": [
                    {
                        "body": {
                            "data": "5pys5paH44G744Gr44KD44KJ44KJDQo=",
                            "size": 23
                        },
                        "filename": "",
                        "headers": [
                            {
                                "name": "Content-Type",
                                "value": "text/plain; charset=\"UTF-8\""
                            },
                            {
                                "name": "Content-Transfer-Encoding",
                                "value": "base64"
                            }
                        ],
                        "mimeType": "text/plain",
                        "partId": "0.0"
                    },
                    {
                        "body": {
                            "data": "PGRpdiBkaXI9Imx0ciI-5pys5paH44G744Gr44KD44KJ44KJPGJyPjwvZGl2Pg0K",
                            "size": 48
                        },
                        "filename": "",
                        "headers": [
                            {
                                "name": "Content-Type",
                                "value": "text/html; charset=\"UTF-8\""
                            },
                            {
                                "name": "Content-Transfer-Encoding",
                                "value": "base64"
                            }
                        ],
                        "mimeType": "text/html",
                        "partId": "0.1"
                    }
                ]
            },
            {
                "body": {
                    "attachmentId": "ANGjdJ_kQ0lQ3VjL86PDW2-qlN7bEQf-PLcRtzgFKvkg49Mi7KGwxlS8G2sn0LcOqdjM3D9CkVyVhmu1xbdDrxJC-GaaU7cBTUr4KUbwtENCONY9p0WW0stx8QuCEF5fnC2ZkKBFjOTxLqH3QJn88RGz-1IaE8l2wdexLgCP7MhYRNVx5Q0UCuvykLJO2WU3_uyJZWyZoVz5SxJz7_kXtLLv7X58p24HE3UU3Bxi3WIp5wpznsg1Z5GOmkYNTe29f7ag52B7L0p5SS_hIeGd73WqkgkH_Hma7Qmn0fPgd6wu_HUT8sqITt96CTfrl0M",
                    "size": 124626
                },
                "filename": "linux.png ",
                "headers": [
                    {
                        "name": "Content-Type",
                        "value": "image/png; name=\"linux.png\""
                    },
                    {
                        "name": "Content-Disposition",
                        "value": "attachment; filename=\"linux.png\""
                    },
                    {
                        "name": "Content-Transfer-Encoding",
                        "value": "base64"
                    },
                    {
                        "name": "X-Attachment-Id",
                        "value": "f_jh6421y31"
                    }
                ],
                "mimeType": "image/png",
                "partId": "1"
            }
        ]
    },
    "sizeEstimate": 171687,
    "snippet": "Körper Honyara",
    "threadId": "1635e36ac0cf27ce"
}

Es ist ziemlich lang so.

//Header anzeigen
for (MessagePartHeader header : fullMessage.getPayload().getHeaders()) {
    //Name ist Betreff in der Kopfzeile(Gegenstand)Rufen Sie die Nachrichten-ID der Nachricht ab, deren Wert "Testmail" ist.
    if (header.getName().equals("Subject") && header.getValue().equals("Test Email")) {
        targetMessage = fullMessage;
    }
}

Es gibt Daten mit dem Schlüssel "Betreff" im Header der erfassten JSON-Nutzdaten, und das ist der Betreff. Ich suche jemanden, dessen Betreff "Test Mail" ist.

Körperdecodierung

Einige der abgerufenen JSONs haben den Schlüssel "Snippet" und einen solchen Wert, "Body Honyara", aber dies ist ein Snippet anstelle des Body und wenn die Liste der E-Mails angezeigt wird Außerdem ist es anders, weil es die Daten desjenigen sind, der den Text ein wenig anzeigt, um den Inhalt zu informieren. Da der Text dieser Test-E-Mail kurz ist, enthält sie den vollständigen Text. Grundsätzlich ist es jedoch besser zu glauben, dass der vollständige Text nicht enthalten ist.

20.png _Dies ist ein Ausschnitt _

Der echte Text befindet sich tiefer in den Payload Parts und ist Base64-codiert. Daher muss er zum Lesen in UTF8 usw. decodiert werden.

//Texterfassung
//Texterfassung(Base64)
String bodyBase64 = targetMessage.getPayload().getParts().get(0).getParts().get(0).getBody().get("data").toString();
//Von Base64 dekodieren(Byte-String)
byte[] bodyBytes = Base64.decodeBase64(bodyBase64);
//Konvertieren Sie die Byte-Zeichenfolge in eine Zeichenfolge
String body = new String(bodyBytes, "UTF-8");

Beschreibung der Verarbeitung

//Texterfassung(Base64)
String bodyBase64 = targetMessage.getPayload().getParts().get(0).getParts().get(0).getBody().get("data").toString();

Wie Sie sehen können, befindet sich der Text in einer unverständlichen tiefen Position. Sehen Sie sich den Roh-JSON oben an, um zu sehen, warum dies passiert ist. Da die Rückgabeklasse der Methode get der Objekttyp ist, konnte ich die Daten mit toString () im erwarteten Format abrufen. Es ist übrigens BASE64-codiert.

//Von Base64 dekodieren(Byte-String)
byte[] bodyBytes = Base64.decodeBase64(bodyBase64);

Vorerst von BASE64 in UTF8-Byte-String konvertieren. Ich möchte, dass du bald ein String wirst.

//Konvertieren Sie die Byte-Zeichenfolge in eine Zeichenfolge
String body = new String(bodyBytes, "UTF-8");

Jetzt ist es endlich ein String. Dies ist der Text.

Laden Sie angehängte Dateien herunter

Laden Sie abschließend die angehängte Datei herunter.

//Erhalten Sie angehängte Dateien
//Nutzlastteil erkunden
for (MessagePart part : targetMessage.getPayload().getParts()) {
    String fileName = part.getFilename();
    //Dateiname ist null oder""Wenn nicht, handelt es sich um eine angehängte Datei. Laden Sie sie herunter.
    if (fileName != null && fileName.length() > 0) {
        //Download-Datei(Base64)
        MessagePartBody attachPart = service.users().messages().attachments()
                .get(USER, targetMessage.getId(), part.getBody().getAttachmentId()).execute();
        //Von Base64 dekodieren
        byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());
        //Im System speichern
        FileOutputStream fileOutFile = new FileOutputStream(fileName);
        fileOutFile.write(fileByteArray);
        fileOutFile.close();
    }
}

Verwenden Sie für Anhänge die Google Mail-API message.attachments.get. Die Erklärung der offiziellen Website lautet vorerst wie folgt. Mit der Anhangs-ID und der Nachrichten-ID können Sie die angehängte Datei in BASE64 codieren lassen.

Users.messages.attachments: get ; https://developers.google.com/gmail/api/v1/reference/users/messages/attachments/get

Beschreibung der Verarbeitung

//Erhalten Sie angehängte Dateien
//Nutzlastteil erkunden
for (MessagePart part : targetMessage.getPayload().getParts()) {
    String fileName = part.getFilename();
    //Dateiname ist null oder""Wenn nicht, handelt es sich um eine angehängte Datei. Laden Sie sie herunter.
    if (fileName != null && fileName.length() > 0) {
        //Kürzung
    }
}

Der Dateiname und die Anhangs-ID werden in den Teilen der Nutzlast gespeichert. Es gibt jedoch auch einen Text usw. in derselben Hierarchie. In diesem Fall sollte der Dateiname "" usw. sein. Vermeiden Sie diese und erhalten Sie die Anhangs-ID.

//Erhalten Sie angehängte Dateien
//Nutzlastteil erkunden
if (fileName != null && fileName.length() > 0) {
    //Download-Datei(Base64)
    MessagePartBody attachPart = service.users().messages().attachments().get(USER, targetMessage.getId(), part.getBody().getAttachmentId()).execute();
    //Von Base64 dekodieren
    byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());
    //Im System speichern
    FileOutputStream fileOutFile = new FileOutputStream(fileName);
    fileOutFile.write(fileByteArray);
    fileOutFile.close();
}

Nachdem Sie die Anhangs-ID haben, können Sie die Anhänge mithilfe von message.attachments.get in der Google Mail-API abrufen. Da die erfasste angehängte Datei BASE64-codiert ist, wird sie in eine Byte-Zeichenfolge decodiert. Speichern Sie dann die zuletzt decodierte Byte-Zeichenfolge in einer Datei. Wenn Sie es ausführen, sollte die angehängte Datei wie unten gezeigt direkt unter dem Projekt heruntergeladen werden. 21.png

schließlich

Wenn Sie den gesamten hier geschriebenen Code verbinden, sieht es wie folgt aus.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
import com.google.api.services.gmail.model.MessagePart;
import com.google.api.services.gmail.model.MessagePartBody;
import com.google.api.services.gmail.model.MessagePartHeader;

public class Test {
    public static void main(String[] args) throws IOException, GeneralSecurityException {
        //Json-Verarbeitung
        JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
        //Umfang
        List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
        //Privat Schlüssel
        String CLIENT_SECRET_DIR = "client_secret.json";
        //Speicherordner für Konfigurationsdateien rund um die Authentifizierung
        String CREDENTIALS_FOLDER = "credentials";
        //HTTP-Kommunikation
        NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        //Authentifizierung
        //Den privaten Schlüssel lesen
        FileInputStream in = new FileInputStream(new File(CLIENT_SECRET_DIR));
        InputStreamReader reader = new InputStreamReader(in);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, reader);
        //Authentifizierungseinstellungen
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
                clientSecrets, SCOPES)
                        .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER)))
                        .setAccessType("offline").build();
        //Authentifizieren
        Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

        //Erstellen Sie einen Google Mail-Dienst
        //Anwendungsname
        String APPLICATION_NAME = "Test1";
        //Greifen Sie auf Google Mail zu
        Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME)
                .build();

        //Post bekommen
        //Nutzer
        String USER = "me";
        //Erhalten Sie alle E-Mails(Es ist nur die E-Mail-ID enthalten)
        ListMessagesResponse messagesResponse = service.users().messages().list(USER).execute();
        List<Message> messageList = messagesResponse.getMessages();

        //Durchsuchen Sie alle E-Mail-Daten, um die Ziel-E-Mail zu finden
        Message targetMessage = null;
        for (Message message : messageList) {
            //Holen Sie sich alle Mail-Daten
            Message fullMessage = service.users().messages().get(USER, message.getId()).execute();
            //Header anzeigen
            for (MessagePartHeader header : fullMessage.getPayload().getHeaders()) {
                //Name ist Betreff in der Kopfzeile(Gegenstand)Rufen Sie die Mail-ID der Nachricht ab, deren Wert "Testmail" ist.
                if (header.getName().equals("Subject") && header.getValue().equals("Test Email")) {
                    targetMessage = fullMessage;
                }
            }
        }

        //Texterfassung
        //Texterfassung(Base64)
        String bodyBase64 = targetMessage.getPayload().getParts().get(0).getParts().get(0).getBody().get("data").toString();
        //Von Base64 dekodieren(Byte-String)
        byte[] bodyBytes = Base64.decodeBase64(bodyBase64);
        //Konvertieren Sie die Byte-Zeichenfolge in eine Zeichenfolge
        String body = new String(bodyBytes, "UTF-8");
        //Standardausgabe von Text
        System.out.println(body);

        //Erhalten Sie angehängte Dateien
        //Nutzlastteil erkunden
        for (MessagePart part : targetMessage.getPayload().getParts()) {
            String fileName = part.getFilename();
            //Dateiname ist null oder""Wenn nicht, handelt es sich um eine angehängte Datei. Laden Sie sie herunter.
            if (fileName != null && fileName.length() > 0) {
                //Download-Datei(Base64)
                MessagePartBody attachPart = service.users().messages().attachments()
                        .get(USER, targetMessage.getId(), part.getBody().getAttachmentId()).execute();
                //Von Base64 dekodieren
                byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());
                //Im System speichern
                FileOutputStream fileOutFile = new FileOutputStream(fileName);
                fileOutFile.write(fileByteArray);
                fileOutFile.close();
            }
        }
    }
}

Auf diese Weise können Sie Google Mail-E-Mails automatisch abrufen und möglicherweise die damit verbundenen Aufgaben automatisieren. Die hier sorgfältig erläuterte Google Mail-API enthält auch die folgende URL. Obwohl die offizielle Sprache Amerikanisch ist, wird die Verwendung erläutert. Wenn Sie sie also lesen, können Sie alles tun.

API Reference ; https://developers.google.com/gmail/api/v1/reference/

Als persönlicher Eindruck bei der Verwendung der Google Mail-API war es schwierig, nach Nutzdaten und Teilen zu suchen, wenn Betreff und Text abgerufen wurden. Daher gab die Nachrichtenklasse ihr Bestes und verfügte über viele Felder. Ich bin froh, wenn Sie automatisch beitreten können.

Recommended Posts

Erhalten Sie E-Mails mithilfe der Google Mail-API in Java
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
Erstellen Sie Google Mail in Python ohne Verwendung der API
Abrufen von Amazon-Daten mit Keep API # 1 Abrufen von Daten
Ich habe versucht, die Docomo-Spracherkennungs-API und die Google Speech-API in Java zu verwenden
Mausbedienung mit Windows-API in Python
Versuchen Sie es mit der Wunderlist-API in Python
Holen Sie sich Suica Balance in Python (mit libpafe)
Tweet mit der Twitter-API in Python
Holen Sie sich Google Fit API-Daten in Python
Golang api bekommen
E-Mail-Anhänge über Ihr Google Mail-Konto mit Python.
[Python] Holen Sie sich alle Kommentare mit Youtube Data Api
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Abrufen der Google Cloud Storage-Objektliste in Java
Aufruf der CloudWatch-API (mit dem Blackbird AWS-Plugin)
Lassen Sie uns Emotionen mithilfe der Emotions-API in Python beurteilen
So erhalten Sie Artikeldaten mithilfe der Qiita-API
Holen Sie sich den Betreff und den Text von Google Mail mit der Python- und Google Mail-API
So senden Sie automatisch E-Mails mit Anhängen mithilfe der Google Mail-API in Python
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
[Rails] So erhalten Sie Standortinformationen mithilfe der Geolocation-API
Abrufen des Dateinamens in einem Ordner mithilfe von glob
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
Grundeinstellungen bei Verwendung der foursquare-API mit Python
[Python] Abrufen von Insight-Daten mithilfe der Google My Business-API
Senden und empfangen Sie Google Mail über die Google Mail-API mit Python
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
OpenVINO verwendet die Inference Engine Python API in einer PC-Umgebung
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Verwenden Sie die Such-API der National Parliament Library in Python
Erhalten Sie Tweets mit beliebigen Schlüsselwörtern mithilfe der Streaming-API von Twitter
Fassadenmuster in Java
Fliegengewichtsmuster in Java
Beobachtermuster in Java
Linux-Berechtigungen für Java
Verwenden Sie DataFrame in Java
Iteratormuster in Java
Evernote-API in Python
Dekorationsmuster in Java
Holen Sie sich Datum in Python
Entwurf von Google Mail in Python
C-API in Python 3
Prototypmuster in Java
Senden Sie Google Mail in Python
Proxy-Muster in Java
Holen Sie sich Ihre Herzfrequenz von der Fitbit-API in Python!
Holen Sie sich YouTube Live-Chat-Felder in Echtzeit mit API
Prognostizieren Sie das Geschlecht anhand des Namens mithilfe der Gender-API und von Pykakasi in Python
Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders
Holen Sie sich den Produktnamen und den niedrigsten Preis mit der Amazon Product Advertising API
Holen Sie sich das Wetter mit API und lassen Sie Raspberry Pi sprechen!
Rufen Sie github api in Python auf, um Informationen zur Pull-Anforderung zu erhalten