import base64 import os from time import sleep from mailersend import emails import dotenv class MailSender: def __init__(self): dotenv.load_dotenv() self.mailersend_api_key = os.getenv("MAILERSEND_API_KEY") self.mailer = emails.NewEmail(mailersend_api_key=self.mailersend_api_key) self.mail_body = {} self.set_mail_to(recipients=input("Enter recipient email: ")) self.set_mail_from() self.set_reply_to("No Reply", "noreply@assistant.fish") self.set_subject(input("Enter subject: ")) plaintext_content = input("Enter plaintext content: ") self.set_plaintext_content(plaintext_content) html_content = input("Enter HTML content: ") if html_content == "": html_content = plaintext_content self.set_html_content(html_content) attachment_path = input("Path to image: ") if attachment_path != "": self.set_attachments(attachment_path) # TODO: Add support for multiple attachments and other types of attachments self.send_mail() def set_mail_from(self): mail_from = {"name": "SCI Fish", "email": 'sci@assistant.fish'} self.mailer.set_mail_from(mail_from, self.mail_body) def set_mail_to(self, recipients): if isinstance(recipients, str): recipients = [{"name": recipients, "email": recipients}] elif isinstance(recipients, list): recipients = [{"name": i, "email": i} for i in recipients] self.mailer.set_mail_to(recipients, self.mail_body) def set_subject(self, subject): self.mailer.set_subject(subject, self.mail_body) def set_html_content(self, html_content): self.mailer.set_html_content(html_content, self.mail_body) def set_plaintext_content(self, plaintext_content): self.mailer.set_plaintext_content(plaintext_content, self.mail_body) def set_reply_to(self, name, email): reply_to = {"name": name, "email": email} self.mailer.set_reply_to(reply_to, self.mail_body) def set_attachments(self, file_path): with open(file_path, "rb") as attachment: att_read = attachment.read() att_base64 = base64.b64encode(bytes(att_read)) attachments = [ { "id": os.path.basename(file_path), "filename": os.path.basename(file_path), "content": f"{att_base64.decode('ascii')}", "disposition": "attachment", } ] self.mailer.set_attachments(attachments, self.mail_body) def send_mail(self): r = self.mailer.send(self.mail_body) sleep(4) # wait for email to be sent if r.split("\n")[0].strip() != "202": print("Error sending email") else: print("Email sent successfully") # Example usage if __name__ == "__main__": mail_sender = MailSender()