0

我在这样做时遇到了一些麻烦:
我在我的 Archlinux 发行版上使用 Conky,并在 python 中编写了一个快速脚本来检查我的 gmail 中是否有新邮件。在我的 conkyrc 中,此脚本每 5 分钟执行一次并返回一些邮件(如果我没有,则为 0)。工作正常。

我想做的是:
如果邮件数量> 0,则显示通知(gnome-shell 通知)。我现在唯一的问题是,如果我有未读邮件(例如 4 封未读邮件),每 5 分钟会有一个新通知说我有 4 封邮件未读。我想做的是检查是否已经有通知,这样我就不必再次显示它了……有谁知道如何解决这种问题?

这是我的代码:

#!/usr/bin/python

from gi.repository import Notify
from urllib.request import FancyURLopener

url = 'https://%s:%s@mail.google.com/mail/feed/atom' % ("username", "password")

opener = FancyURLopener()
page = opener.open(url)

contents = page.read().decode('utf-8')

ifrom = contents.index('<fullcount>') + 11
ito   = contents.index('</fullcount>')

unread = contents[ifrom:ito]

print(unread)

if unread != "0" :
    Notify.init ("New Mail")
    Hello=Notify.Notification.new ("New mail","You have "+unread+" new mail(s)","/usr/share/icons/Faenza/actions/96/mail-forward.png")
    Hello.show ()

我必须准确地说我对python很陌生。如果有人有解决方案,请提前感谢:)

4

1 回答 1

1

一种可能的解决方案是将 unread 的值序列化到文件中。

然后将您的检查从邮件数是否大于 0 更改为邮件数是否大于零或与文件中的最后一个序列化计数不同。

对此的扩展是将通知运行的时间与邮件计数一起序列化,这样您就可以扩展检查以显示重复通知(显示 4 封电子邮件两次,不是每 5 分钟一次,而是每 3 小时一次)。

所以你原来的支票是if unread != "0" :它会变成这样if unread != "0" && unread != serialisedvalue:。在显示重复通知时间阈值情况下,它变为

if unread != "0":
    if ((datetime.now() - serialiseddate) < threshold) :
        if unread != serialisedvalue:

3小时在哪里threshold = 3600*3

序列化和反序列化的示例代码如下

#Serialising
try:
    # This will create a new file or **overwrite an existing file**.
    f = open("mailcount.txt", "w")
    try:
        f.write(unread + "\n") # Write a string to a file
        f.write(datetime.now().strftime('%b %d %Y %I:%M%p'))
    finally:
        f.close()
except IOError:
    pass

#Deserialising 
try:
    f = open("mailcount.txt", "r")
    try:
        # Read the entire contents of a file at once.
        serialisedvalue = f.readline()
        serialseddate = datetime.strptime(f.readline(), '%b %d %Y %I:%M%p')
    finally:
        f.close()
except IOError:
    pass

另一种可能的解决方案是以某种方式获取当前的活动通知计数并将其添加到您的条件中,尽管我找不到使用Notify 使用的 API执行此操作的方法。

于 2013-01-13T04:49:09.610 回答