Skip to content

Instantly share code, notes, and snippets.

@escamoteur
Last active April 5, 2020 11:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save escamoteur/0bc3cd617490c904362503391e85a29e to your computer and use it in GitHub Desktop.
Save escamoteur/0bc3cd617490c904362503391e85a29e to your computer and use it in GitHub Desktop.
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