From c2acfddd098dbfe4f0a909bb7667c2587dca2d22 Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Sun, 26 Nov 2023 15:16:29 +0300 Subject: [PATCH] Fix email widget --- email-widget/.env.example | 5 + email-widget/.gitignore | 2 + email-widget/README.md | 44 ++++++--- email-widget/count_unread_emails.py | 23 +++-- email-widget/em-wid-1.png | Bin 1836 -> 855 bytes email-widget/em-wid-2.png | Bin 39018 -> 12327 bytes email-widget/email.lua | 37 +++---- email-widget/read_unread_emails.py | 143 +++++++++++++++++++++------- email-widget/requirements.txt | 2 + 9 files changed, 184 insertions(+), 72 deletions(-) create mode 100644 email-widget/.env.example create mode 100644 email-widget/.gitignore create mode 100644 email-widget/requirements.txt diff --git a/email-widget/.env.example b/email-widget/.env.example new file mode 100644 index 0000000..0cdfc04 --- /dev/null +++ b/email-widget/.env.example @@ -0,0 +1,5 @@ +EMAIL= +PASSWORD= +MAX_MSG_COUNT= +MAX_BODY_LENGTH= + diff --git a/email-widget/.gitignore b/email-widget/.gitignore new file mode 100644 index 0000000..8d19362 --- /dev/null +++ b/email-widget/.gitignore @@ -0,0 +1,2 @@ +.venv +.env diff --git a/email-widget/README.md b/email-widget/README.md index 510792d..d7baf4f 100644 --- a/email-widget/README.md +++ b/email-widget/README.md @@ -3,34 +3,52 @@ This widget consists of an icon with counter which shows number of unread emails: ![email icon](./em-wid-1.png) and a popup message which appears when mouse hovers over an icon: ![email popup](./em-wid-2.png) -Note that widget uses the Arc icon theme, so it should be [installed](https://github.com/horst3180/arc-icon-theme#installation) first under **/usr/share/icons/Arc/** folder. - ## Installation +1. Clone this repository to your awesome config folder: -To install it put **email.lua** and **email-widget** folder under **~/.config/awesome**. Then +```bash +git clone https://github.com/streetturtle/awesome-wm-widgets/email-widget ~/.config/awesome/email-widget +``` +2. Make virtual environment and install dependencies: - - in **email.lua** change path to python scripts; - - in python scripts add your credentials (note that password should be encrypted using pgp for example); - - add widget to awesome: +```bash +cd ~/.config/awesome/email-widget +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +``` +3. Fill .env file with your credentials: + +```bash +cp .env.example .env +``` +4. Add widget to awesome: ```lua -local email_widget, email_icon = require("email") - +local email_widget = require("email-widget.email") ... s.mytasklist, -- Middle widget { -- Right widgets - layout = wibox.layout.fixed.horizontal, + layout = wibox.layout.fixed.horizontal, ... - email_icon, - email_widget, + email_widget, ... ``` +If you want to reduce time of getting emails, you can change maximum number of emails to be fetched in .env file. Default is 10. +If you want to configure width of popup window, you can change this line in email.lua file: + +```lua + width = 800, +``` +After this you can change MAX_BODY_LENGTH variable in .env file to change number of characters to be displayed in popup window. Default is 100. +Next step is restarting awesome. You can do this by pressing Mod+Ctrl+r. + ## How it works This widget uses the output of two python scripts, first is called every 20 seconds - it returns number of unread emails and second is called when mouse hovers over an icon and displays content of those emails. For both of them you'll need to provide your credentials and imap server. For testing, they can simply be called from console: ``` bash -python ~/.config/awesome/email/count_unread_emails.py -python ~/.config/awesome/email/read_emails.py +python ~/.config/awesome/email-widget/count_unread_emails.py +python ~/.config/awesome/email-widget/read_emails.py ``` diff --git a/email-widget/count_unread_emails.py b/email-widget/count_unread_emails.py index a843814..c65a7dd 100644 --- a/email-widget/count_unread_emails.py +++ b/email-widget/count_unread_emails.py @@ -1,16 +1,25 @@ -#!/usr/bin/python - import imaplib import re +from dotenv import load_dotenv +from pathlib import Path +import os +path_to_env = Path(__file__).parent / '.env' +load_dotenv(path_to_env) +EMAIL = os.getenv("EMAIL") +PASSWORD = os.getenv("PASSWORD") +if not EMAIL or not PASSWORD: + print("ERROR:Email or password not set in .env file.") + exit(0) -M=imaplib.IMAP4_SSL("mail.teenagemutantninjaturtles.com", 993) -M.login("mickey@tmnt.com","cowabunga") -status, counts = M.status("INBOX","(MESSAGES UNSEEN)") +M = imaplib.IMAP4_SSL("imap.gmail.com", 993) +M.login(EMAIL, PASSWORD) + +status, counts = M.status("INBOX", "(MESSAGES UNSEEN)") if status == "OK": - unread = re.search(r'UNSEEN\s(\d+)', counts[0].decode('utf-8')).group(1) + unread = re.search(r"UNSEEN\s(\d+)", counts[0].decode("utf-8")).group(1) else: - unread = "N/A" + unread = "N/A" print(unread) diff --git a/email-widget/em-wid-1.png b/email-widget/em-wid-1.png index 5290ea8e1a6efd0151077d1224c59bfbb2a63b48..e4aa074628574cde78431f732f970fbb2b143f3e 100644 GIT binary patch delta 843 zcmV-R1GN0C4%Y^d8Gi-<007U*Zkhl900eVFNmK|32nc)#WQYI&0}e? zDs3FaKQm5&B$DK!g(cY3LZeL*1&YxoB&dXzwdx;e*Dl^w+n_~@aM?nlK!R#5W<|BA z2m&oLgMKIzK|_&@Gw&jr_j;3ixxC7~#67#`obPk^p6|>vJbxoZqfvt|0104ze*Sm& z@xLMd?gnawzd`;qe3>9pJ}PcC%)9cz>9lo*v@yIE#ym92^`lHa3RW>#gcjmmpTFm5GT7R##Ukl}exVU@*w( z=_#pHird>;*4Eb0G!4JsZ`QQ8w{voG!uk0*g+hUyogIqBA}*J!s!v^lL?RK6kB=)} zl@ADlKwDcI7Z(>Mr|UYGmzTKRZj;OB^K^E0;&3<+1b+cpmT7KoCX>lj^{M$8>Fw>M zrKN>fELK&wTCGTugsQ3)ysD}=olbMTwY5cKV?ALr@miEK9eX>Uz~xLhu5HXAcD zGbSgBB7d!|tqcqdFgG{H>+36;reU+$D)!oJHgmdyATTmA!sg~CXJ=;s+}+*bcDo6M zLS(bqPd+sbl1`^tSXijwCMPG!<#HsGN#K3zH#axPvdrP(p&7QLqk~i`Wd@O?AGh|s zPfdfoy}j}9@KC{Nn#Rk^3xz_#bd%jF0J0!Wg?(a{m`e)!YrG($r} zJU>69CGMe5H!TBC4tq3WW#;gBXTEEEcN> zo5^HwI2;6nK>~pQPN$PZBEjC?UR56<8jTu%ukn8nzDy9Iy`%Hzzq&uG5QO(40}v_% zb3|!;=zP?Cqv!@wg9HX>G@A{NPl#bTlKRzfS6v4|p~#e$*hly%*#{TGQB VUID`V1x^3}002ovPDHLkV1kninaltH delta 1832 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 literal 39018 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/.config/awesome/email-widget/count_unread_emails.py", 20, - function(_, stdout) + path_to_python_in_venv.." "..currentPath.."count_unread_emails.py", 20, function(_, stdout) + local is_error = (stdout:match("ERROR") ~= nil) + email_widget:set_text("status: "..tostring(is_error)) + if is_error then + email_widget:set_text(stdout) + return + end local unread_emails_num = tonumber(stdout) or 0 if (unread_emails_num > 0) then - email_icon:set_image(path_to_icons .. "/mail-mark-unread.png") - email_widget:set_text(stdout) + email_widget:set_text(unread_emails_num) elseif (unread_emails_num == 0) then - email_icon:set_image(path_to_icons .. "/mail-message-new.png") email_widget:set_text("") end end ) - - local function show_emails() - awful.spawn.easy_async([[bash -c 'python /home//.config/awesome/email-widget/read_unread_emails.py']], - function(stdout) + awful.spawn.easy_async( + path_to_python_in_venv.." "..currentPath.."read_unread_emails.py", + function(stdout) naughty.notify{ text = stdout, title = "Unread Emails", - timeout = 5, hover_timeout = 0.5, - width = 400, + timeout = 10, hover_timeout = 0.5, + width = 800, + parse = true, } end ) end -email_icon:connect_signal("mouse::enter", function() show_emails() end) +email_widget:connect_signal("mouse::enter", function() show_emails() end) -return email_widget, email_icon +-- show_emails() +return email_widget \ No newline at end of file diff --git a/email-widget/read_unread_emails.py b/email-widget/read_unread_emails.py index fda8188..30d3a8a 100644 --- a/email-widget/read_unread_emails.py +++ b/email-widget/read_unread_emails.py @@ -1,44 +1,115 @@ -#!/usr/bin/python - import imaplib import email -import datetime +import html2text +import re +from email.header import make_header, decode_header +from pathlib import Path +import os +from dotenv import load_dotenv -def process_mailbox(M): - rv, data = M.search(None, "(UNSEEN)") - if rv != 'OK': - print "No messages found!" - return +path_to_env = Path(__file__).parent / '.env' +load_dotenv(path_to_env) +EMAIL = os.getenv("EMAIL") +PASSWORD = os.getenv("PASSWORD") - for num in data[0].split(): - rv, data = M.fetch(num, '(BODY.PEEK[])') - if rv != 'OK': - print "ERROR getting message", num - return - msg = email.message_from_bytes(data[0][1]) - for header in [ 'From', 'Subject', 'Date' ]: - hdr = email.header.make_header(email.header.decode_header(msg[header])) - if header == 'Date': - date_tuple = email.utils.parsedate_tz(str(hdr)) - if date_tuple: - local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple)) - print("{}: {}".format(header, local_date.strftime("%a, %d %b %Y %H:%M:%S"))) +MAX_MSG_COUNT = int(os.getenv("MAX_MSG_COUNT", 5)) +MAX_BODY_LENGTH = int(os.getenv("MAX_BODY_LENGTH", 100)) + +GREEN = "\033[1;32m" +END_COLOR = "\033[0m" + +UNSEEN_FLAG = "(UNSEEN)" +BODY_PEEK_FLAG = "(BODY.PEEK[])" +def colorful_text(text, color): + """ + Function to format text with Pango markup for color. + """ + return f"{text}" + +def format_body(body, max_length=MAX_BODY_LENGTH): + body = body.decode("utf-8", errors="ignore") + + if "DOCTYPE" in body: + body = html2text.html2text(body) + body = body.replace("\n", "").replace("\r\n", "").replace(" ", "") + body = re.sub(r"\[.*\]\(.*\)", "", body) + + return body if len(body) < max_length else body[:max_length] + "..." + +def get_short_email_str(M, num_emails=MAX_MSG_COUNT): + rv, data = M.search(None, UNSEEN_FLAG) + email_list = list(reversed(data[0].split()))[:num_emails] + + for num in email_list: + try: + rv, data = M.fetch(num, BODY_PEEK_FLAG) + if rv != "OK": + print("ERROR getting message", num) + continue + + msg = email.message_from_bytes(data[0][1]) + + sender = make_header(decode_header(msg["From"])) + subject = make_header(decode_header(msg["Subject"])) + date = make_header(decode_header(msg["Date"])) + + email_info = ( + f"From: {colorful_text(str(sender).replace('<', '').replace('>', ''), 'green')}\n" + f"Subject: {colorful_text(str(subject), 'red')}\n" + f"Date: {date}\n" + ) + + if msg.is_multipart(): + for part in msg.walk(): + content_type = part.get_content_type() + content_disposition = str(part.get("Content-Disposition")) + + if ( + content_type == "text/plain" + and "attachment" not in content_disposition + ): + body = part.get_payload(decode=True) + email_info += format_body(body) + break + elif ( + content_type == "text/html" + and "attachment" not in content_disposition + ): + body = part.get_payload(decode=True) + body = html2text.html2text( + body.decode("utf-8", errors="ignore") + ) + email_info += format_body(body) + break else: - print('{}: {}'.format(header, hdr)) - # with code below you can process text of email - # if msg.is_multipart(): - # for payload in msg.get_payload(): - # if payload.get_content_maintype() == 'text': - # print payload.get_payload() - # else: - # print msg.get_payload() + body = msg.get_payload(decode=True) + email_info += format_body(body) + email_info += "\n" + "=" * 50 + "\n" + yield email_info -M=imaplib.IMAP4_SSL("mail.teenagemutantninjaturtles.com", 993) -M.login("mickey@tmnt.com","cowabunga") + except Exception: + print("ERROR processing message: ", num) -rv, data = M.select("INBOX") -if rv == 'OK': - process_mailbox(M) -M.close() -M.logout() +if __name__ == "__main__": + # Example usage: + # read_unread_emails.py + import time + start = time.time() + + M = imaplib.IMAP4_SSL("imap.gmail.com", 993) + try: + M.login(EMAIL, PASSWORD) + rv, data = M.select("INBOX") + + if rv == "OK": + for email_str in get_short_email_str(M, MAX_MSG_COUNT): + print(email_str) + else: + print("Error selecting INBOX") + except Exception: + print("Error logging in: ", EMAIL) + finally: + M.logout() + + print(f"Time taken: {time.time() - start:.2f} seconds") \ No newline at end of file diff --git a/email-widget/requirements.txt b/email-widget/requirements.txt new file mode 100644 index 0000000..13b32cd --- /dev/null +++ b/email-widget/requirements.txt @@ -0,0 +1,2 @@ +html2text==2020.1.16 +python-dotenv==1.0.0