Once upon a time I wrote an email client, in a combination of C++ and Lua.
Later I realized it was flawed, and because I hadn't realized that writing email clients is hard I decided to write it anew (again in C++ and Lua).
Nowadays I do realize how hard writing email clients is, so I'm not going to do that again. But still .. but still ..
I was doing some mail-searching recently and realized I wanted to write something that processed all the messages in a Maildir folder. Imagine I wanted to run:
message-dump ~/Maildir/people-foo/ ~/Maildir/people-bar/ \
--format '${flags} ${filename} ${subject}'
As this required access to (arbitrary) headers I had to read, parse, and process each message. It was slow, but it wasn't that slow. The second time I ran it, even after adjusting the format-string, it was nice and fast because buffer-caches rock.
Anyway after that I wanted to write a script to dump the list of folders (because I store them recursively so ls -1 ~/Maildir
wasn't enough):
maildir-dump --format '${unread}/${total} ${path}'
I guess you can see where this is going now! If you have the following three primitives, you have a mail-client (albeit read-only)
- List "folders"
- List "messages"
- List a single message.
So I hacked up a simple client that would have a sub-command for each one of these tasks. I figured somebody else could actually use that, be a little retro, be a little cool, pretend they were using MH. Of course I'd have to write something horrid as a bash-script to prove it worked - probably using dialog to drive it.
And then I got interested. The end result is a single golang binary that will either:
- List maildirs, with a cute format string.
- List messages, with a cute format string.
- List a single message, decoding the RFC2047 headers, showing
text/plain
, etc. - AND ALSO USE ITSELF TO PROVIDE A GUI
And now I wonder, am I crazy? Is writing an email client hard? I can't remember
- Current user-interface:
- Current source code:
Probably best to forget the GUI exists. Probably best to keep it a couple of standalone sub-commands for "scripting email stuff".
But still .. but still ..
Tags: email, golang, maildir, maildir-utils 4 comments