Beispiel #1
0
 public MessageEnamerator(Gmail gmail) => _gmail = gmail;
Beispiel #2
0
        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);
                }
            }
        }