telegram reminder - liamlamth/blog GitHub Wiki

feature

  1. sending email to a server mailbox.
  2. server grep a pattern in new mail and convert to a pending alarm.
  3. server calls the telegram api to send out message.

notes

  1. mutt is good for parsing raw mail, e.g. base64. procmail and mailx have their drawback to do so.
  2. relaying reply in the mail cannot be isolate.
  3. mutt interactive scripting cannot be normally used in cronjob, it required stdin. To bypass this, use screen
  • mutt setting
    $ mkdir /root/Mail
    $ touch /root/Mail/decode_mail
    $ vi /root/.muttrc
        save-hook . '=decode_mail'
    
  • cron
    * * * * * /root/telegram_remind.sh
    
  • script
    $ touch /root/telegram_remind_schedule.txt
    $ vi /root/telegram_remind.sh
        #!/usr/bin/sh
        
        NOW=$(date "+%Y-%m-%d %H:%M")
        declare -A RECIPIENT
        RECIPIENT["REMINDER"]="-8123123"
        BOT_TOKEN="2100123123:AAF0WZqCc4Fe5r1aWsVwKuJPDAA231G231M"
        SCHEDULE_FILE=/root/telegram_remind_schedule.txt
        RAW_MAIL=/var/mail/root
        DECODE_MAIL=/root/Mail/decode_mail
        IFS=$'\n'
        
        touch $SCHEDULE_FILE
        REMIND_SCHEDULE=$(cat $SCHEDULE_FILE | grep "^pending,${NOW}" )
        
        if [ ! -z "$REMIND_SCHEDULE" ]; then
                for REMINDER in $(echo "$REMIND_SCHEDULE")
                do
                        REMIND_MSG=$( echo $REMINDER | cut -d ',' -f3- )
                        curl -X POST \
                                -H "Content-Type: application/json" \
                                -d "{\"chat_id\": \"${RECIPIENT[REMINDER]}\", \"text\": \"${REMIND_MSG}\"" \
                                https://api.telegram.org/bot${BOT_TOKEN}/sendMessage
                        sed -i "/${REMINDER}/s/^pending/completed/g" $SCHEDULE_FILE
                        echo ""
                done
        fi
        
        if [ ! -s $RAW_MAIL ]; then
                exit
        else
                while [[ -s $RAW_MAIL ]] && [[ $READ_COUNT < 10 ]]
                do
                        screen -d -m mutt -f $RAW_MAIL -e "push "
                        READ_COUNT=$(expr $READ + 1)
                done
        fi
        
        ### clean leading/tailing space: awk '{$1=$1};1'
        
        FILTER_MEMOS=$(cat $DECODE_MAIL | awk '{$1=$1};1' | grep -i "^From: [email protected]\|^hey zabbix" | sed '$aFrom: End')
        
        for MEMO in $(echo "$FILTER_MEMOS")
        do
                if [ $(echo $MEMO | grep -ic "^From: ") -eq 1 ]; then
                        if [ ! -z $SUCCESS_MEMO ] || [ ! -z $FAILED_MEMO ]; then
                                echo -e "${FAILED_MEMO}${SCHEDULE_COUNT} memo(s) is added into pending alarm list:-\n${SUCCESS_MEMO}" | mutt -s "telegram alarm schedule" -- $SENDER
                        fi
                        SENDER=$(echo $MEMO | grep -ioP '(?<=^From: ).*')
                        SCHEDULE_COUNT=0
                        unset SUCCESS_MEMO
                        continue
                fi
        
                if [ $(echo $MEMO | grep -o "," | wc -l) -lt 2 ]; then
                        FAILED_MEMO+="Not Enough Values, Please use  : ${MEMO}\n"
                        continue
                fi
                MEMO_TIME=$(echo $MEMO | cut -d ',' -f2  | awk '{$1=$1};1')
                MEMO_MSG=$( echo $MEMO | cut -d ',' -f3- | awk '{$1=$1};1')
        
                date -d "$MEMO_TIME" >/dev/null 2>&1
                if [ $? -eq 1 ]; then
                        FAILED_MEMO+="Bad Time Format, please use YYYY-MM-DD HH24:MI : ${MEMO}\n"
                        continue
                fi
        
                if [ $(date -d "$MEMO_TIME" +%s) -le $(date +%s) ]; then
                        FAILED_MEMO+="Time Over, please provide a future time : ${MEMO}\n"
                        continue
                fi
        
                FORMAT_TIME=$(date -d ${MEMO_TIME} +"%Y-%m-%d %H:%M")
                SCHEDULE_MEMO="${FORMAT_TIME},${MEMO_MSG}"
                if [ $(grep -c "${SCHEDULE_MEMO}$" $SCHEDULE_FILE) -gt 0 ]; then
                        FAILED_MEMO+="This Schedule is already Added : ${MEMO}\n"
                        continue;
                fi
                echo "pending,${SCHEDULE_MEMO}" >> $SCHEDULE_FILE
                SCHEDULE_COUNT=$(expr $SCHEDULE_COUNT + 1)
                SUCCESS_MEMO+="${SCHEDULE_MEMO}\n"
        done
        
        cat /dev/null > $DECODE_MAIL
        IFS=" "
        
    
⚠️ **GitHub.com Fallback** ⚠️