Last active
September 29, 2021 08:48
-
-
Save dswhite42/b9f3a94dcfeb8fc8c06c8dba4aad59da to your computer and use it in GitHub Desktop.
Python script to check GMail and trigger blink(1) when new messages are found
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Check mail and trigger the blink(1) when new mail is found | |
import os, sys, imaplib, email, getopt, time | |
from subprocess import Popen, DEVNULL | |
class MailBlinker(): | |
def __init__(self, quiet=False): | |
# GMail username/password | |
self.username = 'your_gmail_username' | |
self.password = 'your_gmail_password' | |
# Location of the blink1control-tool | |
# (make sure API is enabled in blink1Control GUI) | |
self.blinker_tool = 'C:/Program Files/Blink1Control/blink1control-tool.exe' | |
# How many seconds between checks? | |
self.mail_check_interval = 30 | |
# Should access be read-only? (If False, then blink(1) will only be triggered once, the first time | |
# a new message is seen. If True, blink(1) will see the new message every time it checks until the | |
# mail is marked as "seen" in another mail reader.) | |
self.inbox_read_only = True | |
# The mail connection handler | |
self.mailconn = None | |
# Should we print any output? | |
self.quiet = quiet | |
######################################################################## | |
# Connect to GMail | |
def connect(self): | |
self.mailconn = imaplib.IMAP4_SSL('imap.gmail.com') | |
(retcode, capabilities) = self.mailconn.login(self.username, self.password) | |
self.mailconn.select('inbox', readonly=self.inbox_read_only) | |
# Check for mail | |
def check_mail(self): | |
# Connect to GMail (fresh connection needed every time) | |
self.connect() | |
num_new_messages=0 | |
(retcode, messages) = self.mailconn.search(None, '(UNSEEN)') | |
if retcode == 'OK': | |
for num in messages[0].split() : | |
num_new_messages += 1 | |
if not self.quiet: | |
print(' Processing #{}'.format(num_new_messages)) | |
typ, data = self.mailconn.fetch(num,'(RFC822)') | |
for response_part in data: | |
if isinstance(response_part, tuple): | |
original = email.message_from_bytes(response_part[1]) | |
if not self.quiet: | |
print(" ", original['From']) | |
print(" ", original['Subject']) | |
typ, data = self.mailconn.store(num,'+FLAGS','\\Seen') | |
return num_new_messages | |
# Blink! | |
def blink(self): | |
cmd = "{} --rgb=#FFFFFF --blink 10 -m 150 -t 300".format(self.blinker_tool) # -t should be about 2x the speed of -m | |
if self.quiet: | |
stdout = DEVNULL | |
stderr = DEVNULL | |
else: | |
stdout = None # to screen | |
stderr = None # to screen | |
Popen(cmd, stdout=stdout, stderr=stderr) | |
######################################################################## | |
if __name__ == '__main__': | |
# Specify -q for quiet operation (no output) | |
opts, args = getopt.getopt(sys.argv[1:], 'q') | |
quiet = False | |
for opt, arg in opts: | |
if opt == '-q': | |
quiet = True | |
mb = MailBlinker(quiet) | |
while True: | |
if not quiet: | |
print("Checking... ", end='') | |
num_new_messages = mb.check_mail() | |
if not quiet: | |
print("{} new messages".format(num_new_messages)) | |
if num_new_messages > 0: | |
mb.blink() | |
time.sleep(mb.mail_check_interval) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment