mail-sync/driver.py

84 lines
2.9 KiB
Python
Raw Normal View History

2023-10-11 23:45:22 -05:00
# for licensing information, please see LICENSE.md and README.md
# copyright (c) rndusr, aka randomuser 2023
2023-10-09 21:07:55 -05:00
from proton import ProtonWebmail
from common import ToSend
from secrets import proton, gmail, mailserv
2023-10-09 21:07:55 -05:00
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()