如何从Gmail获取多个附件并将它们保存到文件夹中

本文关键字:保存 文件夹 Gmail 获取 | 更新日期: 2023-09-27 18:36:29

我正在尝试从邮件中获取附件并将它们保存到我选择的文件夹中。当邮件包含单个附件时,无论文件类型如何,这都会完美地保存到我的文件夹中,但如果邮件包含多个附件,则只有第一个附件保存到文件夹中。请检查我的代码以了解我在说什么。

#region Get External Attachments
requestMessage = service.Users.Messages.Get("me", messageId);
Message attMessage = requestMessage.Execute();
IList<MessagePart> parts = attMessage.Payload.Parts;
foreach (MessagePart p in parts)
{
    if (p.Filename.Length > 0 && p.Filename != null)
    {
        string attid = p.Body.AttachmentId;
        if (attid != null)
        {
            MessagePartBody attachPart = service.Users.Messages.Attachments.Get("me", messageId, attid).Execute();
           byte[] data = FromBase64ForUrlString(attachPart.Data);
           string decodedString = Convert.ToBase64String(data);
           var dir = @"G:'" + messageId;
           Console.WriteLine("FileName:"+" "+p.Filename);
           // Console.WriteLine("MimeType:"+p.MimeType+"  "+p.Filename);
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
                File.WriteAllBytes(Path.Combine(dir, p.Filename), data);
            }
        }
    }
}
#endregion

我已经用带有三个附件(jpg、excel 文件和 pdf)的邮件测试了上面的代码,这里 jpg 是第一个附件,它是唯一保存在文件夹中的附件。我想将所有附件文件保存到文件夹中。

Console.WriteLine("FileName:"+" "+p.Filename);

上面的行返回所有附件的名称,但我的代码没有保存它们。我哪里做错了?

更新:

 if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                       // File.WriteAllBytes(Path.Combine(dir, p.Filename), data);
                    }
                    File.WriteAllBytes(Path.Combine(dir, p.Filename), data);

用上面的行更改我的代码后,一切都像魅力一样工作。

如何从Gmail获取多个附件并将它们保存到文件夹中

//上面解决方案中缺少的函数

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