GMAIL API .NET 无效的附件令牌
GMAIL API .NET Invalid Attachment Token
我只是想使用 ASP.NET MVC 以编程方式从我最近的电子邮件中下载附件。
据我所知,我需要 google 的唯一许可是授予我 "Read all resources and their metadata—no write operations." 的“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+ 个人资料中删除并再次添加该应用程序!
[我的错误]
而不是:
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();
我只是想使用 ASP.NET MVC 以编程方式从我最近的电子邮件中下载附件。
据我所知,我需要 google 的唯一许可是授予我 "Read all resources and their metadata—no write operations." 的“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+ 个人资料中删除并再次添加该应用程序!
[我的错误]
而不是:
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();