This repository has no description
8.5 kB
223 lines
1{ self, ... }:
2{
3 perSystem =
4 {
5 pkgs,
6 lib,
7 system,
8 ...
9 }:
10 {
11 packages.mutt =
12 let
13 # Mailboxes configuration from mail.nix
14 mailboxes = self.packages.${system}.notmuch.mailboxes;
15 notmuchConfig = self.packages.${system}.notmuch.passthru.config.configFile.path;
16
17 mailcap = pkgs.writeText "mailcap" ''
18 text/html; ${pkgs.elinks}/bin/elinks -dump ; copiousoutput;
19 '';
20
21 msmtprc = pkgs.writeText "msmtprc" ''
22 defaults
23 logfile ~/.msmtp.log
24 account prism
25 host prism.r
26 account c-base
27 from lassulus@c-base.org
28 host c-mail.c-base.org
29 port 465
30 tls on
31 tls_starttls off
32 auth on
33 user lassulus
34 passwordeval pass show c-base/pass
35 account default: prism
36 '';
37
38 msmtp = pkgs.writeShellScriptBin "msmtp" ''
39 # Check if using c-base account (either explicit -a c-base or via From: header)
40 using_cbase=0
41 for arg in "$@"; do
42 if [[ "$arg" == "c-base" ]] || [[ "$arg" =~ @c-base\.org ]]; then
43 using_cbase=1
44 break
45 fi
46 done
47
48 # For c-base account, always send directly (no Tor needed)
49 if [ "$using_cbase" -eq 1 ]; then
50 ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert +sent) | \
51 ${pkgs.msmtp}/bin/msmtp -C ${msmtprc} "$@"
52 # For prism account, check if prism.r is reachable
53 elif ping -W2 -c1 prism.r >/dev/null 2>&1; then
54 ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert +sent) | \
55 ${pkgs.msmtp}/bin/msmtp -C ${msmtprc} "$@"
56 else
57 echo "Error: prism.r is not reachable" >&2
58 exit 1
59 fi
60 '';
61
62 muttrc = pkgs.writeText "muttrc" ''
63 # read html mails
64 auto_view text/html
65 set mailcap_path = ${mailcap}
66
67 # notmuch
68 set folder="$HOME/Maildir"
69 set nm_default_uri = "notmuch://$HOME/Maildir"
70 set nm_record = yes
71 set nm_record_tags = "-inbox me archive"
72 set spoolfile = +Inbox
73 set virtual_spoolfile = yes
74
75 set sendmail="${msmtp}/bin/msmtp"
76 set from="lassulus@lassul.us"
77 alternates ^.*@lassul\.us$ ^.*@.*\.r$
78 unset envelope_from_address
79 set use_envelope_from
80 set reverse_name
81 set markers=no
82
83 set sort=threads
84
85 set index_format="%4C %Z %?GI?%GI& ? %[%y-%m-%d] %-20.20a %?M?(%3M)& ? %s %> %r %g"
86
87 virtual-mailboxes "Unread" "notmuch://?query=tag:unread"
88 virtual-mailboxes "INBOX" "notmuch://?query=tag:inbox"
89 ${lib.concatMapStringsSep "\n" (
90 i: ''${" "}virtual-mailboxes "${i.name}" "notmuch://?query=tag:${i.name}"''
91 ) (lib.mapAttrsToList lib.nameValuePair mailboxes)}
92 virtual-mailboxes "TODO" "notmuch://?query=tag:TODO"
93 virtual-mailboxes "Starred" "notmuch://?query=tag:*"
94 virtual-mailboxes "Archive" "notmuch://?query=tag:archive"
95 virtual-mailboxes "Sent" "notmuch://?query=tag:sent"
96 virtual-mailboxes "Junk" "notmuch://?query=tag:junk"
97 virtual-mailboxes "All" "notmuch://?query=*"
98
99 # clan.lol IMAP
100 set imap_user = "infra@clan.lol"
101 set imap_pass = "`SOPS_AGE_KEY=$(rbw get --folder clan.lol clan-infra --field age-key) nix develop git+https://git.clan.lol/clan/clan-infra -c clan vars get --flake git+https://git.clan.lol/clan/clan-infra web01 infra-mail/infra-password`"
102 set imap_check_subscribed = yes
103 virtual-mailboxes "─── clan-infra ───" "notmuch://?query=tag:nonexistent-separator-tag"
104 mailboxes "imaps://mail.clan.lol"
105
106 tag-transforms "junk" "k" \
107 "unread" "u" \
108 "replied" "↻" \
109 "TODO" "T" \
110
111 # notmuch bindings
112 macro index \\\\ "<vfolder-from-query>"
113 macro index + "<modify-labels>+*\n<sync-mailbox>"
114 macro index - "<modify-labels>-*\n<sync-mailbox>"
115
116 # muchsync
117 bind index \Cr noop
118 macro index \Cr \
119 "<enter-command>unset wait_key<enter> \
120 <sync-mailbox> \
121 <shell-escape>${self.packages.${pkgs.system}.muchsync}/bin/muchsync -vv<enter> \
122 <sync-mailbox>
123
124 #killed
125 bind index d noop
126 bind pager d noop
127
128 bind index S noop
129 bind index s noop
130 bind pager S noop
131 bind pager s noop
132 macro index S "<modify-labels-then-hide>-inbox -unread +junk\n"
133 macro index s "<modify-labels>-junk\n"
134 macro pager S "<modify-labels-then-hide>-inbox -unread +junk\n"
135 macro pager s "<modify-labels>-junk\n"
136
137 bind index A noop
138 bind index a noop
139 bind pager A noop
140 bind pager a noop
141 macro index A "<modify-labels>+archive -unread -inbox\n"
142 macro index a "<modify-labels>-archive\n"
143 macro pager A "<modify-labels>+archive -unread -inbox\n"
144 macro pager a "<modify-labels>-archive\n"
145
146 bind index U noop
147 bind index u noop
148 bind pager U noop
149 bind pager u noop
150 macro index U "<modify-labels>+unread\n"
151 macro index u "<modify-labels>-unread\n"
152 macro pager U "<modify-labels>+unread\n"
153 macro pager u "<modify-labels>-unread\n"
154
155 bind index t noop
156 bind pager t noop
157 macro index t "<modify-labels>"
158
159 # top index bar in email view
160 set pager_index_lines=7
161 # top_index_bar toggle
162 macro pager ,@1 "<enter-command> set pager_index_lines=0; macro pager ] ,@2 'Toggle indexbar<Enter>"
163 macro pager ,@2 "<enter-command> set pager_index_lines=3; macro pager ] ,@3 'Toggle indexbar<Enter>"
164 macro pager ,@3 "<enter-command> set pager_index_lines=7; macro pager ] ,@1 'Toggle indexbar<Enter>"
165 macro pager ] ,@1 'Toggle indexbar
166
167 # scan urls from emails
168 macro index,pager \cb "<pipe-message> ${lib.getExe pkgs.urlscan}<Enter>"
169 macro attach,compose \cb "<pipe-entry> ${lib.getExe pkgs.urlscan}<Enter>"
170
171 # sidebar
172 set sidebar_divider_char = '│'
173 set sidebar_delim_chars = "/"
174 set sidebar_short_path
175 set sidebar_folder_indent
176 set sidebar_visible = yes
177 set sidebar_format = '%D%?F? [%F]?%* %?N?%N/? %?S?%S?'
178 set sidebar_width = 20
179 color sidebar_new yellow red
180
181 # sidebar bindings
182 bind index <left> sidebar-prev
183 bind index <right> sidebar-next
184 bind index <space> sidebar-open
185 # sidebar toggle
186 macro index,pager ,@) "<enter-command> set sidebar_visible=no; macro index,pager [ ,@( 'Toggle sidebar'<Enter>"
187 macro index,pager ,@( "<enter-command> set sidebar_visible=yes; macro index,pager [ ,@) 'Toggle sidebar'<Enter>"
188 macro index,pager [ ,@( 'Toggle sidebar'
189
190 # forward with attachment
191 set mime_forward = no
192 set forward_attachments = yes
193
194 # better handling of long URLs
195 set wrap = 0 # don't wrap lines in the pager
196 set markers = no # don't show + markers for wrapped lines
197 set smart_wrap = yes # wrap at word boundaries when displaying
198 set pager_stop = yes # don't jump to next message at end of pager
199 '';
200
201 in
202 self.wrapLib.makeWrapper {
203 pkgs = pkgs;
204 package = pkgs.neomutt;
205 aliases = [ "mutt" ];
206 runtimeInputs = [
207 pkgs.elinks
208 pkgs.msmtp
209 pkgs.notmuch
210 pkgs.urlscan
211 ]
212 ++ lib.optionals pkgs.stdenv.isLinux [
213 pkgs.iputils
214 ];
215 env = {
216 NOTMUCH_CONFIG = notmuchConfig;
217 };
218 flags = {
219 "-F" = "${muttrc}";
220 };
221 };
222 };
223}