Google API - Gmail。下载附件

时间:2018-03-26 13:27:52

标签: c# google-api google-apis-explorer

调用此方法时,请告知GmailService会传递哪些值?我猜是userID是Gmail帐户和messageID(我想下载所有这些)。

如何更改此选项以下载收件箱中的所有附件。

提前感谢您,我希望有人可以帮助我。

使用方法如下。

public static void GetAttachments(GmailService service, String userId, String messageId, String outputDir)
{
  try
  {
    Message message = service.Users.Messages.Get(userId, messageId).Execute();
    IList<MessagePart> parts = message.Payload.Parts;
    foreach (MessagePart part in parts)
    {
      if (!String.IsNullOrEmpty(part.Filename))
      {
        String attId = part.Body.AttachmentId;
        MessagePartBody attachPart = service.Users.Messages.Attachments.Get(userId, messageId, attId).Execute();

        // Converting from RFC 4648 base64 to base64url encoding
        // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history
        String attachData = attachPart.Data.Replace('-', '+');
        attachData = attachData.Replace('_', '/');

        byte[] data = Convert.FromBase64String(attachData);
        File.WriteAllBytes(Path.Combine(outputDir, part.Filename), data);                        
       }
     }
   }
   catch (Exception e)
   {
     Console.WriteLine("An error occurred: " + e.Message);
   }
 }

3 个答案:

答案 0 :(得分:1)

我知道,这可能是一个题外话,但是如果程序员使用Google API很少但适得其反,请使用PostMan :) API也具有附件。Get方法,您将不需要调用HTTP请求并允许非OAuth 2.0身份验证,尤其是在使用多阶段身份验证时。

这里是示例: https://developers.google.com/gmail/api/v1/reference/users/messages/attachments/get

答案 1 :(得分:0)

我认为可以使用Get in PostMan解决该问题的答案

  

在PostMan的标头中,将密钥用作“授权”,并将生成的令牌作为值传递给它   或转到授权并选择承载令牌并传递您的令牌。    请注意,messageId是您尝试获取的邮件的字符串ID,并且{userId} = me或根据Google的用户,我相信您可以通过上面使用的方法获取附件ID。

     

https://www.googleapis.com/gmail/v1/users/me/messages/messageId/attachments/id

 public async Task<TResult> GetGmailInboxAttachmentById<TResult>(string messageId, string token, string id, string attachId)
    {
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            var url = "https://www.googleapis.com/gmail/v1/users/me/messages/" + messageId + "/" + id + "/attachments" + "/" + attachId;
            HttpResponseMessage response = await httpClient.GetAsync(url);


            return await response.Content.ReadAsAsync<TResult>();

        }
    }

foreach (var part in inbox.Payload.Parts)
                {
                    if (!String.IsNullOrEmpty(part.Filename))
                    {
                        var attachId = part.Body.AttachmentId;
                        var attach = _gmailService.GetGmailInboxAttachmentById<MessagePartBody>(id, token, part.PartId, attachId).Result;
                        // Converting from RFC 4648 base64 to base64url encoding
                        // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history
                        string attachData = attach.Data.Replace('_', '+');
                        attachData = attachData.Replace('_', '/');
                        byte[] data = Convert.FromBase64String(attachData);
                        string file = Convert.ToBase64String(data);
                        GetAttach.Add(file);



                    }
                }

希望这可以为您解决它,因为我已经用这种方法解决了

答案 2 :(得分:0)

foreach (var part in m.Payload.Parts)
{
    if (!string.IsNullOrEmpty(part.Filename))
    {
        var attachId = part.Body.AttachmentId;
        MessagePartBody attachPart = service.Users.Messages.Attachments.Get(userId,
                                                                            message.Id,
                                                                            attachId).Execute();
        byte[] data = GetBytesFromPart(attachPart.Data);
        File.WriteAllBytes(Path.Combine(@"c:\teste\", 
                                        $"{DateTime.Now:yyyyMMddHHmmss}-{part.Filename}"), data);
    }
}

private static string DecodedString(string messagePart)
{
    try
    {
        var data = GetBytesFromPart(messagePart);
        string decodedString = Encoding.UTF8.GetString(data);
        return decodedString;
    }
    catch (System.Exception e)
    {
        // ignored
        return string.Empty;
    }
}

private static byte[] GetBytesFromPart(string messagePart)
{
    var attachData = messagePart.Replace('-', '+');
    attachData = attachData.Replace('_', '/');
    byte[] data = Convert.FromBase64String(attachData);
    return data;
}