dfdc3162ba
This enables users to easily recognize notifications to be able to modify or style them through notification daemons.
67 lines
3.0 KiB
Bash
Executable File
67 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
# Sync mail and give notification if there is new mail.
|
|
|
|
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus
|
|
export DBUS_SESSION_BUS_ADDRESS
|
|
export DISPLAY=:0.0
|
|
[ -d "$HOME/.local/share/password-store" ] && export PASSWORD_STORE_DIR="$HOME/.local/share/password-store"
|
|
|
|
# Run only if user logged in (prevent cron errors)
|
|
pgrep -u "${USER:=$LOGNAME}" >/dev/null || { echo "$USER not logged in; sync will not run."; exit ;}
|
|
# Run only if not already running in other instance
|
|
pgrep -x mbsync >/dev/null && { echo "mbsync is already running." ; exit ;}
|
|
|
|
# Checks for internet connection and set notification script.
|
|
ping -q -c 1 1.1.1.1 > /dev/null || { echo "No internet connection detected."; exit ;}
|
|
command -v notify-send >/dev/null || echo "Note that \`libnotify\` or \`libnotify-send\` should be installed for pop-up mail notifications with this script."
|
|
|
|
# Settings are different for MacOS (Darwin) systems.
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
notify() { osascript -e "display notification \"$2 in $1\" with title \"You've got Mail\" subtitle \"Account: $account\"" && sleep 2 ;}
|
|
else
|
|
notify() { notify-send --app-name="mutt-wizard" "mutt-wizard" "📬 $2 new mail(s) in \`$1\` account." ;}
|
|
fi
|
|
|
|
# Check account for new mail. Notify if there is new content.
|
|
syncandnotify() {
|
|
acc="$(echo "$account" | sed "s/.*\///")"
|
|
mbsync "$acc"
|
|
new=$(find "$HOME/.local/share/mail/$acc/INBOX/new/" "$HOME/.local/share/mail/$acc/Inbox/new/" "$HOME/.local/share/mail/$acc/inbox/new/" -type f -newer "$HOME/.config/mutt/.mailsynclastrun" 2> /dev/null)
|
|
newcount=$(echo "$new" | sed '/^\s*$/d' | wc -l)
|
|
if [ "$newcount" -gt "0" ]; then
|
|
notify "$acc" "$newcount" &
|
|
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')
|
|
notify-send --app-name="mutt-wizard" "📧$from:" "$subject" &
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Sync accounts passed as argument or all.
|
|
if [ "$#" -eq "0" ]; then
|
|
accounts="$(awk '/^Channel/ {print $2}' "$HOME/.mbsyncrc")"
|
|
else
|
|
accounts=$*
|
|
fi
|
|
|
|
echo " 🔃" > /tmp/imapsyncicon_"$USER"
|
|
pkill -RTMIN+12 "${STATUSBAR:?}" >/dev/null 2>&1
|
|
|
|
# Parallelize multiple accounts
|
|
for account in $accounts
|
|
do
|
|
syncandnotify &
|
|
done
|
|
|
|
wait
|
|
rm -f /tmp/imapsyncicon_"$USER"
|
|
pkill -RTMIN+12 "${STATUSBAR:?}" >/dev/null 2>&1
|
|
|
|
notmuch new 2>/dev/null
|
|
|
|
#Create a touch file that indicates the time of the last run of mailsync
|
|
touch "$HOME/.config/mutt/.mailsynclastrun"
|