【问题标题】:GMAIL API .NET Invalid Attachment TokenGMAIL API .NET 附件令牌无效
【发布时间】:2017-08-27 11:51:12
【问题描述】:

我只是想使用 ASP.NET MVC 以编程方式从我的最后一封电子邮件中下载附件。

据我在这里可以找到,我需要从 google 获得的唯一权限是“https://www.googleapis.com/auth/gmail.readonly”,它授予我“读取所有资源及其元数据 - 无写入操作”。资源: (https://developers.google.com/gmail/api/auth/scopes)

问题是当我尝试访问附件时出现错误:

$exception  
{"Google.Apis.Requests.RequestError
Invalid attachment token [400]
Errors 
[Message[Invalid attachment token] 
Location[ - ] Reason[invalidArgument] 
Domain[global]\r\n]\r\n"}

到目前为止,这是我的代码示例:

  static string[] Scopes = { GmailService.Scope.GmailReadonly };

   public ActionResult Login()
    {
        UserCredential credential;
        var diskPath = Server.MapPath("~");

        using (var stream = new FileStream(diskPath + "/Content/client_secret.json", FileMode.Open, FileAccess.Read))
        {
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None).Result;
        }

        // Create Gmail API service.
        var service = new GmailService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = ApplicationName,
        });

        var resp = service.HttpClient.GetStringAsync("https://www.googleapis.com/gmail/v1/users/me/messages?q=\"has:attachment\"").Result;
        var root = JsonConvert.DeserializeObject<ListMessagesResponse>(resp);
        foreach (var msg in root.Messages)
            GetAttachments(service, msg.Id);

        return View();
    }

    public static void GetAttachments(GmailService service, String messageId)
    {
        var message = service.Users.Messages.Get("me", messageId).Execute();
        var parts = message.Payload.Parts;
        foreach (var part in parts)
        {
            if (!String.IsNullOrEmpty(part.Filename))
            {
                var attachPart = service.Users.Messages.Attachments.Get("me", messageId, part.PartId).Execute();
                var file = Convert.FromBase64String(attachPart.Data);
                System.IO.File.WriteAllBytes(part.Filename, file);
            }
        }
    }

当我通过时收到此错误:

  var attachPart = service.Users.Messages.Attachments.Get("me", messageId, part.PartId).Execute();

我必须为附件添加其他范围吗?或者我是否必须在某些操作后刷新令牌?我已经尝试在我的 Google+ 个人资料中删除并重新添加该应用!

【问题讨论】:

    标签: asp.net gmail access-token gmail-api


    【解决方案1】:

    [我的错误]

    代替:

     var attachPart = service.Users.Messages.Attachments.Get("me", messageId, part.PartId).Execute();
    

    我必须像这样使用附件 ID:

     var attachPart = service.Users.Messages.Attachments.Get("me", messageId, part.Body.AttachmentId).Execute();
    

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2011-11-27
      • 2016-11-29
      • 2020-05-08
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多