nixos-configuration/home/mail/default.nix

265 lines
6.6 KiB
Nix

{ pkgs, ... }:
let
mailBaseConfig = {
configName,
address,
userName ? address,
host,
displayName,
extraMailboxes ? [],
enableDefaultMailboxes ? true,
neomuttExtraConfig ? "",
} : let
defaultMailboxes = if enableDefaultMailboxes then
/* `tree ~/Maildir/vbrandl/ -l -d -I "Archive|cur|new|tmp|certs|.notmuch" -afin --noreport | awk '{if(NR>1)print}' | tr '\n' ' '` */
[ "Drafts" "Junk" "Sent" "Trash" ]
else
[];
mailboxes = defaultMailboxes ++ extraMailboxes;
in {
address = address;
userName = userName;
realName = displayName;
imap.host = host;
smtp.host = host;
passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup email ${address}";
signature = {
text = displayName;
showSignature = "append";
};
aerc = {
enable = true;
extraAccounts = {
pgp-opportunistic-encrypt = true;
pgp-autosign = true;
};
};
imapnotify = {
enable = true;
/* TODO: which boxes? */
boxes = [ "Inbox" ];
onNotify = "${pkgs.isync}/bin/mbsync ${configName} && ${pkgs.libnotify}/bin/notify-send -a mail '${configName}: new in %s'";
/* onNotifyPost = { */
/* mail = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: new in %s'"; */
/* /1* update = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: update %s'"; *1/ */
/* /1* expunge = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: expunge %s'"; *1/ */
/* }; */
};
mbsync = {
enable = true;
/* sync changes to maildir in both directions */
create = "both";
expunge = "both";
remove = "both";
};
msmtp.enable = true;
neomutt = {
enable = true;
extraMailboxes = mailboxes;
extraConfig = ''
# use encrypted headers
set crypt_protected_headers_write = yes
'' + neomuttExtraConfig;
};
notmuch.enable = true;
};
in {
home.packages = with pkgs; [
libsecret
libnotify
urlview
];
home.file.mailcap = {
target = ".mailcap";
source = ./mailcap;
};
programs.password-store.enable = true;
programs.aerc = {
enable = true;
extraConfig = builtins.readFile ./aerc/aerc.conf;
/* { */
/* general = { */
/* unsafe-accounts-conf = true; */
/* }; */
/* }; */
extraBinds = builtins.readFile ./aerc/binds.conf;
};
services.mbsync.enable = true;
programs.mbsync.enable = true;
services.imapnotify.enable = true;
programs.notmuch = {
enable = true;
hooks.preNew = "mbsync --all";
};
programs.neomutt = {
enable = true;
sidebar.enable = true;
extraConfig = builtins.readFile ./neomutt/neomuttrc;
/* vimKeys = true; */
macros = [
{ map = [ "pager" "index" ];
key = "B";
action = "|urlview\\n";
}
];
binds = [
/* sidebar */
{ map = [ "attach" "browser" "index" ];
key = "J";
action = "sidebar-next";
}
{ map = [ "attach" "browser" "index" ];
key = "K";
action = "sidebar-prev";
}
{ map = [ "attach" "browser" "index" ];
key = "O";
action = "sidebar-open";
}
/* moving around */
{ map = [ "attach" "browser" "index" ];
key = "j";
action = "next-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "k";
action = "previous-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "g";
action = "noop";
}
{ map = [ "attach" "browser" "index" ];
key = "gg";
action = "first-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "G";
action = "last-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "n";
action = "next-unread";
}
{ map = [ "pager" ];
key = "g";
action = "noop";
}
{ map = [ "pager" ];
key = "gg";
action = "top";
}
{ map = [ "pager" ];
key = "G";
action = "bottom";
}
{ map = [ "pager" ];
key = "k";
action = "previous-line";
}
{ map = [ "pager" ];
key = "j";
action = "next-line";
}
/* deletion */
{ map = [ "pager" "index" ];
key = "d";
action = "noop";
}
{ map = [ "pager" "index" ];
key = "dd";
action = "delete-message";
}
/* TODO: mark as new? */
{ map = [ "browser" "pager" "index" ];
key = "U";
action = "toggle-new";
}
{ map = [ "browser" "pager" "index" ];
key = "n";
action = "search-next";
}
{ map = [ "browser" "pager" "index" ];
key = "N";
action = "search-opposite";
}
/* threads */
{ map = [ "pager" "index" ];
key = "dT";
action = "delete-thread";
}
{ map = [ "pager" "index" ];
key = "dt";
action = "delete-subthread";
}
{ map = [ "pager" "index" ];
key = "gt";
action = "next-thread";
}
{ map = [ "pager" "index" ];
key = "gT";
action = "previous-thread";
}
{ map = [ "index" ];
key = "za";
action = "collapse-thread";
}
{ map = [ "index" ];
key = "zA";
action = "collapse-all";
}
];
};
programs.msmtp.enable = true;
accounts.email.accounts = let
aliases = "mail(\\+.*)?@vbrandl.net";
in {
vbrandl = (
mailBaseConfig {
configName = "vbrandl";
address = "mail@vbrandl.net";
host = "mail.vbrandl.net";
displayName = "Valentin Brandl";
extraMailboxes = [ "Archive" ];
/* #set use_from = yes */
/* #set envelope_from = true */
neomuttExtraConfig = ''
# TODO: reply with tagged mail
set reverse_name = yes
alternates '${aliases}'
'';
}) // {
primary = true;
aliases = [ aliases ];
gpg = {
encryptByDefault = true;
signByDefault = true;
key = "1FFE431282F4B8CC0A7579167FB009175885FC76";
};
};
riseup = (
mailBaseConfig {
configName = "riseup";
address = "vbrandl@riseup.net";
host = "mail.riseup.net";
displayName = "Valentin Brandl";
extraMailboxes = [ "SKS-devel" ];
}) // {
userName = "vbrandl";
gpg = {
encryptByDefault = true;
signByDefault = true;
key = "1FFE431282F4B8CC0A7579167FB009175885FC76";
};
};
};
}