mail-sync/driver.py

84 lines
2.9 KiB
Python

# 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()