public MessageEnamerator(Gmail gmail) => _gmail = gmail;
private static async Task Run(string clientId, string clientSecret, string refreshToken, string dstPath, int limitDays, DeleteRule[] deleteRules) { var gmail = new Gmail(clientId, clientSecret, refreshToken); var me = gmail.GetMessageEnamerator(); var limit = DateTimeOffset.Now.AddDays(-limitDays); while (await me.Next()) { string id = null; try { id = me.CurrentMessageId; Console.Write(id); var jsonPath = Path.Combine(dstPath, "json", id.Substring(14), id.Substring(12)); var jsonName = Path.Combine(jsonPath, id + ".json"); if (!File.Exists(jsonName)) { Directory.CreateDirectory(jsonPath); await me.StoreFullMessage(jsonName); } var json = await File.ReadAllTextAsync(jsonName); var message = JsonConvert.DeserializeObject <MinMessage>(json); if (message == null || message.InternalDate == 0) { File.Delete(jsonName); Console.WriteLine(); continue; } var time = DateTimeOffset.FromUnixTimeMilliseconds(message.InternalDate).ToOffset(_japanTimeSpan); Console.Write($" {time:yyyy-MM-dd HH:mm:ss}"); var name = GenerateName(message); Console.Write(" " + name); name = $"{time:yyyyMMddHHmmss}_{message.Id}" + name; var pathE = Path.Combine(dstPath, time.ToString("yyyy"), time.ToString("yyyy-MM"), time.ToString("yyyy-MM-dd")); var fileE = Path.Combine(pathE, name + ".eml"); if (!File.Exists(fileE)) { Directory.CreateDirectory(pathE); var raw = await me.GetRawMessage(); await File.WriteAllBytesAsync(fileE, raw); File.SetCreationTime(fileE, time.DateTime); File.SetLastWriteTime(fileE, time.DateTime); File.SetCreationTime(jsonName, time.DateTime); File.SetLastWriteTime(jsonName, time.DateTime); Console.Write(" Store"); } if (time < limit) { message = await me.GetMinimalMessage(); bool isMatch = false; foreach (var deleteRule in deleteRules) { if (message.LabelIds.Contains(deleteRule.Id)) { if (deleteRule.Limit >= 0) { var ilimit = DateTimeOffset.Now.AddDays(-deleteRule.Limit); if (time < ilimit) { await me.MoveToTrash(); Console.Write(" Trash"); } } isMatch = true; break; } } if (!isMatch) { await me.MoveToTrash(); Console.Write(" Trash"); } } Console.WriteLine(); } catch (Exception exp) { Console.WriteLine(); Console.WriteLine(exp); var fn = DateTimeOffset.Now.ToOffset(_japanTimeSpan).ToString("yyyyMMddHHmmss") + ".txt"; fn = Path.Combine(dstPath, fn); var str = exp.ToString(); if (id != null) { str = id + "\r\n" + str; } await File.WriteAllTextAsync(fn, str); } } }