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

考えられる解決策の 1 つは、unread の値をファイルにシリアル化することです。

次に、チェックをメール数が 0 より大きいかどうかから、メール数が 0 より大きいか、ファイルから最後にシリアル化されたカウントと異なるかどうかに変更します。

これを拡張して、通知が実行された時刻をメール数とともにシリアル化することもできます。このようにして、繰り返し通知を表示するようにチェックを拡張します (4 つのメールを 5 分ごとではなく、3 時間ごとに 2 回表示します)。

つまり、元の小切手は のif unread != "0" :ようなものになりますif unread != "0" && unread != serialisedvalue:。show repeat 通知時間のしきい値の場合は、

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

threshold = 3600*33時間はどこですか。

シリアル化と逆シリアル化のサンプル コードは次のとおりです。

#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 に答える