Skip to content

Instantly share code, notes, and snippets.

@EpicKiwi
Created August 10, 2025 16:07
Show Gist options
  • Select an option

  • Save EpicKiwi/26d7d7768cf8fff5bed566c2666b1b53 to your computer and use it in GitHub Desktop.

Select an option

Save EpicKiwi/26d7d7768cf8fff5bed566c2666b1b53 to your computer and use it in GitHub Desktop.
Print unread emails from your mailbox on esc-pos compatible thermal printer
#!/bin/bash
ICONV="ISO8859-15"
CODE_PAGE="\x1b\x74\x28"
MODE_EMPHASIS="\x1b!\x08"
MODE_NORMAL="\x1b!\x00"
CUT="\x1d\x561"
FEED_MAX="\x1b\x4a\xff"
ECHO="/usr/bin/echo -n -e"
## Debug
# CODE_PAGE="[CODE PAGE]\n"
# MODE_EMPHASIS="[B]"
# MODE_NORMAL="[N]"
# CUT="[CUT]\n"
# FEED_MAX="[FEED]\n"
unread_mail=$(echo "f*" | mail -N | grep "^[> ][NU]" | awk '{print $2}')
if [[ "$(echo "$unread_mail" | wc -l)" -eq 0 ]]; then
exit 0
fi
for mail_num in $unread_mail; do
if [[ "$mail_num" == "" ]]; then
continue;
fi
$ECHO "$CODE_PAGE"
$ECHO "$MODE_NORMAL"
result=$(/usr/bin/echo -e "p$mail_num \nhold $mail_num \nq" | mail -N | tail -n+4 | head -n-1)
from=$(echo "$result" | head -n 1)
headers=$(echo "$result" | awk -v 'RS=\n\n' '1;{exit}' | tail -n+2)
body=$(echo "$result" | tail "-n+$(($(echo "$headers" | wc -l) + 2))" )
$ECHO "$MODE_EMPHASIS"
echo "$from" | \
iconv -f utf-8 -t $ICONV//TRANSLIT
$ECHO "$MODE_NORMAL"
echo "$headers" | \
grep -v "Content-Type:" | \
grep -v "MIME-Version:" | \
grep -v "Content-Transfer-Encoding:" | \
sed -e "s|^\([^:]*\)\(:\?\)|$MODE_EMPHASIS\1$MODE_NORMAL\2|" | \
iconv -f utf-8 -t $ICONV//TRANSLIT
echo ""
echo "$body" | \
iconv -f utf-8 -t $ICONV//TRANSLIT
$ECHO "$FEED_MAX"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment