Python 使用Gmail API检索html格式的电子邮件/消息正文
有没有办法使用GMail api以html形式检索消息正文 我已经看过这些文件了。尝试将Python 使用Gmail API检索html格式的电子邮件/消息正文,python,gmail-api,Python,Gmail Api,有没有办法使用GMail api以html形式检索消息正文 我已经看过这些文件了。尝试将格式参数更改为完整,最小&原始。但这没有帮助。它返回邮件正文的纯文本 格式值说明: “完整”:返回有效负载字段中已解析的电子邮件内容,未使用原始字段。(默认) “最小”:仅返回电子邮件消息元数据,如标识符和标签,不返回电子邮件标题、正文或有效负载 “raw”:以字符串形式返回raw字段中的整个电子邮件内容,不使用有效负载字段。这包括标识符、标签、元数据、MIME结构和小型主体部分(通常小于2KB) 我们不
格式
参数更改为完整
,最小
&原始
。但这没有帮助。它返回邮件正文的纯文本
格式值说明: “完整”:返回有效负载字段中已解析的电子邮件内容,未使用原始字段。(默认) “最小”:仅返回电子邮件消息元数据,如标识符和标签,不返回电子邮件标题、正文或有效负载 “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都会根据您的喜好返回任何文本/html部分。如果使用FULL,您将得到一个解析的表示,它将是嵌套的json字典,您必须遍历这些字典来查找文本/html部分。如果您选择原始格式,您将在Message.RAW字段中获得RFC822格式的整个电子邮件。您可以用所选语言将其传递给mime库,然后使用它查找您感兴趣的部分。Mime是复杂的,您可能会有一个顶级的“multipart”类型,其中text/html是它的直接子元素之一,但不能保证,它是一个任意深的树结构!) 以下是完整的教程: 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;
}
我希望这有帮助:-)是的。这里提供了html格式的电子邮件正文。我用过的图书馆就是这个。这是可行的,但我只是想知道GMail API是否提供了这个功能。在python中,我得到的是
msg\u str=base64.urlsafe\u b64解码(message['raw'].encode('ASCII'))
mime\u msg=email.message\u from\u string(msg\u str)
。在html中呈现返回的消息mime_msg string时,它显示纯文本。它甚至没有格式化。你能帮个忙吗?@Kartik我试过你的,但没用..我可以打印邮件['snippet',],但仍然无法获取邮件正文
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;
}
}
Document jsoup = Jsoup.parse(body);
Elements tds = jsoup.getElementsByTag("td");
Elements ps = tds.get(0).getElementsByTag("p");