# for licensing information, please see LICENSE.md and README.md # copyright (c) rndusr, aka randomuser 2023 from proton import ProtonWebmail from common import ToSend from secrets import proton, gmail, mailserv import smtplib, ssl import imaplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import email from email.header import decode_header port = 465 password = mailserv.managedpassword ctx = ssl.create_default_context() imap = imaplib.IMAP4_SSL(mailserv.hostname) imap.login(mailserv.managedusername, mailserv.managedpassword) # Initialize an array to store the dictionaries of message details unread_messages = [] # Select the current mailbox # List all available mailboxes result, mailbox_data = imap.list() # Iterate through the list of mailboxes for mailbox_info in mailbox_data: # Parse the mailbox name from the list response mailbox_name = mailbox_info.decode().split('"')[-1].lstrip() # Select the current mailbox status, _ = imap.select(mailbox_name) if status == "NO": continue # Search for all unread messages in the current mailbox result, data = imap.search(None, "ALL") for imap_id in data[0].split(): result, message_data = imap.fetch(imap_id, '(RFC822)') raw_email = message_data[0][1] email_message = email.message_from_bytes(raw_email) subject, encoding = decode_header(email_message['Subject'])[0] subject = subject.decode(encoding) if encoding else subject body = email_message.get_payload() try: in_response_to_id = int( subject \ .split("kb_ident_")[-1] \ .replace(")", "") ) except (IndexError, ValueError) as e: imap.store(imap_id, '+FLAGS', '\\Deleted') continue unread_messages.append(ToSend( in_response_to_id, email_message.get_payload(), )) imap.store(imap_id, '+FLAGS', '\\Deleted') imap.expunge() imap.logout() proton_mail = ProtonWebmail(proton.username, proton.password) proton_mail.to_send = unread_messages proton_mail.get() with smtplib.SMTP_SSL("mail." + mailserv.hostname, port, context=ctx) as server: server.login(mailserv.managedusername, password) for message in proton_mail.seen_messages: if not message.acted_upon: mime_message = MIMEMultipart("alternative") html = MIMEText(message.maintext, "html") mime_message["Subject"] = "{} (from {}, kb_ident_{})".format(message.subject, message.sender, str(message.id)) mime_message["From"] = mailserv.managedusername mime_message["To"] = mailserv.targetusername mime_message.attach(html) server.sendmail(mailserv.managedusername, mailserv.targetusername, mime_message.as_string()) message.acted_upon = True proton_mail.write_data()