nix/home/email/default.nix
2025-12-04 14:31:38 -06:00

99 lines
3.1 KiB
Nix

{
pkgs,
lib,
config,
dots,
xdg-config-dir,
...
}:
{
options.custom.email = with lib; {
enable = mkEnableOption "Enable email";
davmail = mkEnableOption "Enable DavMail";
mbsync = mkEnableOption "Enable Mbsync";
neomutt = mkEnableOption "Enable NeoMutt";
notmuch = mkEnableOption "Enable notmuch";
mailcap = mkEnableOption "Enable mailcap";
};
config = lib.mkIf config.custom.email.enable {
# DavMail service (Exchange gateway)
services.davmail = {
enable = config.custom.email.davmail;
configFile = "${dots}/config/davmail/davmail.properties";
};
# Mbsync service (mail sync)
services.mbsync = {
enable = config.custom.email.mbsync;
configFile = "${dots}/config/mbsync/mbsyncrc";
frequency = "*:0/3";
extraPackages = with pkgs; [ sops ] ++ lib.optionals config.custom.email.notmuch [ notmuch ];
postExec = lib.mkIf config.custom.email.notmuch "${pkgs.notmuch}/bin/notmuch new";
environment = {
SOPS_AGE_KEY_FILE = "${xdg-config-dir}/sops/age/keys.txt";
}
// lib.optionalAttrs config.custom.email.notmuch {
NOTMUCH_CONFIG = "${xdg-config-dir}/notmuch/config";
};
};
# Install mail-related packages
home.packages =
with pkgs;
[
isync # mbsync
msmtp
sops # for password decryption
age # for sops age backend
]
++ lib.optionals config.custom.email.neomutt [
# Wrapper script for neomutt with truecolor support
(writeShellScriptBin "neomutt" ''
exec env TERM=xterm-direct ${neomutt}/bin/neomutt "$@"
'')
]
++ lib.optionals config.custom.email.notmuch [
notmuch
]
++ lib.optionals config.custom.email.mailcap [
mailcap
w3m # HTML rendering
zathura # PDF viewer
chafa # terminal image viewer
bat # text viewer with syntax highlighting
mblaze # mshow for email viewing
ripmime # extract MIME parts from emails
];
# Symlink config files
xdg.configFile = {
"msmtp".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/msmtp";
"neomutt".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/neomutt";
"isyncrc".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/mbsync/mbsyncrc";
}
// lib.optionalAttrs config.custom.email.notmuch {
"notmuch/config".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/notmuch/config";
};
# mailcap symlink
home.file = lib.mkIf config.custom.email.mailcap {
".mailcap".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/home/.mailcap";
};
# Create mail directories
home.activation.createMailDirs = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
mkdir -p ~/mail/personal/Inbox
mkdir -p ~/mail/uchicago/Inbox
mkdir -p ~/.cache/neomutt/headers
mkdir -p ~/.cache/neomutt/messages
mkdir -p ~/.local/state
'';
# Set NOTMUCH_CONFIG environment variable
custom.environment.variables = lib.mkIf config.custom.email.notmuch {
NOTMUCH_CONFIG = "${xdg-config-dir}/notmuch/config";
};
};
}