GMail APIを使用してHTML形式でメッセージ本文を取得する方法はありますか?
私はすでに message.get
ドキュメント。 format
パラメータをfull
、minimal
&raw
に変更してみました。しかし、それは助けにはなりませんでした。メール本文のプレーンテキストを返しています。
フォーマット値の説明:
"full":解析された電子メールメッセージのコンテンツをペイロードフィールドに返し、生のフィールドは使用されません。 (デフォルト)
「最小」:識別子やラベルなどのメールメッセージメタデータのみを返します。メールのヘッダー、本文、ペイロードは返しません。
"raw":rawフィールドのメールメッセージコンテンツ全体を文字列として返し、ペイロードフィールドは使用されません。これには、識別子、ラベル、メタデータ、MIME構造、および小さなボディパーツ(通常は2KB未満)が含まれます。
メッセージの本文をhtml形式で取得することはできませんか?または、これを行う方法が他にあります。これにより、メールが画面に表示され、アプリまたはGMailで表示されるときの違いが最小限に抑えられますか?
HTMLとプレーンテキストの両方のコンテンツを持つ電子メールメッセージには複数のペイロードパーツがあり、mimeTypeが "text/html"のパーツにはHTMLコンテンツが含まれます。あなたはそれを次のようなロジックで見つけることができます:
var part = message.parts.filter(function(part) {
return part.mimeType == 'text/html';
});
var html = urlSafeBase64Decode(part.body.data);
FULLとRAWはどちらも、希望に応じてtext/html部分を返します。 FULLを使用すると、解析された表現が得られます。これはネストされたjson辞書であり、text/html部分を探すためにウォークスルーする必要があります。 RAW形式を選択した場合は、Message.rawフィールドに電子メール全体がRFC822形式で届きます。これを選択した言語のMIMEライブラリに渡し、それを使用して興味のある部分を見つけることができます。MIMEは複雑です。それの直接の子ですが、保証はありません。それは任意の深いツリー構造です! :)
ここに完全なチュートリアルがあります:
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");
これがお役に立てば幸いです:-)