如何在 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 中获取完整的邮件正文?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gmail API 获取邮件正文

如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件

Python 和 imaplib:无需下载完整电子邮件即可获取附件名称或正文

使用 Go 从 Gmail API 解码消息正文

无法使用 Gmail PHP API 获取电子邮件正文

在调用gmail api发送带附件的电子邮件(multipart)时,请求的正文如何?