我写了一个小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
提前谢谢
答案 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”。
尽管如此,我仍在努力使原始脚本的后续步骤适用于我的设置。