Получить тело электронной почты/сообщения в html с помощью API Gmail
Есть ли способ получить тело сообщения в виде HTML, используя GMail API?
Я уже прошел через message.get
docs. Попытался изменить format
параметра на full
, minimal
и raw
. Но это не помогло. Это возвращение простого текста почтового тела.
Описание значений формата:
"full": возвращает проанализированное содержимое сообщения электронной почты в поле полезной нагрузки, а поле raw не используется. (дефолт)
"минимальный": возвращает только метаданные сообщения электронной почты, такие как идентификаторы и метки, но не возвращает заголовки, текст или полезную нагрузку.
"raw": возвращает все содержимое сообщения электронной почты в необработанном поле в виде строки, и поле полезной нагрузки не используется. Это включает в себя идентификаторы, метки, метаданные, структуру MIME и небольшие части тела (обычно менее 2 КБ).
Разве мы не можем просто получить тело сообщения в виде html или есть какой-то другой способ сделать это так, чтобы почта отображалась на экране с минимальной разницей, когда она видна в моем приложении или GMail?
Ответы
Ответ 1
Сообщения электронной почты, в которых есть как HTML, так и текстовый контент, будут содержать несколько частей полезной нагрузки, а часть с текстом mimeType "text/html" будет содержать содержимое HTML. Вы можете найти его с логикой, например:
var part = message.parts.filter(function(part) {
return part.mimeType == 'text/html';
});
var html = urlSafeBase64Decode(part.body.data);
Ответ 2
Оба FULL и RAW возвратят вам любые части текста /html в зависимости от того, как вам это нравится. Если вы используете FULL, вы получите разобранное представление, которое будет вложенными словарями json, которые вам придется пройти по поиску части text/html. Если вы выберете формат RAW, вы получите всю электронную почту в формате RFC822 в поле Message.raw. Вы можете передать это в библиотеки mime на выбранном вами языке, а затем использовать это, чтобы найти интересующую вас часть. Mime сложный, у вас, вероятно, будет тип "multipart" верхнего уровня с текстом /html как один из прямыми детьми, но никаких гарантий, это произвольно глубокая древовидная структура!:)
Ответ 3
Вот полный учебник:
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:
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- Если вам было интересно, как получить идентификатор электронной почты, вот как вы их перечислите:
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;
}
}
Примечание:
Если после этого вы захотите запросить это html-тело "в стиле Java Script", я рекомендую вам изучить библиотеку jsoup… очень интуитивно понятную и с которой легко работать:
Document jsoup = Jsoup.parse(body);
Elements tds = jsoup.getElementsByTag("td");
Elements ps = tds.get(0).getElementsByTag("p");
Надеюсь, это поможет :-)