如何从Gmail获取多个附件并将其保存到该文件夹​​?

时间:2015-01-06 12:29:19

标签: c# gmail-api

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

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

用上面的代码改变我的代码之后,一切都像魅力一样。

1 个答案:

答案 0 :(得分:0)

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

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