【问题标题】:Gmail API .NET: Get full messageGmail API .NET:获取完整消息
【发布时间】:2018-01-17 12:53:14
【问题描述】:

如何使用 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/

我如何获得完整的消息?

【问题讨论】:

    标签: gmail-api service-accounts getmessage


    【解决方案1】:

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

    【讨论】:

    • 是的 - 好奇..我曾认为最宽松的范围会覆盖较小的范围,但事实并非如此。
    【解决方案2】:

    SO post 的用户也有同样的错误。

    先试试这个。

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

    您也可以查看this 以获取更多参考。

    【讨论】:

    • 我删除了应用程序(Google API 浏览器)并再次尝试,但同样的错误。第 4 点是什么意思(下一次,只需请求您需要的权限)?我应该编辑我的范围吗?我能够执行请求,因此无法访问 gmailMessage.payload.parts[0].body.data
    【解决方案3】:

    试试这样的

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

    【讨论】:

    • 我收到错误“元数据范围不允许格式 FULL”。 Full 是默认格式,所以当我不指定格式时,我会收到此错误。
    猜你喜欢
    • 2019-03-16
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2016-09-21
    • 2015-02-26
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多