【问题标题】:How to get multiple attachments from gmail and save them to the folder?如何从gmail获取多个附件并将它们保存到文件夹中?
【发布时间】:2015-03-04 02:57:55
【问题描述】:

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

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

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

【问题讨论】:

  • 你能提供你正在使用的 API 的链接吗?也许还有一些来自您的电子邮件访问的代码,以便我们在提交答案之前在本地检查
  • 查看您的if 声明。仅当目录不存在时才保存文件。我认为,这个问题应该关闭,因为错误不属于 GMail API。
  • 很快,你是对的。只是一个小错误,我自己想通了,但为时已晚,无法编辑问题。 :P 无论如何,谢谢。你有一双敏锐的眼睛。
  • 感谢 Nicolas 有兴趣帮助我。这只是一个“如果”的错误。
  • 一段可重复使用的代码...

标签: c# gmail-api


【解决方案1】:

// 上述解决方案中缺少的功能

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2020-09-06
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多