如何在 Gmail 中获取完整的邮件正文?
Posted
技术标签:
【中文标题】如何在 Gmail 中获取完整的邮件正文?【英文标题】:How to get full message body in Gmail? 【发布时间】:2015-03-17 13:05:13 【问题描述】:我想获得完整的消息正文。所以我尝试:
Message gmailMessage = service.users().messages().get("me", messageId).setFormat("full").execute();
为了得到身体,我尝试:
gmailMessage.getPayload().getBody().getData()
但结果总是null
。如何获取完整的邮件正文?
【问题讨论】:
删除setFormat? 这个特定版本不起作用的原因是原始字段故意为空。如果您在此处查看 api 文档。 developers.google.com/gmail/api/v1/reference/users/messages/get。 “完整”格式不使用原始字段。 【参考方案1】:要从您的 gmailMessage 中获取数据,您可以使用 gmailMessage.payload.parts[0].body.data。如果要将其解码为可读文本,可以执行以下操作:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(gmailMessage.payload.parts[0].body.data)));
【讨论】:
@Yster 没问题 :) 可能值得一读 this answer 以了解这个问题可能比看起来更棘手。 答案在这里developers.google.com/gmail/api/v1/reference/users/messages/get(“格式”字段)【参考方案2】:我尝试过这种方式,因为 message.getPayload().getBody().getParts() 始终为空
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
(...)
Message message = service.users().messages().get(user, m.getId()).execute();
MessagePart part = message.getPayload();
System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(part.getBody().getData())));
结果是纯 html 字符串
【讨论】:
【参考方案3】:我发现了更有趣的方式来解决完整的正文消息(而不仅仅是正文):
System.out.println(StringUtils.newStringUtf8( Base64.decodeBase64 (message.getRaw())));
【讨论】:
【参考方案4】:这里是使用 c# 代码 gmail API v1 读取电子邮件正文内容的解决方案:
var request = _gmailService.Users.Messages.Get("me", mail.Id);
request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Full;
并解决数据错误
var res = message.Payload.Body.Data.Replace("-", "+").Replace("_", "/");
byte[] bodyBytes = Convert.FromBase64String(res);
string val = Encoding.UTF8.GetString(bodyBytes);
【讨论】:
如果我有一百万个朋友,我会贿赂他们所有人加入 SO 只是为了支持这个答案!我在解码这些东西上浪费了好几个小时,而你的Replace
加法一举解决了这一切。 תודה רבה【参考方案5】:
如果您有消息(com.google.api.services.gmail.model.Message),您可以使用以下方法:
public String getContent(Message message)
StringBuilder stringBuilder = new StringBuilder();
try
getPlainTextFromMessageParts(message.getPayload().getParts(), stringBuilder);
byte[] bodyBytes = Base64.decodeBase64(stringBuilder.toString());
String text = new String(bodyBytes, StandardCharsets.UTF_8);
return text;
catch (UnsupportedEncodingException e)
logger.error("UnsupportedEncoding: " + e.toString());
return message.getSnippet();
private void getPlainTextFromMessageParts(List<MessagePart> messageParts, StringBuilder stringBuilder)
for (MessagePart messagePart : messageParts)
if (messagePart.getMimeType().equals("text/plain"))
stringBuilder.append(messagePart.getBody().getData());
if (messagePart.getParts() != null)
getPlainTextFromMessageParts(messagePart.getParts(), stringBuilder);
它将所有消息部分与 mimeType "text/plain" 组合在一起,并将其作为一个字符串返回。
【讨论】:
【参考方案6】:当我们收到完整消息时。消息正文在 Parts 内。
这是一个示例,其中显示邮件标题(日期、发件人、收件人和主题)并显示纯文本形式的邮件正文。 Payload 中的部件返回两种类型的消息(纯文本和格式化文本)。我对纯文本感兴趣。
Message msg = service.users().messages().get(user, message.getId()).setFormat("full").execute();
// Displaying Message Header Information
for (MessagePartHeader header : msg.getPayload().getHeaders())
if (header.getName().contains("Date") || header.getName().contains("From") || header.getName().contains("To")
|| header.getName().contains("Subject"))
System.out.println(header.getName() + ":" + header.getValue());
// Displaying Message Body as a Plain Text
for (MessagePart msgPart : msg.getPayload().getParts())
if (msgPart.getMimeType().contains("text/plain"))
System.out.println(new String(Base64.decodeBase64(msgPart.getBody().getData())));
【讨论】:
【参考方案7】:基于@Tholle 的评论,我做了类似的事情
Message message = service.users().messages()
.get(user, messageHolder.getId()).execute();
System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(
message.getPayload().getParts().get(0).getBody().getData())));
【讨论】:
【参考方案8】:有一个解码body的方法:
final String body = new String(message.getPayload().getParts().get(0).getBody().decodeData());
【讨论】:
以上是关于如何在 Gmail 中获取完整的邮件正文?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件