Last active
April 5, 2020 11:04
-
-
Save escamoteur/0bc3cd617490c904362503391e85a29e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
open MailKit.Net.Imap | |
open MailKit | |
open MimeKit | |
type FolderInfo = { | |
name : string | |
size : uint64 | |
} | |
module actions | |
open model | |
open MailKit.Net.Imap | |
open MailKit | |
let calcFolderSize (folder: IMailFolder) : uint64 = | |
printfn "%s" folder.FullName | |
let summaries = | |
try | |
folder.Open(FolderAccess.ReadOnly) |> ignore | |
folder.Fetch(0,-1,MessageSummaryItems.Full) | |
|> Seq.cast<IMessageSummary> | |
|> Seq.toList | |
with | |
| _ as ex -> | |
printfn "Error fetching folder %s: %s" folder.FullName ex.Message | |
[] | |
summaries | |
|> List.map<IMessageSummary,uint64> (fun summary -> | |
let size= summary.Size |> Option.ofNullable | |
match size with | |
| None -> | |
printfn "No size in Folder %s Mail %s" folder.FullName summary.NormalizedSubject | |
0UL | |
| Some size -> uint64 size ) | |
|> List.sum | |
let printFolderInfo totalSize folderInfo : unit = | |
let percent = (folderInfo.size * 100UL) / totalSize | |
printfn "%s: Size %d %d" folderInfo.name (folderInfo.size / 1024UL) percent | |
let buildFolderInfo (folder: IMailFolder) : FolderInfo = | |
{name=folder.FullName; size= calcFolderSize folder} | |
let getAllFoldersInfos (client: ImapClient): FolderInfo seq = | |
let folders = client.GetFolders(client.PersonalNamespaces.[0]) | |
folders | |
|> Seq.cast<IMailFolder> | |
|> Seq.map (fun folder -> buildFolderInfo folder ) | |
let analyzeFolders (client: ImapClient) = | |
let folders = | |
getAllFoldersInfos client | |
|> Seq.sortByDescending(fun folder -> folder.size) | |
|> Seq.cache | |
let totalSize = folders |> Seq.sumBy (fun folder -> folder.size) | |
folders |> Seq.iter (fun folder -> printFolderInfo totalSize folder) | |
[<EntryPoint>] | |
let main argv = | |
let client = new ImapClient () | |
client.Connect ("mail.yourserver.de", 993, true); | |
client.Authenticate ("username", "password"); | |
analyzeFolders client | |
0 // return an integer exit code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment