diff --git a/home/mail/common.nix b/home/mail/common.nix index a751791..523e41e 100644 --- a/home/mail/common.nix +++ b/home/mail/common.nix @@ -85,6 +85,7 @@ let tls.enable = true; port = 993; }; + notmuch.enable = true; }; switchAccountMacro = i: x: { @@ -523,12 +524,10 @@ in { ]; }; - #programs.notmuch = { - # enable = true; - # new = { - # tags = ["unread" "inbox"]; - # }; - #}; + programs.notmuch = { + enable = true; + new = { tags = [ "unread" "inbox" ]; }; + }; programs.mbsync.enable = true; programs.msmtp.enable = true; diff --git a/home/mail/mailsync.nix b/home/mail/mailsync.nix index 1710be1..bf22533 100644 --- a/home/mail/mailsync.nix +++ b/home/mail/mailsync.nix @@ -1,132 +1,131 @@ { config, pkgs, ... }: let - shell = "${pkgs.dash}/bin/dash"; - pidof = "${pkgs.procps}/bin/pidof"; - pgrep = "${pkgs.procps}/bin/pgrep"; - grep = "${pkgs.gnugrep}/bin/grep"; - sed = "${pkgs.gnused}/bin/sed"; - awk = "${pkgs.gawk}/bin/awk"; - perl = "${pkgs.perl}/bin/perl"; - find = "${pkgs.findutils}/bin/find"; + shell = "${pkgs.dash}/bin/dash"; + pidof = "${pkgs.procps}/bin/pidof"; + pgrep = "${pkgs.procps}/bin/pgrep"; + grep = "${pkgs.gnugrep}/bin/grep"; + sed = "${pkgs.gnused}/bin/sed"; + awk = "${pkgs.gawk}/bin/awk"; + perl = "${pkgs.perl}/bin/perl"; + find = "${pkgs.findutils}/bin/find"; notifySend = "${pkgs.libnotify}/bin/notify-send"; - notmuch = "${pkgs.notmuch}/bin/notmuch"; - head = "${pkgs.coreutils}/bin/head"; - touch = "${pkgs.coreutils}/bin/touch"; - tr = "${pkgs.coreutils}/bin/tr"; + notmuch = "${pkgs.notmuch}/bin/notmuch"; + head = "${pkgs.coreutils}/bin/head"; + touch = "${pkgs.coreutils}/bin/touch"; + tr = "${pkgs.coreutils}/bin/tr"; mbsyncrc = "${config.home.homeDirectory}/.mbsyncrc"; - mbsync = "${pkgs.isync}/bin/mbsync -c ${mbsyncrc}"; + mbsync = "${pkgs.isync}/bin/mbsync -c ${mbsyncrc}"; - maildir = "${config.home.homeDirectory}/Maildir"; + maildir = "${config.home.homeDirectory}/Maildir"; passwordStoreDir = "${config.home.homeDirectory}/.password-store"; - notmuchConfig = "${config.home.homeDirectory}/.notmuch-config"; - gnupghome = "${config.home.homeDirectory}/.gnupg"; - lastrun = "${config.home.homeDirectory}/.mailsynclastrun"; -in - pkgs.writeScriptBin "mailsync" '' - #!${shell} + notmuchConfig = "${config.home.homeDirectory}/.config/notmuch/default/config"; + gnupghome = "${config.home.homeDirectory}/.gnupg"; + lastrun = "${config.home.homeDirectory}/.mailsynclastrun"; +in pkgs.writeScriptBin "mailsync" '' + #!${shell} - # Run only if not already running in other instance - ${pidof} mbsync >/dev/null && { - echo "mbsync is already running." - exit - } + # Run only if not already running in other instance + ${pidof} mbsync >/dev/null && { + echo "mbsync is already running." + exit + } - export PASSWORD_STORE_DIR="${passwordStoreDir}" - export NOTMUCH_CONFIG="${notmuchConfig}" - export GNUPGHOME="${gnupghome}" - export GPG_TTY=$TTY + export PASSWORD_STORE_DIR="${passwordStoreDir}" + export NOTMUCH_CONFIG="${notmuchConfig}" + export GNUPGHOME="${gnupghome}" + export GPG_TTY=$TTY - notify() { - pgrepoutput="$(${pgrep} -a X\(org\|wayland\))" - displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)" - [ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do - export DISPLAY=$x - ${notifySend} \ - --app-name="email" \ - "email" \ - "📬 $2 new mail(s) in \`$1\` account." - done - } - - messageinfo() { - from="$1" - subject="$2" - pgrepoutput="$(${pgrep} -a X\(org\|wayland\))" - displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)" - [ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do - export DISPLAY=$x - ${notifySend} \ - --app-name="email" \ - "📧$from:" \ - "$subject" - done - } - - # Check account for new mail. Notify if there is new content. - syncandnotify() { - accounts="$1" - acc="$(echo "$account" | ${sed} "s/.*\///")" - if [ -z "$opts" ]; then - ${mbsync} "$acc" - else - ${mbsync} "$opts" "$acc" - fi - new=$( - ${find} \ - "${maildir}/$acc/INBOX/new/" \ - "${maildir}/$acc/Inbox/new/" \ - "${maildir}/mail/$acc/inbox/new/" \ - -type f \ - -newer "${lastrun}" \ - 2> /dev/null - ) - newcount=$(echo "$new" | ${sed} '/^\s*$/d' | wc -l) - if [ "$newcount" -gt 5 ]; then - notify "$acc" "$newcount" - elif [ "$newcount" -gt 0 ]; then - for file in $new; do - # Extract subject and sender from mail. - from=$( - ${awk} '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | \ - ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \ - ${awk} '{ $1=""; if (NF>=3)$NF=""; print $0 }' | \ - ${sed} 's/^[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//' - ) - subject=$( - ${awk} '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | \ - ${head} -n 1 | ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \ - ${sed} 's/^Subject: //' | \ - ${sed} 's/^{[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//' | \ - ${tr} -d '\n' - ) - messageinfo "$from" "$subject" & - done - fi - } - - # Sync accounts passed as argument or all. - if [ "$#" -eq "0" ]; then - accounts="$(${awk} '/^Channel/ {print $2}' "${mbsyncrc}")" - else - for arg in "$@"; do - [ "''${arg%''${arg#?}}" = '-' ] && \ - opts="''${opts:+''${opts} }''${arg}" && \ - shift 1 - done - accounts=$* - fi - - # Parallelize multiple accounts - for account in $accounts; do - syncandnotify "''${account}" & + notify() { + pgrepoutput="$(${pgrep} -a X\(org\|wayland\))" + displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)" + [ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do + export DISPLAY=$x + ${notifySend} \ + --app-name="email" \ + "email" \ + "📬 $2 new mail(s) in \`$1\` account." done + } - wait + messageinfo() { + from="$1" + subject="$2" + pgrepoutput="$(${pgrep} -a X\(org\|wayland\))" + displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)" + [ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do + export DISPLAY=$x + ${notifySend} \ + --app-name="email" \ + "📧$from:" \ + "$subject" + done + } - ${notmuch} new 2>/dev/null + # Check account for new mail. Notify if there is new content. + syncandnotify() { + accounts="$1" + acc="$(echo "$account" | ${sed} "s/.*\///")" + if [ -z "$opts" ]; then + ${mbsync} "$acc" + else + ${mbsync} "$opts" "$acc" + fi + new=$( + ${find} \ + "${maildir}/$acc/INBOX/new/" \ + "${maildir}/$acc/Inbox/new/" \ + "${maildir}/mail/$acc/inbox/new/" \ + -type f \ + -newer "${lastrun}" \ + 2> /dev/null + ) + newcount=$(echo "$new" | ${sed} '/^\s*$/d' | wc -l) + if [ "$newcount" -gt 5 ]; then + notify "$acc" "$newcount" + elif [ "$newcount" -gt 0 ]; then + for file in $new; do + # Extract subject and sender from mail. + from=$( + ${awk} '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | \ + ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \ + ${awk} '{ $1=""; if (NF>=3)$NF=""; print $0 }' | \ + ${sed} 's/^[[:blank:]]*[\"'\'''\<]*//;s/[\"'\'''\>]*[[:blank:]]*$//' + ) + subject=$( + ${awk} '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | \ + ${head} -n 1 | ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \ + ${sed} 's/^Subject: //' | \ + ${sed} 's/^{[[:blank:]]*[\"'\'''\<]*//;s/[\"'\'''\>]*[[:blank:]]*$//' | \ + ${tr} -d '\n' + ) + messageinfo "$from" "$subject" & + done + fi + } - #Create a touch file that indicates the time of the last run of mailsync - ${touch} "${lastrun}" - '' + # Sync accounts passed as argument or all. + if [ "$#" -eq "0" ]; then + accounts="$(${awk} '/^Channel/ {print $2}' "${mbsyncrc}")" + else + for arg in "$@"; do + [ "''${arg%''${arg#?}}" = '-' ] && \ + opts="''${opts:+''${opts} }''${arg}" && \ + shift 1 + done + accounts=$* + fi + + # Parallelize multiple accounts + for account in $accounts; do + syncandnotify "''${account}" & + done + + wait + + ${notmuch} new 2>/dev/null + + #Create a touch file that indicates the time of the last run of mailsync + ${touch} "${lastrun}" +'' diff --git a/home/nixos-common.nix b/home/nixos-common.nix index 7bdedd2..f9cf497 100644 --- a/home/nixos-common.nix +++ b/home/nixos-common.nix @@ -9,8 +9,6 @@ home.username = "rilla"; home.homeDirectory = "/home/rilla"; - nixpkgs.overlays = [ (self: super: { alot = stablePkgs.alot; }) ]; - imports = [ ./arduino ./barrier