email client in uxn + crystal
Find a file
2023-03-26 15:57:37 -06:00
.gitignore implement security remediation for search and refile; add socket pushig updates from, eg mbsync; add documentation to config and UXN_EMU option 2023-03-26 11:29:07 -06:00
build.sh refactor mread into taro-reader, clean up some code, fix mouse bug in taro-ls 2023-03-23 23:36:20 -06:00
config.cr implement security remediation for search and refile; add socket pushig updates from, eg mbsync; add documentation to config and UXN_EMU option 2023-03-26 11:29:07 -06:00
lesskey refactor mread into taro-reader, clean up some code, fix mouse bug in taro-ls 2023-03-23 23:36:20 -06:00
README.md implement security remediation for search and refile; add socket pushig updates from, eg mbsync; add documentation to config and UXN_EMU option 2023-03-26 11:29:07 -06:00
taro-ctl.cr taro-ctl: delete socket file before starting server; taro-ls: add keybinds for switching mailboxes 2023-03-26 15:36:05 -06:00
taro-ls.tal taro-ls: generalize nav_list_by_key 2023-03-26 15:57:37 -06:00
taro-reader refine taro-reader, add MBOX_ROOT to config instead of using env, and adjust refresh logic 2023-03-25 11:25:50 -06:00

taro

mblaze frontend in uxn and crystal

build and install

  1. Install and configure mblaze
  2. Install uxn and crystal
  3. Edit config.cr and probably the mhandle function in taro-reader (see next section)
  4. Run build.sh
  5. Copy taro-ctl to your path

configuration

The config.cr file is a bunch of constants for taro-ctl to use. Adjust them to your needs:

  • MBOX_ROOT: the directory where your maildirs are
  • TARO_LIB: the directory where the taro-ls rom, taro-reader script, lesskey file, and taro.sock files go (probably just where you cloned this repository.
  • TARO_DOWNLOADS: directory where attachments are downloaded to
  • UXN_EMU: name of the uxnemu executable. You can copy uxnemu to, eg taro and it will have that _NET_WM_CLASS
  • TARO_ENV: environment variables as you type them in the terminal, that you can use for the READER_PROG and COMPOSE_PROG commands
  • READER_PROG: command to spawn to read mail - by default it calls the st terminal with some environment variables and options set, and runs taro-reader
  • COMPOSE_PROG: command to spawn to write mail - by default it calls the st terminal with some environment variables and options set and runs mcom from mblaze

Environment variable and tilde expansion in the config are not supported.

usage

taro is a multi-window MUA with three types of windows:

  • taro-ls: the main uxn window where you will check your inbox and organize your mail
  • taro-reader: a terminal window that runs a shell script to read mail
  • taro-compose: a terminal window running mcom

The windows are managed by a master program, taro-ctl, which talks to them with messages (see below).

mail management

The taro-ls window has three main areas:

  • Mailboxes: it's assumed by taro-ctrl that your inbox is named INBOX, and it exists; it's put first, and the rest are shown in alphabetical order
  • Mail List: your mail in the default scan-format given in your mblaze-profile is shown here
  • Actions: button list and initially hidden text input area

Left clicking on a mailbox switches to that mailbox. Left-clicking on mail selects that mail. You can do multiselect by holding shift when clicking. Right-clicking on mail opens that mail (only the first in the selection if 2 or more are selected). You can also use the Enter key to open mail.

The buttons on the bottom are as follows (with equivalent keybinds):

  • compose [n]: open a compose window to write new mail
  • refresh [r]: refresh the current mailbox, removing search query
  • mark all read ['.']: this
  • search [/]: search mail with a regex (only headers, case insensitive)
  • refile [m]: move mail to the given folder
  • trash [Del]: move mail to the Trash folder, unless it's already in the Trash, in which case it's deleted

There is a resize handle in the bottom right - clicking and dragging it resizes the window.

At the bottom-left, a small indicator will appear if you have a search query active. Performing the refresh action or switching mailboxes will make it disappear.

reading mail

Reading mail is currently done in a terminal that pipes the mail content into less and gives some keybind options:

  • q: quit
  • r: reply
  • 'f': forward
  • 'o': open an attachment - you are presented with the MIME structure of the mail with parts numbered and prompted to select a number to open. The programs to open each mimetype are in the aforementioned handle function of the script.
  • s: save an attachment - like o but selecting a MIME part saves it to the folder TARO_DOWNLOADS in config.cr

The attachment actions loop until you enter nothing or a non-numeric value. The whole script loops until you quit.

writing mail

Writing mail is currently done by opening a terminal and calling mcom, which lets you compose in your EDITOR of choice and prompts for additional action.

crypto

If you try to decrypt/sign with either pinenetry-tty or pinentry-curses, GPG will attach it to the stdio of taro-ctl, not the terminal window where you are viewing/composing mail. Use a graphical pinentry program instead.

TODO

  • Implement keybinds for changing mailbox, selecting/scrolling mail, resizing
  • Add options to search for case-insensitivity and including body content
  • Add option to refile to copy instead of move
  • Flag/star messages? I never use this fature if IMAP...
  • Real uxn implementaions of reader/compose windows? Probably overkill

messages (IPC)

Messages are in the format [1][2:3][...]:

  • byte 1 is the message type
  • bytes 2 and 3 are the length of the message, in bytes
  • bytes 4 and beyond are the message itself (payload) - won't be present if the length is 0

Even messages go from taro-ctl to the uxn windows.

  • 0: mailbox list (truncated to 4k - this should be enough)
  • 2: list mail in current mailbox (or search results) (truncated to 32k - if you need more, use search)

Odd messages go from the uxn windows to taro-ctl (or from taro-ctl to itself).

  • 1: change/refresh mailbox; payload is the mailbox to read
  • 3: mark all as read in current mailbox; no payload
  • 5: search mail; payload is the regex
  • 7: refile mail; payload is the beginning and end of the mmsg range in u16, and then the mailbox name
  • 9: trash mail; payload is the beginning and end of the mmsg range in u16
  • 11: read mail; payload is a single u16 message number in the current sequence
  • 13: compose mail; no payload
  • 15: push view update (keeps search query, for after replying/writing mail or when new mail comes in)

socket (other IPC)

taro-ctl creates a socket at TARO_LIB/taro.sock and listens for bytes on it. Every time a byte is written to the socket, taro-ctl will use message 15 to update the inbox. Whatever method you use to sync your maildirs to your mailserver, it can write a byte to this socket when you receive mail!