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