1{ 2 pkgs, 3 config, 4 lib, 5 ... 6}: 7 8let 9 address-book = pkgs.writeScriptBin "address-book" '' 10 #!/usr/bin/env bash 11 ${pkgs.mu}/bin/mu cfind "$1" | sed -E 's/(.*) (.*@.*)/\2\t\1/' 12 ${pkgs.ugrep}/bin/ugrep -jPh -m 100 --color=never "$1" cat ${config.accounts.email.maildirBasePath}/addressbook/cam-ldap) 13 ''; 14 sync-mail = pkgs.writeScriptBin "sync-mail" '' 15 ${pkgs.isync}/bin/mbsync "$@" || exit 1 16 ${pkgs.procps}/bin/pkill -2 -x mu 17 ${pkgs.coreutils}/bin/sleep 1 18 ${pkgs.mu}/bin/mu index 19 ''; 20 cfg = config.custom.mail; 21in 22{ 23 options.custom.mail.enable = lib.mkEnableOption "mail"; 24 25 config = lib.mkIf cfg.enable { 26 home.packages = with pkgs; [ 27 (pkgs.writeScriptBin "cam-ldap-addr" '' 28 ${pkgs.openldap}/bin/ldapsearch -xZ -H ldaps://ldap.lookup.cam.ac.uk -b "ou=people,o=University of Cambridge,dc=cam,dc=ac,dc=uk" displayName mail\ 29 | ${pkgs.gawk}/bin/awk '/^dn:/{displayName=""; mail=""; next} /^displayName:/{displayName=$2; for(i=3;i<=NF;i++) displayName=displayName " " $i; next} /^mail:/{mail=$2; next} /^$/{if(displayName!="" && mail!="") print mail "\t" displayName}'\ 30 > ${config.accounts.email.maildirBasePath}/addressbook/cam-ldap 31 '') 32 address-book 33 sync-mail 34 ]; 35 36 programs = { 37 password-store.enable = true; 38 gpg.enable = true; 39 mbsync.enable = true; 40 mu.enable = true; 41 msmtp.enable = true; 42 aerc = { 43 # enable = true; 44 extraConfig = { 45 general.unsafe-accounts-conf = true; 46 general.default-save-path = "~/downloads"; 47 ui.mouse-enabled = true; 48 compose.address-book-cmd = "${address-book}/bin/address-book '%s'"; 49 compose.file-picker-cmd = "${pkgs.ranger}/bin/ranger --choosefiles=%f"; 50 compose.format-flowed = true; 51 ui.index-columns = "date<=,name<50,flags>=,subject<*"; 52 ui.column-name = "{{index (.From | persons) 0}}"; 53 "ui:folder=Sent".index-columns = "date<=,to<50,flags>=,subject<*"; 54 "ui:folder=Sent".column-to = "{{index (.To | persons) 0}}"; 55 openers."text/html" = "firefox --new-window"; 56 hooks.mail-recieved = ''notify-send "[$AERC_ACCOUNT/$AERC_FOLDER] mail from $AERC_FROM_NAME" "$AERC_SUBJECT"''; 57 filters = { 58 "text/plain" = "wrap -w 90 | colorize"; 59 "text/calendar" = "calendar"; 60 "application/ics" = "calendar"; 61 "message/delivery-status" = "colorize"; 62 "message/rfc822" = "colorize"; 63 "text/html" = "html | colorize"; 64 }; 65 }; 66 extraBinds = import ./aerc-binds.nix { inherit pkgs; }; 67 }; 68 neomutt = { 69 # enable = true; 70 extraConfig = '' 71 # Macro to switch accounts 72 macro index,pager <F1> '"<change-folder> ${config.accounts.email.maildirBasePath}/ryan@freumh.org/Inbox<enter>"' 73 macro index,pager <F2> '"<change-folder> ${config.accounts.email.maildirBasePath}/ryangibb321@gmail.com/Inbox<enter>"' 74 macro index,pager <F3> '"<change-folder> ${config.accounts.email.maildirBasePath}/ryan.gibb@cl.cam.ac.uk/Inbox<enter>"' 75 76 # mutt macros for mu 77 macro index <F8> "<shell-escape>mu find --clearlinks --format=links --linksdir=${config.accounts.email.maildirBasePath}/search " \ 78 "mu find" 79 macro index <F9> "<change-folder-readonly>˜/Maildir/search" \ 80 "mu find results" 81 ''; 82 }; 83 }; 84 85 services = { 86 imapnotify.enable = true; 87 gpg-agent.enable = true; 88 }; 89 90 accounts.email = { 91 maildirBasePath = "mail"; 92 accounts = { 93 "ryan@freumh.org" = rec { 94 primary = true; 95 realName = "Ryan Gibb"; 96 userName = "ryan@freumh.org"; 97 address = "ryan@freumh.org"; 98 passwordCommand = "${pkgs.pass}/bin/pass show email/ryan@freumh.org"; 99 imap.host = "mail.freumh.org"; 100 smtp = { 101 host = "mail.freumh.org"; 102 port = 465; 103 }; 104 folders = { 105 drafts = "Drafts"; 106 inbox = "Inbox"; 107 sent = "Sent"; 108 trash = "Trash"; 109 }; 110 imapnotify = { 111 enable = true; 112 boxes = [ "Inbox" ]; 113 onNotify = "${sync-mail}/bin/sync-mail ryan@freumh.org:INBOX"; 114 }; 115 mbsync = { 116 enable = true; 117 create = "both"; 118 expunge = "both"; 119 remove = "both"; 120 }; 121 msmtp = { 122 enable = true; 123 }; 124 aerc = { 125 enable = true; 126 extraAccounts = { 127 check-mail-cmd = "${sync-mail}/bin/sync-mail ryan@freumh.org"; 128 check-mail-timeout = "1m"; 129 check-mail = "1h"; 130 folders-sort = [ 131 "Inbox" 132 "Sent" 133 "Drafts" 134 "Archive" 135 "Spam" 136 "Trash" 137 ]; 138 folder-map = "${pkgs.writeText "folder-map" '' 139 Spam = Junk 140 Bin = Trash 141 ''}"; 142 }; 143 }; 144 neomutt = { 145 enable = true; 146 extraConfig = '' 147 bind index g noop 148 macro index gi "<change-folder>=${folders.inbox}<enter>" 149 macro index gs "<change-folder>=${folders.sent}<enter>" 150 macro index gd "<change-folder>=${folders.drafts}<enter>" 151 macro index gt "<change-folder>=${folders.trash}<enter>" 152 ''; 153 }; 154 }; 155 "misc@freumh.org" = rec { 156 userName = "misc@freumh.org"; 157 address = "misc@freumh.org"; 158 realName = "Misc"; 159 passwordCommand = "${pkgs.pass}/bin/pass show email/misc@freumh.org"; 160 imap.host = "mail.freumh.org"; 161 smtp = { 162 host = "mail.freumh.org"; 163 port = 465; 164 }; 165 folders = { 166 drafts = "Drafts"; 167 inbox = "Inbox"; 168 sent = "Sent"; 169 trash = "Bin"; 170 }; 171 imapnotify = { 172 enable = true; 173 boxes = [ "Inbox" ]; 174 onNotify = "${sync-mail}/bin/sync-mail misc@freumh.org:INBOX"; 175 }; 176 mbsync = { 177 enable = true; 178 create = "both"; 179 expunge = "both"; 180 remove = "both"; 181 }; 182 msmtp = { 183 enable = true; 184 }; 185 neomutt = { 186 enable = true; 187 extraConfig = '' 188 bind index g noop 189 macro index gi "<change-folder>=${folders.inbox}<enter>" 190 macro index gs "<change-folder>=${folders.sent}<enter>" 191 macro index gd "<change-folder>=${folders.drafts}<enter>" 192 macro index gt "<change-folder>=${folders.trash}<enter>" 193 ''; 194 }; 195 }; 196 "ryan.gibb@cl.cam.ac.uk" = rec { 197 userName = "rtg24@fm.cl.cam.ac.uk"; 198 address = "ryan.gibb@cl.cam.ac.uk"; 199 realName = "Ryan Gibb"; 200 passwordCommand = "${pkgs.pass}/bin/pass show email/ryan.gibb@cl.cam.ac.uk"; 201 flavor = "fastmail.com"; 202 folders = { 203 drafts = "Drafts"; 204 inbox = "Inbox"; 205 sent = "Sent"; 206 trash = "Trash"; 207 }; 208 imapnotify = { 209 enable = true; 210 boxes = [ 211 "Inbox" 212 "Sidebox" 213 ]; 214 onNotify = "${sync-mail}/bin/sync-mail ryan.gibb@cl.cam.ac.uk:INBOX ryan.gibb@cl.cam.ac.uk:Sidebox"; 215 }; 216 mbsync = { 217 enable = true; 218 create = "both"; 219 expunge = "both"; 220 remove = "both"; 221 }; 222 msmtp = { 223 enable = true; 224 }; 225 aerc = { 226 enable = true; 227 extraAccounts = { 228 check-mail-cmd = "${sync-mail}/bin/sync-mail ryan.gibb@cl.cam.ac.uk"; 229 check-mail-timeout = "1m"; 230 check-mail = "1h"; 231 aliases = "rtg24@cam.ac.uk"; 232 folders-sort = [ 233 "Inbox" 234 "Sidebox" 235 "Sent" 236 "Drafts" 237 "Archive" 238 "Spam" 239 "Trash" 240 ]; 241 folder-map = "${pkgs.writeText "folder-map" '' 242 Bin = Trash 243 ''}"; 244 }; 245 }; 246 neomutt = { 247 enable = true; 248 extraConfig = '' 249 bind index g noop 250 macro index gi "<change-folder>=${folders.inbox}<enter>" 251 macro index gs "<change-folder>=${folders.sent}<enter>" 252 macro index gd "<change-folder>=${folders.drafts}<enter>" 253 macro index gt "<change-folder>=${folders.trash}<enter>" 254 ''; 255 }; 256 }; 257 "ryangibb321@gmail.com" = rec { 258 userName = "ryangibb321@gmail.com"; 259 address = "ryangibb321@gmail.com"; 260 realName = "Ryan Gibb"; 261 passwordCommand = "${pkgs.pass}/bin/pass show email/ryangibb321@gmail.com"; 262 flavor = "gmail.com"; 263 folders = { 264 drafts = "Drafts"; 265 inbox = "Inbox"; 266 sent = "Sent Mail"; 267 trash = "Bin"; 268 }; 269 imapnotify = { 270 enable = true; 271 boxes = [ 272 "Inbox" 273 "Sidebox" 274 ]; 275 onNotify = "${sync-mail}/bin/sync-mail ryangibb321@gmail.com:INBOX ryangibb321@gmail.com:Sidebox"; 276 }; 277 mbsync = { 278 enable = true; 279 create = "both"; 280 expunge = "both"; 281 remove = "both"; 282 }; 283 msmtp = { 284 enable = true; 285 }; 286 aerc = { 287 enable = true; 288 extraAccounts = { 289 check-mail-cmd = "${sync-mail}/bin/sync-mail ryangibb321@gmail.com"; 290 check-mail-timeout = "1m"; 291 check-mail = "1h"; 292 folders-sort = [ 293 "Inbox" 294 "Sidebox" 295 "[Gmail]/Sent Mail" 296 "[Gmail]/Drafts" 297 "[Gmail]/All Mail" 298 "[Gmail]/Spam" 299 "[Gmail]/Trash" 300 ]; 301 copy-to = "'[Gmail]/Sent Mail'"; 302 archive = "'[Gmail]/All Mail'"; 303 postpone = "[Gmail]/Drafts"; 304 }; 305 }; 306 neomutt = { 307 enable = true; 308 extraConfig = '' 309 bind index g noop 310 macro index gi "<change-folder>=${folders.inbox}<enter>" 311 macro index gs "<change-folder>=${folders.sent}<enter>" 312 macro index gd "<change-folder>=${folders.drafts}<enter>" 313 macro index gt "<change-folder>=${folders.trash}<enter>" 314 ''; 315 }; 316 }; 317 search = { 318 maildir.path = "search"; 319 realName = "Search Index"; 320 address = "search@local"; 321 aerc.enable = true; 322 aerc.extraAccounts = { 323 source = "maildir://~/mail/search"; 324 }; 325 aerc.extraConfig = { 326 ui = { 327 index-columns = "flags>4,date<*,to<30,name<30,subject<*"; 328 column-to = "{{(index .To 0).Address}}"; 329 }; 330 }; 331 }; 332 }; 333 }; 334 }; 335}