Ejemplo n.º 1
0
        private static int RunWith(ListOptions opts)
        {
            var storage = new ProfileStorage();

            var output = new OutputTable();

            output.AddColumns("name", "username", "hostname")
            .AddColumn("port", "0", OutputAlignment.Right)
            .AddColumns("ssl");

            if (opts.Passwords)
            {
                output.AddColumn("password");
            }

            foreach (var profile in storage.GetProfiles(opts))
            {
                var row = output.AddRow(profile.Name, profile.UserName, profile.HostName, profile.Port, profile.Ssl);
                if (opts.Passwords)
                {
                    row.Values.Add(profile.Password);
                }
            }

            output.WriteTo(Console.Out);

            return(0);
        }
Ejemplo n.º 2
0
        private static int RunWith(RemoveOptions opts)
        {
            var storage = new ProfileStorage();

            foreach (var profile in storage.GetProfiles(opts))
            {
                storage.Remove(profile.Name);
                Console.WriteLine($"profile {profile.Name} ({profile.UserName}) removed.");
            }

            return(0);
        }
Ejemplo n.º 3
0
        private static int RunWith(BackupOptions opts)
        {
            var storage = new ProfileStorage();

            foreach (var profile in storage.GetProfiles(opts))
            {
                Console.WriteLine($"{profile.Name} - {profile.UserName}");
                using (var client = profile.CreateClient())
                {
                    foreach (var ns in client.PersonalNamespaces)
                    {
                        foreach (var folder in client.GetFolders(ns))
                        {
                            folder.Open(FolderAccess.ReadOnly);
                            Console.WriteLine($"{folder.FullName} - {folder.Count} messages");

                            var backupFolder = Path.Combine(opts.BackupFolder, profile.Name, folder.FullName);
                            if (!Directory.Exists(backupFolder))
                            {
                                Directory.CreateDirectory(backupFolder);
                            }

                            var count = 0;

                            foreach (var id in folder.Search(SearchQuery.All))
                            {
                                count++;
                                Console.Write($"... {count}/{folder.Count} ...\r");

                                var filename = Path.Combine(backupFolder, $"{id}.eml");
                                if (!File.Exists(filename))
                                {
                                    var message = folder.GetMessage(id);
                                    message.WriteTo(filename);
                                }
                            }

                            Console.Write("                                                  \r");
                            folder.Close();
                        }
                    }
                }
            }

            return(0);
        }
Ejemplo n.º 4
0
        private static void RunWithMessages(InfoOptions opts)
        {
            var storage = new ProfileStorage();

            bool needLine = false;

            foreach (var profile in storage.GetProfiles(opts))
            {
                using (var client = profile.CreateClient())
                {
                    var output = new OutputTable();
                    output
                    .AddColumn(profile.Name)
                    .AddColumn("messages", "#,##0", OutputAlignment.Right)
                    .AddColumn("unread", "#,##0", OutputAlignment.Right);

                    var messages = 0;
                    var unread   = 0;

                    foreach (var ns in client.PersonalNamespaces)
                    {
                        foreach (var folder in client.GetFolders(ns).Where(f => f.ParentFolder.ParentFolder == null))
                        {
                            OutputFolder(output, folder, ref messages, ref unread);
                        }
                    }

                    output.AddSeparator();
                    output.AddRow(profile.UserName, messages, unread);

                    if (needLine)
                    {
                        Console.WriteLine();
                    }
                    else
                    {
                        needLine = true;
                    }

                    output.WriteTo(Console.Out);
                }
            }
        }
Ejemplo n.º 5
0
        private static void RunWithNotAll(InfoOptions opts)
        {
            var storage = new ProfileStorage();

            var output = new OutputTable();

            output
            .AddColumns("name", "username")
            .AddColumn("messages", "#,##0", OutputAlignment.Right)
            .AddColumn("limit", "#,##0", OutputAlignment.Right)
            .AddColumn("storage", "#,##0", OutputAlignment.Right)
            .AddColumn("limit", "#,##0", OutputAlignment.Right);

            foreach (var profile in storage.GetProfiles(opts))
            {
                using (var client = profile.CreateClient())
                {
                    var quota = client.Inbox.GetQuota();
                    output.AddRow(profile.Name, profile.UserName, quota.CurrentMessageCount, quota.MessageLimit, quota.CurrentStorageSize, quota.StorageLimit);
                }
            }
            output.WriteTo(Console.Out);
        }
Ejemplo n.º 6
0
        private static int RunWith(RestoreOptions opts)
        {
            var storage = new ProfileStorage();

            foreach (var profile in storage.GetProfiles(opts))
            {
                Console.Write($"{profile.Name} - {profile.UserName}");
                if (opts.SourceProfile != "")
                {
                    Console.WriteLine($" from {opts.SourceProfile}");
                }
                else
                {
                    Console.WriteLine();
                }

                var profileFolder = opts.SourceProfile == "" ? profile.Name : opts.SourceProfile;
                var backupFolder  = Path.Combine(opts.BackupFolder, profileFolder);

                var filters = opts.MessageBoxes.Select(m => m.Split("=".ToCharArray(), 2))
                              .ToDictionary(p => p[0], p => p.Length == 1 ? p[0] : p[1]);

                using (var client = profile.CreateClient())
                {
                    foreach (var directory in Directory.EnumerateDirectories(backupFolder, "*", SearchOption.AllDirectories))
                    {
                        var foldername = directory.Substring(backupFolder.Length + 1).Replace('\\', '/');

                        var targetFoldername = foldername;

                        if (filters.Count == 0 || filters.TryGetValue(foldername, out targetFoldername))
                        {
                            Console.WriteLine($"restore {foldername} to {targetFoldername}");

                            var folder = GetFolder(client.GetFolder(client.PersonalNamespaces[0]), new Queue <string>(targetFoldername.Split('/')));

                            // filenames in order of message id
                            var filenames = Directory.GetFiles(directory, "*.eml")
                                            .OrderBy(f => uint.Parse(Path.GetFileNameWithoutExtension(f))).ToArray();

                            folder.Open(FolderAccess.ReadWrite);
                            Console.WriteLine($"{folder.FullName} - {filenames.Length} messages");

                            var count = 0;
                            var added = 0;
                            // already proceessed ids - to remove duplicate ids
                            var ids = new HashSet <string>();

                            foreach (var filename in filenames)
                            {
                                var sourceMessage = MimeMessage.Load(filename);
                                if (!sourceMessage.Headers.Contains(MessageId) && opts.CreateId)
                                {
                                    var id = $"{Guid.NewGuid()}@id-made@home";
                                    sourceMessage.Headers.Add(MessageId, id);
                                    sourceMessage.WriteTo(filename);
                                }

                                if (sourceMessage.Headers.Contains(MessageId))
                                {
                                    if (ids.Contains(sourceMessage.Headers[MessageId]))
                                    {
                                        if (opts.CreateId)
                                        {
                                            var id = $"{Guid.NewGuid()}@id-made@home";
                                            sourceMessage.Headers[MessageId] = id;
                                            sourceMessage.WriteTo(filename);
                                        }
                                        else
                                        {
                                            Console.WriteLine($"message {filename} has already processed {MessageId}");
                                        }
                                    }

                                    ids.Add(sourceMessage.Headers[MessageId]);
                                    var targets = folder.Search(SearchQuery.HeaderContains(MessageId, sourceMessage.Headers[MessageId]));
                                    if (targets.Count == 0)
                                    {
                                        folder.Append(sourceMessage);
                                        added++;
                                    }
                                    count++;
                                    if (opts.Progress == 1 || (count % opts.Progress) == 0)
                                    {
                                        Console.Write($"... {count}/{filenames.Length} ...\r");
                                    }
                                }
                                else
                                {
                                    Console.WriteLine($"message {filename} has no {MessageId}");
                                }
                            }
                            Console.WriteLine($"{added} messages uploaded            ");
                            folder.Close();
                        }
                    }
                }
            }
            return(0);
        }