2023-02-21 11:57:26 +01:00
|
|
|
{
|
|
|
|
|
pkgs,
|
|
|
|
|
config,
|
|
|
|
|
lib,
|
|
|
|
|
...
|
2025-12-25 08:33:18 +01:00
|
|
|
}:
|
|
|
|
|
{
|
2023-02-22 10:02:55 +01:00
|
|
|
age.secrets = {
|
2025-10-06 10:27:39 +02:00
|
|
|
email-password-ical-ephemeris = {
|
|
|
|
|
file = ../secrets/email-password-ical-ephemeris.age;
|
|
|
|
|
owner = config.users.users.me.name;
|
|
|
|
|
group = config.users.users.me.group;
|
|
|
|
|
mode = "400";
|
|
|
|
|
};
|
2023-02-22 10:02:55 +01:00
|
|
|
email-password-cock = {
|
2023-07-04 16:28:26 +02:00
|
|
|
file = ../secrets/email-password-cock.age;
|
2023-02-22 10:02:55 +01:00
|
|
|
owner = config.users.users.me.name;
|
2023-02-24 23:10:45 +01:00
|
|
|
group = config.users.users.me.group;
|
|
|
|
|
mode = "400";
|
2023-02-22 10:02:55 +01:00
|
|
|
};
|
|
|
|
|
email-password-posteo = {
|
2023-07-04 16:28:26 +02:00
|
|
|
file = ../secrets/email-password-posteo.age;
|
2023-02-22 10:02:55 +01:00
|
|
|
owner = config.users.users.me.name;
|
2023-02-24 23:10:45 +01:00
|
|
|
group = config.users.users.me.group;
|
|
|
|
|
mode = "400";
|
2023-02-22 10:02:55 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2023-02-21 11:57:26 +01:00
|
|
|
home-manager.users.me = {
|
2024-04-04 22:55:18 +02:00
|
|
|
accounts.email.maildirBasePath = "${config.users.users.me.home}/state/Maildir";
|
2024-04-04 14:30:59 +02:00
|
|
|
|
2023-03-06 21:59:49 +01:00
|
|
|
services.mbsync = {
|
|
|
|
|
enable = true;
|
|
|
|
|
frequency = "daily";
|
2023-03-07 13:04:04 +01:00
|
|
|
preExec = "${pkgs.coreutils}/bin/mkdir -p ${config.home-manager.users.me.accounts.email.maildirBasePath}";
|
|
|
|
|
postExec = "${pkgs.notmuch}/bin/notmuch new";
|
2023-03-06 21:59:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
programs.notmuch = {
|
|
|
|
|
enable = true;
|
|
|
|
|
extraConfig = {
|
|
|
|
|
database.path = config.home-manager.users.me.accounts.email.maildirBasePath;
|
|
|
|
|
new.tags = "";
|
2025-12-25 14:00:03 +01:00
|
|
|
user.name = pkgs.lib.niveum.email.defaults.realName;
|
2023-03-06 22:30:09 +01:00
|
|
|
user.primary_email = config.home-manager.users.me.accounts.email.accounts.posteo.address;
|
2023-03-06 21:59:49 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
programs.mbsync = {
|
|
|
|
|
enable = true;
|
2025-12-25 08:33:18 +01:00
|
|
|
extraConfig = lib.concatStringsSep "\n\n" (
|
|
|
|
|
lib.mapAttrsToList (name: account: ''
|
2023-03-06 21:59:49 +01:00
|
|
|
IMAPAccount ${name}
|
|
|
|
|
CertificateFile /etc/ssl/certs/ca-certificates.crt
|
|
|
|
|
Host ${account.imap.host}
|
|
|
|
|
PassCmd "${toString account.passwordCommand}"
|
|
|
|
|
User ${account.userName}
|
|
|
|
|
SSLType IMAPS
|
|
|
|
|
${lib.optionalString (lib.isInt account.imap.port) "Port ${toString account.imap.port}"}
|
|
|
|
|
|
|
|
|
|
IMAPStore ${name}-remote
|
|
|
|
|
Account ${name}
|
|
|
|
|
|
|
|
|
|
MaildirStore ${name}-local
|
|
|
|
|
Path ${config.home-manager.users.me.accounts.email.maildirBasePath}/${name}/
|
|
|
|
|
SubFolders Verbatim
|
|
|
|
|
|
|
|
|
|
Channel ${name}
|
|
|
|
|
Create Near
|
|
|
|
|
Expunge None
|
|
|
|
|
Far :${name}-remote:
|
|
|
|
|
Near :${name}-local:
|
|
|
|
|
Patterns *
|
|
|
|
|
Remove None
|
|
|
|
|
SyncState *
|
2025-12-25 08:33:18 +01:00
|
|
|
'') config.home-manager.users.me.accounts.email.accounts
|
|
|
|
|
);
|
2023-03-06 21:59:49 +01:00
|
|
|
};
|
2023-03-06 14:50:30 +01:00
|
|
|
|
2023-08-06 21:18:42 +02:00
|
|
|
accounts.email.accounts = {
|
2023-02-21 11:57:26 +01:00
|
|
|
cock =
|
2025-12-25 08:33:18 +01:00
|
|
|
let
|
|
|
|
|
mailhost = "mail.cock.li";
|
2023-02-21 11:57:26 +01:00
|
|
|
address = "2210@cock.li";
|
2025-12-25 08:33:18 +01:00
|
|
|
in
|
2025-12-25 14:00:03 +01:00
|
|
|
lib.recursiveUpdate pkgs.lib.niveum.email.defaults {
|
2025-12-25 08:33:18 +01:00
|
|
|
address = address;
|
2023-02-21 11:57:26 +01:00
|
|
|
userName = address;
|
2023-03-07 13:04:04 +01:00
|
|
|
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-cock.path}";
|
2025-02-07 13:02:00 +01:00
|
|
|
realName = "2210";
|
2025-12-25 08:33:18 +01:00
|
|
|
imap.host = mailhost;
|
2025-02-07 13:02:00 +01:00
|
|
|
imap.port = 993;
|
2025-12-25 08:33:18 +01:00
|
|
|
smtp.host = mailhost;
|
2025-02-07 13:02:00 +01:00
|
|
|
smtp.port = 25;
|
|
|
|
|
smtp.tls.useStartTls = true;
|
2025-10-06 10:27:39 +02:00
|
|
|
};
|
|
|
|
|
ical-ephemeris =
|
2025-12-25 08:33:18 +01:00
|
|
|
let
|
|
|
|
|
address = "ical.ephemeris@web.de";
|
|
|
|
|
in
|
2025-12-25 14:00:03 +01:00
|
|
|
lib.recursiveUpdate pkgs.lib.niveum.email.defaults {
|
2025-12-25 08:33:18 +01:00
|
|
|
userName = address;
|
2025-10-06 10:27:39 +02:00
|
|
|
realName = "Kieran from iCal Ephemeris";
|
2025-12-25 08:33:18 +01:00
|
|
|
address = address;
|
2025-10-06 10:27:39 +02:00
|
|
|
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-ical-ephemeris.path}";
|
|
|
|
|
imap.host = "imap.web.de";
|
|
|
|
|
imap.port = 993;
|
|
|
|
|
smtp.host = "smtp.web.de";
|
|
|
|
|
smtp.port = 587;
|
|
|
|
|
smtp.tls.useStartTls = true;
|
2025-02-07 13:02:00 +01:00
|
|
|
};
|
2023-02-21 11:57:26 +01:00
|
|
|
posteo =
|
2025-12-25 08:33:18 +01:00
|
|
|
let
|
|
|
|
|
mailhost = "posteo.de";
|
2023-02-21 11:57:26 +01:00
|
|
|
address = "kieran.meinhardt@posteo.net";
|
2025-12-25 08:33:18 +01:00
|
|
|
in
|
2025-12-25 14:00:03 +01:00
|
|
|
lib.recursiveUpdate pkgs.lib.niveum.email.defaults {
|
2025-12-25 08:33:18 +01:00
|
|
|
address = address;
|
|
|
|
|
aliases = [ "kmein@posteo.de" ];
|
2023-02-21 11:57:26 +01:00
|
|
|
userName = address;
|
2025-12-25 08:33:18 +01:00
|
|
|
imap.host = mailhost;
|
2024-03-14 22:31:55 +01:00
|
|
|
imap.port = 993;
|
|
|
|
|
imap.tls.enable = true;
|
2025-12-25 08:33:18 +01:00
|
|
|
smtp.host = mailhost;
|
2024-03-14 22:31:55 +01:00
|
|
|
smtp.port = 465;
|
|
|
|
|
smtp.tls.enable = true;
|
2023-02-21 11:57:26 +01:00
|
|
|
primary = true;
|
2023-03-07 13:04:04 +01:00
|
|
|
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-posteo.path}";
|
2024-03-14 22:31:55 +01:00
|
|
|
himalaya = {
|
|
|
|
|
enable = true;
|
2024-06-03 07:27:01 +02:00
|
|
|
settings.backend = "imap";
|
2024-03-14 22:31:55 +01:00
|
|
|
};
|
2024-04-28 13:24:27 +02:00
|
|
|
aerc.extraAccounts.pgp-key-id = "9EDE82CC72A343A95266D0F444857074A3ACC8B7";
|
2023-02-21 11:57:26 +01:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2024-03-14 22:31:55 +01:00
|
|
|
programs.himalaya.enable = true;
|
2023-02-21 11:57:26 +01:00
|
|
|
|
2023-09-28 17:54:20 +02:00
|
|
|
programs.thunderbird = {
|
|
|
|
|
enable = true;
|
|
|
|
|
settings = {
|
|
|
|
|
};
|
2025-12-25 14:00:03 +01:00
|
|
|
profiles.${pkgs.lib.niveum.email.thunderbirdProfile} = {
|
2023-09-28 17:54:20 +02:00
|
|
|
isDefault = true;
|
|
|
|
|
settings = {
|
|
|
|
|
"mail.default_send_format" = 1;
|
|
|
|
|
"msgcompose.default_colors" = false;
|
|
|
|
|
"msgcompose.text_color" = config.lib.stylix.colors.withHashtag.base00;
|
|
|
|
|
"msgcompose.background_color" = config.lib.stylix.colors.withHashtag.base05;
|
|
|
|
|
};
|
2025-12-25 08:33:18 +01:00
|
|
|
userChrome = '''';
|
|
|
|
|
userContent = '''';
|
2023-09-28 17:54:20 +02:00
|
|
|
withExternalGnupg = false;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2023-02-21 11:57:26 +01:00
|
|
|
programs.aerc = {
|
|
|
|
|
enable = true;
|
|
|
|
|
|
|
|
|
|
extraBinds = {
|
|
|
|
|
# Binds are of the form <key sequence> = <command to run>
|
|
|
|
|
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
|
|
|
|
|
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
|
|
|
|
|
global = {
|
|
|
|
|
"<C-p>" = ":prev-tab<Enter>";
|
|
|
|
|
"<C-n>" = ":next-tab <Enter>";
|
|
|
|
|
"<C-t>" = ":term<Enter>";
|
|
|
|
|
"?" = ":help keys<Enter>";
|
|
|
|
|
};
|
|
|
|
|
messages = {
|
|
|
|
|
q = ":quit<Enter>";
|
|
|
|
|
j = ":next <Enter>";
|
|
|
|
|
"<Down>" = ":next<Enter>";
|
|
|
|
|
"<C-d>" = ":next 50%<Enter>";
|
|
|
|
|
"<C-f>" = ":next 100%<Enter>";
|
|
|
|
|
"<PgDn>" = ":next 100%<Enter>";
|
|
|
|
|
k = ":prev <Enter>";
|
|
|
|
|
"<Up>" = ":prev<Enter>";
|
|
|
|
|
"<C-u>" = ":prev 50%<Enter>";
|
|
|
|
|
"<C-b>" = ":prev 100%<Enter>";
|
|
|
|
|
"<PgUp>" = ":prev 100%<Enter>";
|
|
|
|
|
g = ":select 0 <Enter>";
|
|
|
|
|
G = ":select -1<Enter>";
|
|
|
|
|
J = ":next-folder <Enter>";
|
|
|
|
|
K = ":prev-folder<Enter>";
|
|
|
|
|
H = ":collapse-folder<Enter>";
|
|
|
|
|
L = ":expand-folder<Enter>";
|
2023-02-21 22:29:41 +01:00
|
|
|
"<space>" = ":read -t<Enter>:next<Enter>";
|
2023-02-21 11:57:26 +01:00
|
|
|
v = ":mark -t<Enter>";
|
|
|
|
|
V = ":mark -v<Enter>";
|
|
|
|
|
F = ":flag -t<Enter>";
|
|
|
|
|
T = ":toggle-threads<Enter>";
|
|
|
|
|
"<Enter>" = ":view<Enter>";
|
|
|
|
|
d = ":prompt 'Delete? ' 'delete-message'<Enter>";
|
|
|
|
|
D = ":move Trash<Enter>";
|
|
|
|
|
A = ":archive flat<Enter>";
|
|
|
|
|
C = ":compose<Enter>";
|
|
|
|
|
rr = ":reply -a<Enter>";
|
|
|
|
|
rq = ":reply -aq<Enter>";
|
|
|
|
|
Rr = ":reply<Enter>";
|
|
|
|
|
Rq = ":reply -q<Enter>";
|
|
|
|
|
c = ":cf<space>";
|
|
|
|
|
"$" = ":term<space>";
|
|
|
|
|
"!" = ":term<space>";
|
|
|
|
|
"|" = ":pipe<space>";
|
|
|
|
|
"/" = ":search<space>";
|
|
|
|
|
"\\" = ":filter <space>";
|
|
|
|
|
n = ":next-result<Enter>";
|
|
|
|
|
N = ":prev-result<Enter>";
|
|
|
|
|
"<Esc>" = ":clear<Enter>";
|
|
|
|
|
"*" = ":filter -x Flagged<Enter>";
|
|
|
|
|
};
|
|
|
|
|
view = {
|
2025-12-25 14:00:03 +01:00
|
|
|
tr = ":pipe ${pkgs.trans}/bin/trans -show-original n -b -no-autocorrect<Enter>"; # https://man.sr.ht/~rjarry/aerc/integrations/translator.md
|
2023-02-21 11:57:26 +01:00
|
|
|
"/" = ":toggle-key-passthrough <Enter> /";
|
|
|
|
|
q = ":close<Enter>";
|
|
|
|
|
O = ":open<Enter>";
|
|
|
|
|
S = ":save<space>";
|
|
|
|
|
"|" = ":pipe<space>";
|
|
|
|
|
D = ":move Trash<Enter>";
|
|
|
|
|
A = ":archive flat<Enter>";
|
|
|
|
|
"<C-l>" = ":open-link <space>";
|
|
|
|
|
f = ":forward <Enter>";
|
|
|
|
|
rr = ":reply -a<Enter>";
|
|
|
|
|
rq = ":reply -aq<Enter>";
|
|
|
|
|
Rr = ":reply<Enter>";
|
|
|
|
|
Rq = ":reply -q<Enter>";
|
|
|
|
|
H = ":toggle-headers<Enter>";
|
|
|
|
|
"<C-k>" = ":prev-part<Enter>";
|
|
|
|
|
"<C-j>" = ":next-part<Enter>";
|
|
|
|
|
J = ":next <Enter>";
|
|
|
|
|
K = ":prev<Enter>";
|
|
|
|
|
};
|
|
|
|
|
"view::passthrough" = {
|
|
|
|
|
"$noinherit" = "true";
|
|
|
|
|
"$ex" = "<C-x>";
|
|
|
|
|
"<Esc>" = ":toggle-key-passthrough<Enter>";
|
|
|
|
|
};
|
|
|
|
|
compose = {
|
|
|
|
|
# Keybindings used when the embedded terminal is not selected in the compose
|
|
|
|
|
# view
|
|
|
|
|
"$noinherit" = "true";
|
|
|
|
|
"$ex" = "<C-x>";
|
|
|
|
|
"<C-k>" = ":prev-field<Enter>";
|
|
|
|
|
"<C-j>" = ":next-field<Enter>";
|
|
|
|
|
"<tab>" = ":next-field<Enter>";
|
|
|
|
|
"<C-p>" = ":prev-tab<Enter>";
|
|
|
|
|
"<C-n>" = ":next-tab<Enter>";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
"compose::editor" = {
|
|
|
|
|
# Keybindings used when the embedded terminal is selected in the compose view
|
|
|
|
|
"$noinherit" = "true";
|
|
|
|
|
"$ex" = "<C-x>";
|
|
|
|
|
"<C-k>" = ":prev-field<Enter>";
|
|
|
|
|
"<C-j>" = ":next-field<Enter>";
|
|
|
|
|
"<C-p>" = ":prev-tab<Enter>";
|
|
|
|
|
"<C-n>" = ":next-tab<Enter>";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
"compose::review" = {
|
|
|
|
|
# Keybindings used when reviewing a message to be sent
|
|
|
|
|
y = ":send <Enter>";
|
|
|
|
|
n = ":abort<Enter>";
|
|
|
|
|
p = ":postpone<Enter>";
|
|
|
|
|
q = ":choose -o d discard abort -o p postpone postpone<Enter>";
|
|
|
|
|
e = ":edit<Enter>";
|
|
|
|
|
a = ":attach<space>";
|
|
|
|
|
d = ":detach<space>";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
terminal = {
|
|
|
|
|
"$noinherit" = "true";
|
|
|
|
|
"$ex" = "<C-x>";
|
|
|
|
|
"<C-p>" = ":prev-tab<Enter>";
|
|
|
|
|
"<C-n>" = ":next-tab<Enter>";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extraConfig = {
|
|
|
|
|
ui.sort = "-r date";
|
|
|
|
|
ui.timestamp-format = "2006-01-02 15:04";
|
|
|
|
|
ui.mouse-enabled = true;
|
|
|
|
|
ui.spinner = ". , .";
|
|
|
|
|
general.unsafe-accounts-conf = true;
|
|
|
|
|
general.pgp-provider = "gpg";
|
2025-12-25 08:33:18 +01:00
|
|
|
viewer = {
|
|
|
|
|
pager = "${pkgs.less}/bin/less -R";
|
|
|
|
|
};
|
2023-02-21 11:57:26 +01:00
|
|
|
compose = {
|
2023-10-04 19:13:50 +02:00
|
|
|
# address-book-cmd = "khard email --remove-first-line --parsable '%s'";
|
2023-10-17 12:34:47 +02:00
|
|
|
no-attachment-warning = "(attach|attached|attachments?|anbei|Anhang|angehängt|beigefügt)";
|
2023-02-21 11:57:26 +01:00
|
|
|
};
|
|
|
|
|
filters = {
|
2023-12-08 19:01:09 +01:00
|
|
|
"text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
|
|
|
|
"text/calendar" = "${pkgs.aerc}/libexec/aerc/filters/calendar";
|
|
|
|
|
"text/html" = "${pkgs.aerc}/libexec/aerc/filters/html"; # Requires w3m, dante
|
2023-02-21 11:57:26 +01:00
|
|
|
# "text/html" =
|
|
|
|
|
# "${pkgs.aerc}/share/aerc/filters/html | ${pkgs.aerc}/share/aerc/filters/colorize";
|
|
|
|
|
# "text/*" =
|
2023-07-26 07:38:52 +02:00
|
|
|
# ''${pkgs.bat}/bin/bat -fP --theme=ansi --file-name="$AERC_FILENAME "'';
|
2023-12-08 19:01:09 +01:00
|
|
|
"message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
|
|
|
|
"message/rfc822" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
|
2023-02-21 11:57:26 +01:00
|
|
|
"application/x-sh" = "${pkgs.bat}/bin/bat -fP -l sh";
|
|
|
|
|
};
|
2025-12-25 08:33:18 +01:00
|
|
|
openers =
|
|
|
|
|
let
|
|
|
|
|
as-pdf = pkgs.writers.writeDash "as-pdf" ''
|
2025-12-27 07:29:47 +01:00
|
|
|
d=$(mktemp -p "$XDG_RUNTIME_DIR" -d)
|
2025-12-25 08:33:18 +01:00
|
|
|
trap clean EXIT
|
|
|
|
|
clean() {
|
|
|
|
|
rm -rf "$d"
|
|
|
|
|
}
|
|
|
|
|
${pkgs.libreoffice}/bin/libreoffice --headless --convert-to pdf "$1" --outdir "$d"
|
|
|
|
|
${pkgs.zathura}/bin/zathura "$d"/*.pdf
|
|
|
|
|
'';
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
"image/*" = "${pkgs.nsxiv}/bin/nsxiv";
|
|
|
|
|
"application/pdf" = "${pkgs.zathura}/bin/zathura";
|
|
|
|
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" = toString as-pdf;
|
|
|
|
|
"application/vnd.oasis.opendocument.text" = toString as-pdf;
|
|
|
|
|
"video/*" = "${pkgs.mpv}/bin/mpv";
|
|
|
|
|
"audio/*" = "${pkgs.mpv}/bin/mpv";
|
|
|
|
|
};
|
2023-02-21 11:57:26 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
templates = {
|
|
|
|
|
# new_message = "hello!";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|