e2203ed34f
* changed ping address to a more friendly location `1.1.1.1` is not a friendly address for users from some parts of the world (e.g., China). Changed to `example.org` which should be more friendly to access. * changed internet check by fallback This is probably better since for most people it does the same thing and the first back up is Cloudfare's other DNS address which surprisingly can be accessed in more places (e.g., China) now. And changed the finall fallback as example.org.
72 lines
3.3 KiB
Bash
Executable File
72 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Sync mail and give notification if there is new mail.
|
|
|
|
# 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 || ping -q -c 1 1.0.0.1 > /dev/null || ping -q -c 1 example.org || { 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."
|
|
|
|
# Required to display notifications if run as a cronjob:
|
|
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus
|
|
export DISPLAY=:0.0
|
|
|
|
# For individual configurations:
|
|
[ -d "$HOME/.local/share/password-store" ] && export PASSWORD_STORE_DIR="$HOME/.local/share/password-store"
|
|
|
|
# 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 ;}
|
|
messageinfo() { osascript -e "display notification with title \"📧 $from\" subtitle \"$subject\"" ;}
|
|
else
|
|
notify() { notify-send --app-name="mutt-wizard" "mutt-wizard" "📬 $2 new mail(s) in \`$1\` account." ;}
|
|
messageinfo() { notify-send --app-name="mutt-wizard" "📧$from:" "$subject" ;}
|
|
fi
|
|
|
|
# Check account for new mail. Notify if there is new content.
|
|
syncandnotify() {
|
|
acc="$(echo "$account" | sed "s/.*\///")"
|
|
if [ -z "$opts" ]; then mbsync "$acc"; else mbsync "$opts" "$acc"; fi
|
|
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')
|
|
messageinfo &
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Sync accounts passed as argument or all.
|
|
if [ "$#" -eq "0" ]; then
|
|
accounts="$(awk '/^Channel/ {print $2}' "$HOME/.mbsyncrc")"
|
|
else
|
|
for arg in "$@"; do
|
|
[ "${arg%${arg#?}}" = '-' ] && opts="${opts:+${opts} }${arg}" && shift 1
|
|
done
|
|
accounts=$*
|
|
fi
|
|
|
|
( kill -46 "$(pidof "${STATUSBAR:-dwmblocks}")" >/dev/null 2>&1 ) 2>/dev/null
|
|
|
|
# Parallelize multiple accounts
|
|
for account in $accounts
|
|
do
|
|
syncandnotify &
|
|
done
|
|
|
|
wait
|
|
( kill -46 "$(pidof "${STATUSBAR:-dwmblocks}")" >/dev/null 2>&1 ) 2>/dev/null
|
|
|
|
notmuch new 2>/dev/null
|
|
|
|
#Create a touch file that indicates the time of the last run of mailsync
|
|
touch "$HOME/.config/mutt/.mailsynclastrun"
|