{ config, lib, pkgs, ... }: { options = { accounts.email.accounts = lib.mkOption { type = lib.types.attrsOf (lib.types.submodule { options.aerc-sbruder.enable = lib.mkEnableOption "aerc (custom implementation)"; }); }; }; config = { programs.aerc = { enable = true; # incomplete support for all configuration options! extraAccounts = (lib.mapAttrs (name: accountConfig: with accountConfig; let quoteMailAddress = lib.replaceStrings [ "@" "\\" ] [ "%40" "%5C" ]; # home-manager has no way to set if an account requires AUTH LOGIN # this emulats this by setting a list of known providers that do require it requiresLogin = lib.elem (lib.elemAt (lib.strings.splitString "@" address) 1) [ "mailbox.tu-dresden.de" ]; in { source = if notmuch.enable then "notmuch://${config.accounts.email.maildirBasePath}" else "`imap://${quoteMailAddress userName}@${imap.host}`"; source-cred-cmd = "`${lib.concatStringsSep " " passwordCommand}`"; # TODO: remove when copy-to is implemented in aerc for notmuch outgoing = if notmuch.enable then "${./msmtp-wrapper} ${name}" else "`smtp${lib.optionalString requiresLogin "+login"}://${quoteMailAddress userName}@${smtp.host}`"; outgoing-cred-cmd = "`${lib.concatStringsSep " " passwordCommand}`"; from = "${realName} <${address}>"; smtp-starttls = if smtp.tls.useStartTls then "yes" else "no"; copy-to = "Sent"; signature-file = toString (pkgs.writeText "signature-${name}" signature.text); pgp-key-id = gpg.key; pgp-auto-sign = gpg.signByDefault; pgp-opportunistic-encrypt = gpg.encryptByDefault; } // (lib.optionalAttrs notmuch.enable { query-map = toString (pkgs.writeText "aerc-query-map" '' Archive=not tag:inbox and not tag:sent Git=tag:git INBOX=tag:inbox Newsletter=tag:newsletter Sent=tag:sent Spam=tag:spam Trash=tag:deleted eBay Kleinanzeigen=tag:kleinanzeigen eBay=tag:ebay ''); exclude-tags = lib.concatStringsSep "," [ "archived" "deleted" "spam" ]; })) (lib.filterAttrs (_: config: config.aerc-sbruder.enable) config.accounts.email.accounts)); extraConfig = { general = { pgp-provider = "gpg"; # internal does not work # Allow world-readable accounts.conf (passwords are not stored in it, so it is ok) unsafe-accounts-conf = true; }; ui = { index-format = "%-17.17D %-20.20n %Z %-20.20g %s"; # See https://godoc.org/time#Time.Format timestamp-format = "2006-01-02 15:04 MST"; this-day-time-format = "15:04"; this-week-time-format = "Monday 15:04"; this-year-time-format = "02 January"; pinned-tab-marker = "車"; border-char-vertical = "│"; border-char-horizontal = "─"; fuzzy-complete = true; #threading-enabled = true; # broken new-message-bell = false; }; statusline = { display-mode = "icon"; }; viewer = { header-layout = lib.concatStringsSep "," [ "From|To" "Cc|Bcc" "Subject" "Date" "Reply-To" "X-Mailer" "User-Agent" ]; }; compose = { editor = "nvim"; header-layout = lib.concatStringsSep "," [ "To|From" "Subject" ]; address-book-cmd = "khard email --parsable --remove-first-line %s"; }; filters = { "subject,~^\\[PATCH" = "awk -f ${pkgs.aerc}/share/aerc/filters/hldiff"; "text/plain" = "${./colorize}"; # taken from upstream and patched "text/html" = "html"; # internal filter "text/calendar" = "${pkgs.python3.withPackages (ps: with ps; [ vobject ])}/bin/python ${pkgs.aerc}/share/aerc/filters/show-ics-details.py"; # hacky fix for broken nix support }; triggers = { new-email = "exec notify-send -i mail-unread-symbolic 'New e-mail from %n' '%s'"; }; templates = { }; }; extraBinds = { global = { # Binds are of the form = # To use '=' in a key sequence, substitute it with "Eq": "" # If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit "" = ":prev-tab"; "" = ":next-tab"; "" = ":term"; }; messages = { "q" = ":quit"; "" = ":exec notmuch new"; "j" = ":next"; "" = ":next"; "" = ":next 50%"; "" = ":next 100%"; "" = ":next 100%"; "k" = ":prev"; "" = ":prev"; "" = ":prev 50%"; "" = ":prev 100%"; "" = ":prev 100%"; "g" = ":select 0"; "G" = ":select -1"; "J" = ":next-folder"; "K" = ":prev-folder"; "H" = ":collapse-folder"; "L" = ":expand-folder"; "v" = ":mark -t"; "V" = ":mark -v"; "T" = ":toggle-threads"; "" = ":view"; #"d" = ":prompt 'Really delete this message?' ':modify-labels +deleted'"; # does not work "D" = ":modify-labels +deleted -inbox"; "A" = ":modify-labels -inbox"; "ms" = ":modify-labels +spam -inbox"; "mS" = ":modify-labels -spam +inbox"; "mn" = ":modify-labels +newsletter"; "mN" = ":modify-labels -newsletter"; "C" = ":compose"; "rr" = ":reply -a"; "rq" = ":reply -aq"; "Rr" = ":reply"; "Rq" = ":reply -q"; "c" = ":cf"; "$" = ":term"; "!" = ":term"; "|" = ":pipe"; "/" = ":search"; "\\" = ":filter"; "n" = ":next-result"; "N" = ":prev-result"; "" = ":clear"; }; view = { "/" = ":toggle-key-passthrough/"; "q" = ":close"; "O" = ":open"; "S" = ":save"; "|" = ":pipe"; "D" = ":modify-labels +deleted -inbox"; "A" = ":modify-labels -inbox"; "f" = ":forward"; "rr" = ":reply -a"; "rq" = ":reply -aq"; "Rr" = ":reply"; "Rq" = ":reply -q"; "H" = ":toggle-headers"; "" = ":prev-part"; "" = ":next-part"; "J" = ":next"; "K" = ":prev"; }; "view::passthrough" = { "$noinherit" = "true"; "$ex" = ""; "" = ":toggle-key-passthrough"; }; # Keybindings used when the embedded terminal is not selected in the compose view" compose = { "$ex" = ""; "" = ":prev-field"; "" = ":next-field"; "" = ":next-field"; "" = ":prev-field"; }; # Keybindings used when the embedded terminal is selected in the compose view "compose::editor" = { "$noinherit" = "true"; "$ex" = ""; "" = ":prev-field"; "" = ":next-field"; "" = ":prev-tab"; "" = ":next-tab"; }; # Keybindings used when reviewing a message to be sent "compose::review" = { "y" = ":send"; "n" = ":abort"; "p" = ":postpone"; "q" = ":choose -o d discard abort -o p postpone postpone"; "e" = ":edit"; "a" = ":attach"; "d" = ":detach"; }; terminal = { "$noinherit" = "true"; "$ex" = ""; "" = ":prev-tab"; "" = ":next-tab"; }; }; stylesets = { default = { "*.selected.reverse" = true; "title.reverse" = true; "header.bold" = true; "*error.bold" = true; "error.fg" = 1; "warning.fg" = 3; "success.fg" = 2; "statusline_default.bg" = 0; "statusline_error.fg" = 1; "statusline_error.reverse" = true; "statusline_success.fg" = 2; "statusline_success.reverse" = true; "msglist_unread.bold" = true; "msglist_deleted.fg" = 10; "tab.bg" = 11; "tab.selected.reverse" = false; "tab.selected.bg" = 12; "tab.fg" = 0; "completion_default.bg" = 0; }; }; }; }; }