{ config, pkgs, lib, ... }: let passcmd = id: "${pkgs.pass}/bin/pass ${id}"; ticks = "''"; in { # Maildir <-> Server communication # -------------------------------- # mbsync: MailDir <-> IMAP # msmtp: sendmail interface sending mails through your provider. # client backend # -------------- # notmuch: Tagdatabase for Emails # muchsync: notmuch database synctool # clients # ------- # neomutt home-manager.users.mainUser.accounts.email.accounts = { palo_van_dalo-gmx = { primary = false; address = "palo_van_dalo@gmx.de"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "palo_van_dalo@gmx.de"; passwordCommand = passcmd "mail/gmx/palo_van_dalo@gmx.de"; smtp = { host = "smtp.gmx.net"; port = 465; }; notmuch.enable = true; msmtp = { enable = true; }; }; ingolf-wagner-gmx = { primary = false; address = "ingolf.wagner@gmx.de"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "ingolf.wagner@gmx.de"; passwordCommand = passcmd "mail/gmx/ingolf.wagner@gmx.de"; smtp = { host = "smtp.gmx.net"; port = 465; }; notmuch.enable = true; msmtp = { enable = true; }; }; pali_palo = { primary = false; address = "pali_palo@web.de"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "pali_palo@web.de"; passwordCommand = passcmd "mail/web.de/pali_palo@web.de"; smtp = { host = "smtp.web.de"; port = 465; }; notmuch.enable = true; msmtp = { enable = true; # msmtp --serverinfo --tls --tls-certcheck=off -a gmail # tls.fingerprint = "77:2F:E1:F0:1C:9C:00:45:36:D5:0B:25:17:76:AC:7F:0E:79:68:27:8C:E9:E1:F6:BD:DF:F1:6F:1E:8C:85:18"; # tls.fingerprint = "3F:B7:F9:7A:AC:9C:D7:C4:2E:8A:C1:F9:90:B5:D7:D1:8E:E2:F7:7D:9D:DB:FA:01:55:27:D2:79:5F:F8:C1:64"; }; }; gmail = { # for google accounts you have to allow 'less secure apps' in accounts.google.com primary = true; address = "palipalo9@googlemail.com"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "palipalo9@googlemail.com"; passwordCommand = passcmd "mail/gmail/palipalo9@googlemail.com"; smtp = { host = "smtp.gmail.com"; port = 465; }; notmuch.enable = true; msmtp = { enable = true; # msmtp --serverinfo --tls --tls-certcheck=off -a gmail # tls.fingerprint = "77:2F:E1:F0:1C:9C:00:45:36:D5:0B:25:17:76:AC:7F:0E:79:68:27:8C:E9:E1:F6:BD:DF:F1:6F:1E:8C:85:18"; # tls.fingerprint = "3F:B7:F9:7A:AC:9C:D7:C4:2E:8A:C1:F9:90:B5:D7:D1:8E:E2:F7:7D:9D:DB:FA:01:55:27:D2:79:5F:F8:C1:64"; }; gpg = { encryptByDefault = true; signByDefault = true; key = "42AC51C9482D0834CF488AF1389EC2D64AC71EAC"; }; }; ingolf-wagner = { primary = false; address = "contact@ingolf-wagner.de"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "contact@ingolf-wagner.de"; passwordCommand = passcmd "mail/siteground/contact@ingolf-wagner.de"; notmuch.enable = true; smtp = { host = "securees5.sgcpanel.com"; port = 587; tls.useStartTls = true; }; msmtp = { enable = true; # msmtp --serverinfo --tls --tls-certcheck=off -a ingolf-wagner tls.fingerprint = "79:7C:A8:AB:B9:70:02:DC:18:A5:25:10:BC:0B:8D:84:01:9F:57:D3:1C:FE:4C:7D:8B:54:00:7A:94:C7:D2:46"; }; gpg = { encryptByDefault = true; signByDefault = true; key = "42AC51C9482D0834CF488AF1389EC2D64AC71EAC"; }; }; gaykraft = { primary = false; address = "root@gaykraft.com"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "root@gaykraft.com"; passwordCommand = "mail/gaykraft.com/root@gaykraft.com"; mbsync = { enable = true; create = "both"; }; smtp = { host = "mail.gaykraft.com"; port = 587; tls.useStartTls = true; }; msmtp = { enable = true; # msmtp --serverinfo --tls --tls-certcheck=off -a gaykraft tls.fingerprint = "08:42:73:72:3E:68:7D:55:89:7A:30:02:4B:CD:30:35:F1:6D:3E:7A:DD:A8:B6:84:67:25:37:F0:4F:7F:86:FE"; }; notmuch.enable = true; }; c-base = { primary = false; address = "palo@c-base.org"; aliases = [ ]; realName = "Ingolf Wagner"; userName = "palo"; passwordCommand = passcmd "mail/c-base/palo@c-base.org"; smtp = { host = "c-mail.c-base.org"; port = 465; }; notmuch.enable = true; msmtp = { enable = true; # msmtp --serverinfo --tls --tls-certcheck=off -a c-base tls.fingerprint = "9C:82:3B:0F:31:CE:1B:8E:96:00:CC:C9:FF:E7:BE:66:95:92:4F:22:DD:D6:2E:0E:1D:90:76:BE:8E:9E:8E:16"; }; gpg = { encryptByDefault = true; signByDefault = true; key = "42AC51C9482D0834CF488AF1389EC2D64AC71EAC"; }; }; }; # install mail programs home-manager.users.mainUser.programs.msmtp.enable = true; home-manager.users.mainUser.programs.notmuch.enable = true; # enable html emails home-manager.users.mainUser.home.file.".mailcap".text = '' text/html; ${pkgs.elinks}/bin/elinks -dump ; copiousoutput; ''; home-manager.users.mainUser.home.file.".muttrc".text = let index_format = pkgs.writers.writeDash "index_format" '' # http://www.mutt.org/doc/manual/#formatstrings recipent="$(echo $1 | sed 's/[^,]*<\([^>]*\)[^,]*/ \1/g')" echo "%4C %Z %?GI?%GI& ? %[%y-%m-%d %H:%M] %-20.20a %?M?(%3M)& ? %s %> $recipent %?g?%g?%" ''; in '' # gpg set crypt_use_gpgme=yes set crypt_autosign=yes set crypt_verify_sig=yes set crypt_replysign=yes set crypt_replyencrypt=yes set crypt_replysignencrypted=yes # mutt is not smart enough to see if I have a key or not #set crypt_autoencrypt = yes set pgp_check_gpg_decrypt_status_fd set pgp_use_gpg_agent = yes set pgp_self_encrypt = yes # needs default key set pgp_default_key = 42AC51C9482D0834CF488AF1389EC2D64AC71EAC # read html mails auto_view text/html set mailcap_path = ~/.mailcap # notmuch set nm_default_uri="notmuch://$HOME/Maildir" # path to the maildir set nm_record = yes set nm_record_tags = "-inbox me archive" set virtual_spoolfile=yes # enable virtual folders set sendmail=${ pkgs.writers.writeBash "msmtp" '' ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert --create-folder +sent) | \ ${pkgs.msmtp}/bin/msmtpq "$@" '' } set from="contact@ingolf-wagner.de" #alternates ^.*@ingolf-wagner\.de$ ^.*@.*\.r$ set use_from=yes set envelope_from=yes set reverse_name set sort=threads set index_format="${index_format} %r |" virtual-mailboxes "INBOX" "notmuch://?query=(tag:inbox or (tag:sent and not tag:archive)) AND NOT tag:discourse AND NOT tag:muted AND NOT tag:list AND NOT tag:fraud AND NOT tag:junk" virtual-mailboxes "Unread" "notmuch://?query=(tag:unread AND NOT tag:muted)" virtual-mailboxes "Space left" "notmuch://?query=((tag:spaceleft OR tag:space-lef) AND NOT tag:muted)" virtual-mailboxes "Sononym" "notmuch://?query=(tag:sononym AND NOT tag:muted)" virtual-mailboxes "c-base" "notmuch://?query=(tag:cbase AND NOT tag:muted)" virtual-mailboxes "shopping" "notmuch://?query=((tag:billing OR tag:shopping) AND NOT tag:muted)" virtual-mailboxes "Immobilien" "notmuch://?query=(tag:immobilien AND NOT tag:muted)" virtual-mailboxes "NixOS Github" "notmuch://?query=(tag:github AND tag:nixos AND NOT tag:muted)" virtual-mailboxes "Discourse.all" "notmuch://?query=(tag:discourse AND NOT tag:muted)" virtual-mailboxes "Discourse.development" "notmuch://?query=(tag:discourse AND tag:development AND NOT tag:muted)" virtual-mailboxes "Discourse.announcements" "notmuch://?query=(tag:discourse AND tag:announcements AND NOT tag:muted)" virtual-mailboxes "Discourse.links" "notmuch://?query=(tag:discourse AND tag:links AND NOT tag:muted)" virtual-mailboxes "Discourse.games" "notmuch://?query=(tag:discourse AND tag:games AND NOT tag:muted)" virtual-mailboxes "Discourse.meta" "notmuch://?query=(tag:discourse AND tag:meta AND NOT tag:muted)" virtual-mailboxes "Discourse.events" "notmuch://?query=(tag:discourse AND tag:events AND NOT tag:muted)" virtual-mailboxes "Flagged" "notmuch://?query=tag:flagged" virtual-mailboxes "Archive" "notmuch://?query=tag:archive" virtual-mailboxes "Sent" "notmuch://?query=tag:sent" virtual-mailboxes "Fraud" "notmuch://?query=(tag:fraud)" virtual-mailboxes "Junk" "notmuch://?query=(tag:junk)" virtual-mailboxes "All" "notmuch://?query=*" tag-transforms "junk" "k" \ "unread" "u" \ "replied" "↻" \ # notmuch bindings bind index \\\\ noop bind pager \\ noop bind pager \\\\ noop macro index \\\\ "" # looks up a hand made query macro pager \\\\ "" # looks up a hand made query macro index + "+flagged\n" # tag as starred macro pager + "+flagged\n" # tag as starred macro index ! "+flagged\n" # tag as starred macro pager ! "+flagged\n" # tag as starred macro index - "-flagged\n" # tag as unstarred macro pager - "-flagged\n" # tag as unstarred # Address Book # ------------ set query_command="${pkgs.notmuch-addrlookup}/bin/notmuch-addrlookup --mutt '%s'" # keys bindings # ------------- bind index d noop bind index D noop bind pager d noop bind pager D noop macro index D "-inbox -unread +deleted\n" # tag as deleted mail macro index d "-deleted\n" # tag as deleted mail macro pager D "-inbox -unread +deleted\n" # tag as deleted mail macro pager d "-deleted\n" # tag as deleted mail bind index S noop bind index s noop bind pager S noop bind pager s noop macro index S "-inbox -unread +junk\n" # tag as junk mail macro index s "-junk\n" # tag as junk mail macro pager S "-inbox -unread +junk\n" # tag as junk mail macro pager s "-junk\n" # tag as junk mail bind index r noop bind index R noop bind pager r noop bind pager R noop macro index r "" # reply to all macro index R "" # reply macro pager r "" # reply to all macro pager R "" # reply bind index A noop bind index a noop bind pager A noop bind pager a noop macro index A "+archive -unread -inbox\n" # tag as Archived macro index a "-archive\n" # tag as Archived macro pager A "+archive -unread -inbox\n" # tag as Archived macro pager a "-archive\n" # tag as Archived bind index U noop bind index u noop bind pager U noop bind pager u noop macro index u "+unread\n" macro index U "-unread\n" macro pager u "+unread\n" macro pager U "-unread\n" bind index l noop bind pager l noop macro index l "" # set tags manual macro pager l "" # set tags manual # taskwarrior # ----------- # from https://www.nixternal.com/mark-e-mails-in-mutt-as-tasks-in-taskwarrior/ bind index t noop bind pager t noop bind index T noop bind pager T noop macro index T "${ pkgs.writers.writeDash "mutt2task" '' ${pkgs.taskwarrior}/bin/task add +email scheduled:today E-mail: $( ${pkgs.gnugrep}/bin/grep 'Subject' $* | awk -F: '{print $2}' ) '' }" # top index bar in email view set pager_index_lines=7 # top_index_bar toggle macro pager ,@1 " set pager_index_lines=0; macro pager ] ,@2 'Toggle indexbar" macro pager ,@2 " set pager_index_lines=3; macro pager ] ,@3 'Toggle indexbar" macro pager ,@3 " set pager_index_lines=7; macro pager ] ,@1 'Toggle indexbar" macro pager ] ,@1 'Toggle indexbar # sidebar # ------- set sidebar_width = 20 set sidebar_visible = yes # set to "no" to disable sidebar view at startup color sidebar_new yellow default # sidebar bindings bind index sidebar-prev # got to previous folder in sidebar bind index sidebar-next # got to next folder in sidebar bind index sidebar-open # open selected folder from sidebar # sidebar toggle #macro index,pager ,@) " set sidebar_visible=no; macro index,pager [ ,@( 'Toggle sidebar'" #macro index,pager ,@( " set sidebar_visible=yes; macro index,pager [ ,@) 'Toggle sidebar'" #macro index,pager [ ,@( 'Toggle sidebar' # toggle the sidebar ''; environment.systemPackages = let mailSync = pkgs.writers.writeDashBin "mail-sync" '' ${pkgs.muchsync}/bin/muchsync mailfetcher@workhorse.private --nonew ''; mailSend = pkgs.writers.writeDashBin "mail-send" '' ${pkgs.msmtp}/bin/msmtp-queue -r ''; mailView = pkgs.writers.writeDashBin "mail-view" '' ${pkgs.neomutt}/bin/neomutt"$@" ''; mutt = pkgs.writers.writeDashBin "mutt" '' ${pkgs.neomutt}/bin/neomutt"$@" ''; mail = pkgs.writers.writeDashBin "mail" '' ${mailSync}/bin/mail-sync ${mailView}/bin/mail-view ${mailSend}/bin/mail-send ${mailSync}/bin/mail-sync ''; mailDelete = let notmuch = "${pkgs.notmuch}/bin/notmuch"; in pkgs.writers.writeBashBin "mail-delete" '' set -efu set -o pipefail if ! ${notmuch} search --exclude=false tag:deleted | tac ; then echo 'No killed mail.' exit 1 fi printf 'want do rm this mail? \[y/N\] ' read REPLY case "$REPLY" in y|Y) :;; # continue *) echo 'abort.' exit 2 ;; esac ${notmuch} search --output=files --exclude=false tag:deleted | while read line; do rm -v "$line" ; done ${notmuch} new ''; in [ pkgs.notmuch pkgs.muchsync mail mailSync mailView mailSend pkgs.neomutt mutt mailDelete ]; }