用于检查新电子邮件的Bash脚本无法识别新邮件

时间:2014-11-25 18:26:47

标签: bash email gmail imap

我写了一个小bash脚本,我想在登录桌面时自动启动。 该脚本应始终在后台运行,并定期检查新的传入邮件。当新消息到达时,脚本将通过notify-send弹出通知,并显示其内容。

但是,如果我给自己发送一封电子邮件(来自其他地址)以检查它是否正常工作,那么即使在Gmail的网络界面(即我)中,该消息似乎已被消费保持关闭)邮件被标记为未读。显然,由于即使新邮件未标记为新邮件,脚本也无法获取它。

我也关闭了我的Android手机,因为我认为它可能会干扰,而且我确定没有其他邮件客户端正在运行。

脚本的输出如下;请注意,在这两行之间我给自己发了一条消息:

254 messages, 0 new
255 messages, 0 new

代码如下:

#!/bin/bash
SERVER="imap.gmail.com"
while :
do
    echo "1 login myusername mypassword" > /tmp/checkmail
    echo "2 select inbox" >> /tmp/checkmail
    echo "3 logout" >> /tmp/checkmail

    response=$(openssl s_client -crlf -connect $SERVER:993 -quiet 2> /dev/null < /tmp/checkmail)
    rm /tmp/checkmail

    news=$(echo "$response" | grep RECENT | awk '{print $2}')
    last=$(echo "$response" | grep EXISTS | awk '{print $2}')

    echo "$last messages, $news new"

    if [ "$news" != "0" ]
    then
        for (( i=0; i<$news; i++))
        do
            echo "fetching $i° message"
            echo "1 login myusername mypassword" > /tmp/getmail
            echo "2 select inbox" >> /tmp/getmail
            echo "3 fetch $((last-i)) (body[1])" >> /tmp/getmail
            echo "4 logout" >> /tmp/getmail
            response=$(openssl s_client -crlf -connect $SERVER:993 -quiet 2> /dev/null < /tmp/getmail)
            rm /tmp/getmail

            content=$(echo "$response" | awk '/FETCH/{flag=1;next}/3 OK Success/{flag=0}flag')
            notify-send -t 0 "New message" "$content"
        done
    fi
    sleep 60 
done

提前谢谢

1 个答案:

答案 0 :(得分:0)

我在使用 gmail imap 服务器时遇到了同样的问题。因此,我不得不修改您的脚本,添加一个额外的 IMAP 命令:

    echo "1 login $myusername $mypassword" > /tmp/checkmail
    echo "2 select inbox" >> /tmp/checkmail
    echo "3 STATUS inbox (UNSEEN)" >> /tmp/checkmail
    echo "4 logout" >> /tmp/checkmail

然后用下面的替换你对 $news 的定义

    news=$(echo "$response" | grep UNSEEN | awk '{print $5}' | sed 's/)//' | tr -d '\r')

请注意,要使即将到来的脚本工作,需要删除“\r”。

尽管如此,我仍在努力使原始脚本的后续步骤适用于我的设置。