dotfiles/mail/.local/bin/mail-check
Marty Oehme 3fa7f8a6db
mail: HACK mailcheck update
Update `mail-check` script to notify the user both of newly arrived
mail, and in case he has to enter his password to sync the mail.

HACK the paths and ways of finding out if passwords can be decrypted are
static and only applicable to my set up. This needs to be completely
revised and newly approached.
2020-09-24 16:24:34 +02:00

125 lines
2.8 KiB
Bash
Executable file

#!/usr/bin/env sh
# runs mbsync, with pre-hooks and post-hooks
# by default, first runs imapfilter
# and after indexes with notmuch
#
# To run without invoking any hooks or retry attempts,
# run `checkmail raw`
# this will simply invoke a single isync run on all
# boxes with the correct config file set.
#
# for more advanced, per-account/channel hooks, see
# https://sourceforge.net/p/isync/feature-requests/8/
# available env vars:
# MBSYNC_MAX_TRIES=3
# MBSYNC_PRE="/bin/usr/cmd-to-run"
# MBSYNC_POST="/bin/usr/cmd-to-run"
# MBSYNC_NOTIFY=1
prehook() {
if [ -n "$MBSYNC_PRE" ]; then
eval "$MBSYNC_PRE"
return 0
fi
imapfilter -c "${XDG_CONFIG_HOME:-/home/marty/.config}/imapfilter/config.lua"
}
posthook() {
if [ -n "$MBSYNC_POST" ]; then
eval "$MBSYNC_POST"
return 0
fi
notmuch new 2>/dev/null
afew --tag --new -C "${XDG_CONFIG_HOME:-/home/marty/.config}/notmuch/config"
countnew
}
# use notmuch to index incoming mail and set the
# correct number of mails if new ones arrived for notifications
countnew() {
num=$(notmuch count tag:unread and tag:inbox)
HASMAIL="${num:-0}"
}
# fail the routine and optionally send a message why
fail() {
[ -n "$1" ] && echo "$1"
exit 1
}
checkmail() {
mbsync -c "${XDG_CONFIG_HOME:-$HOME/.config}/isync/mbsyncrc" -a
}
checkonline() {
# Ping 1.1.1.1 to confirm that we are on the internet
ping -c 1 "1.1.1.1" >/dev/null 2>/dev/null || fail "checkmail can not access the internet."
}
# warn user that he has to enter his password in a moment
# to stop catching him offguard or entering something by accident
checkwarnuser() {
agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode cancel ~/.local/share/pass/misc/aerc-gmail-app-password.gpg 2>&1)
if echo "$agt" | grep -qE 'No secret key'; then
notify "Mail: Password phrase needed!"
sleep 2.5
fi
}
# send out a notification on new mail, to libnotify and stdout
notifymail() {
[ "${MBSYNC_NOTIFY:-1}" -eq 0 ] && return
if [ "${HASMAIL:-0}" -gt 0 ]; then
notify "($HASMAIL) new mail"
fi
}
notify() {
command -v notify-send >/dev/null && notify-send "$@"
echo "$@"
}
# Routine start
# check
# skip any retries and pre/post hooks, just run mbsync
if [ "$1" = "raw" ]; then
checkmail
exit
fi
main() {
checkwarnuser
prehook
tries=0
while true; do
if checkmail; then
break
fi
tries=$((tries + 1))
if [ $tries -gt "${MBSYNC_MAX_TRIES:-3}" ]; then
fail "maximum retries reached without success."
fi
done
unset tries
posthook
notifymail
}
notmuch_foldertags() {
notmuch tag +dump -inbox -deleted -- folder:Dump and not folder:Inbox
notmuch tag +archived -inbox -deleted -- folder:Archive and not folder:Inbox
notmuch tag +deleted -inbox -archived -- folder:Trash and not folder:Inbox
}
main