0

如何使用 gmail api 获取完整消息而不仅仅是元数据?

我有一个服务帐户,我能够检索消息,但只能以元数据、原始格式和最小格式检索。如何检索完整格式的完整消息?以下代码工作正常

var request = service.Users.Messages.Get(userId, messageId);
request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Metadata;
Message message = request.Execute();

但是,当我省略格式时(因此我使用的是 FULL 的默认格式)或者我将格式更改为UsersResource.MessagesResource.GetRequest.FormatEnum.Full 我收到错误:Metadata scope doesn't allow format FULL

我已包括以下范围:

https://www.googleapis.com/auth/gmail.readonly, 
https://www.googleapis.com/auth/gmail.metadata,
https://www.googleapis.com/auth/gmail.modify,
https://mail.google.com/

我如何获得完整的消息?

4

3 回答 3

3

我必须删除元数据的范围才能获得完整的消息格式。

于 2017-08-22T13:19:52.700 回答
1

SO帖子中的用户有同样的错误。

先试试这个。

  1. 转到https://security.google.com/settings/security/permissions
  2. 选择您正在使用的应用程序。
  3. 单击删除 > 确定
  4. 下一次,只需准确请求您需要的权限。

另一件事,尝试使用gmailMessage.payload.parts[0].body.data并将其解码为可读文本,从SO post执行以下操作:

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)));

您也可以查看此内容以供进一步参考。

于 2017-08-10T09:27:09.670 回答
0

尝试这样的事情

    public String getMessage(string user_id, string message_id)
    {
         Message temp =service.Users.Messages.Get(user_id,message_id).Execute();
         var parts = temp.Payload.Parts;
         string s = "";
         foreach (var part in parts) {
                byte[] data = FromBase64ForUrlString(part.Body.Data);
                s += Encoding.UTF8.GetString(data);
         }
        return s
       }

    public static byte[] FromBase64ForUrlString(string base64ForUrlInput)
        {
            int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
            StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
            result.Append(String.Empty.PadRight(padChars, '='));
            result.Replace('-', '+');
            result.Replace('_', '/');
            return Convert.FromBase64String(result.ToString());
        }
于 2017-08-14T19:01:16.227 回答