我正在尝试从邮件中获取附件并将其保存到我选择的文件夹中。当邮件包含单个附件时,无论文件类型如何,都会完全保存到我的文件夹,但如果邮件包含多个附件,则只有第一个附件会保存到该文件夹中。请检查我的代码,以了解我在说什么。
#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);
用上面的代码改变我的代码之后,一切都像魅力一样。
答案 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());
}