web-dev-qa-db-ja.com

Gmail APIを使用してHTMLでメール/メッセージ本文を取得する

GMail APIを使用してHTML形式でメッセージ本文を取得する方法はありますか?

私はすでに message.get ドキュメント。 formatパラメータをfullminimalrawに変更してみました。しかし、それは助けにはなりませんでした。メール本文のプレーンテキストを返しています。


フォーマット値の説明:

"full":解析された電子メールメッセージのコンテンツをペイロードフィールドに返し、生のフィールドは使用されません。 (デフォルト)

「最小」:識別子やラベルなどのメールメッセージメタデータのみを返します。メールのヘッダー、本文、ペイロードは返しません。

"raw":rawフィールドのメールメッセージコンテンツ全体を文字列として返し、ペイロードフィールドは使用されません。これには、識別子、ラベル、メタデータ、MIME構造、および小さなボディパーツ(通常は2KB未満)が含まれます。


メッセージの本文をhtml形式で取得することはできませんか?または、これを行う方法が他にあります。これにより、メールが画面に表示され、アプリまたはGMailで表示されるときの違いが最小限に抑えられますか?

18
Kartik Domadiya

HTMLとプレーンテキストの両方のコンテンツを持つ電子メールメッセージには複数のペイロードパーツがあり、mimeTypeが "text/html"のパーツにはHTMLコンテンツが含まれます。あなたはそれを次のようなロジックで見つけることができます:

var part = message.parts.filter(function(part) {
  return part.mimeType == 'text/html';
});
var html = urlSafeBase64Decode(part.body.data);
20
Eric Koleda

FULLとRAWはどちらも、希望に応じてtext/html部分を返します。 FULLを使用すると、解析された表現が得られます。これはネストされたjson辞書であり、text/html部分を探すためにウォークスルーする必要があります。 RAW形式を選択した場合は、Message.rawフィールドに電子メール全体がRFC822形式で届きます。これを選択した言語のMIMEライブラリに渡し、それを使用して興味のある部分を見つけることができます。MIMEは複雑です。それの直接の子ですが、保証はありません。それは任意の深いツリー構造です! :)

6
Eric D

ここに完全なチュートリアルがあります:

1-すでにすべての資格情報の作成を完了していると仮定 ここ

2-これは、MIMEメッセージを取得する方法です。

 public static String getMimeMessage(String messageId)
            throws Exception {

           //getService definition in -3
        Message message = getService().users().messages().get("me", messageId).setFormat("raw").execute();

        Base64 base64Url = new Base64(true);
        byte[] emailBytes = base64Url.decodeBase64(message.getRaw());

        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        MimeMessage email = new MimeMessage(session, new ByteArrayInputStream(emailBytes));

        return getText(email); //getText definition in at -4
    }

3-これはGmailインスタンスを作成する部分です:

private static Gmail getService() throws Exception {
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    // Load client secrets.
    InputStream in = SCFManager.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
    if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
    }
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new Java.io.File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline")
            .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");

    return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
}

4-そして、これはMIMEメッセージを解析するためのSECRET SAUCEです。

 public static String getText(Part p) throws
            MessagingException, IOException {
        if (p.isMimeType("text/*")) {
            String s = (String) p.getContent(); 
            return s;
        }

        if (p.isMimeType("multipart/alternative")) {
            // prefer html text over plain text
            Multipart mp = (Multipart) p.getContent();
            String text = null;
            for (int i = 0; i < mp.getCount(); i++) {
                Part bp = mp.getBodyPart(i);
                if (bp.isMimeType("text/plain")) {
                    if (text == null) {
                        text = getText(bp);
                    }
                    continue;
                } else if (bp.isMimeType("text/html")) {
                    String s = getText(bp);
                    if (s != null) {
                        return s;
                    }
                } else {
                    return getText(bp);
                }
            }
            return text;
        } else if (p.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) p.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                String s = getText(mp.getBodyPart(i));
                if (s != null) {
                    return s;
                }
            }
        }

        return null;
    }

5-メールIDを取得する方法がわからない場合は、次のようにリストします。

 public static List<String> listTodayMessageIds() throws Exception {
        ListMessagesResponse response = getService()
                .users()
                .messages()
                .list("me") 
                .execute();  

        if (response != null && response.getMessages() != null && !response.getMessages().isEmpty()) {
            return response.getMessages().stream().map(Message::getId).collect(Collectors.toList());
        } else {
            return null;
        }
    }

注意:

この後、「Javaスクリプトのようなもの」」でそのHTML本文をクエリする場合は、jsoupライブラリを探索することをお勧めします。非常に直感的で簡単に操作できます。

Document jsoup = Jsoup.parse(body);

Elements tds = jsoup.getElementsByTag("td");
Elements ps = tds.get(0).getElementsByTag("p");

これがお役に立てば幸いです:-)

2