#!/usr/bin/env python # -*- coding: utf-8 -*- from random import random import configparser import base64 from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage class MailAdress: def __init__(self,EMail:str="",Name:str=None): self._name=Name self._mail=EMail @property def Name(self): if self._name==None or self._name=="": return self._mail return self._name @Name.setter def Name(self,value): self._name = value @property def Mail(self): return self._mail @Mail.setter def Mail(self,value): self._mail = value class Attachment: def __init__(self): self._size = 0 self._fileName="" self._content="" @property def Size(self) -> int: return self._size @Size.setter def Size(self,value:int): self._size = value @property def FileName(self) -> str: return self._fileName @FileName.setter def FileName(self,value:str): self._fileName = value @property def Content(self) -> str: return self._content @Content.setter def Content(self,value:str): self._content = value class Mail: def __init__(self): self._from = MailAdress() self._to = MailAdress() self._toName="" self._subject="" self._message="" self._html="" self._attachments=list[Attachment] self._messageID="" #TODO (example Microsoft: Message-Id: <4b5fad31-dcb0-4112-9a75-34bafd9addaa@az.northcentralus.unknown.microsoft.com>) self._headers=dict[str,str] self._boundary = self.CreateBoundary() @property def From(self) -> MailAdress: return self._from @property def To(self) -> MailAdress: return self._to @property def Subject(self) -> str: return self._subject @Subject.setter def Subject(self,value:str): self._subject = value @property def Message(self)->str: return self._message @Message.setter def Message(self,value:str): self._message = value @property def HTML(self)->str: return self._html @HTML.setter def HTML(self,value:str): self._html = value @property def Attachments(self)->list[Attachment]: return self._attachments @property def MessageID(self) -> str: return self._messageID @property def Headers(self) -> dict[str,str]: return self._headers def Base64_Encode(self, text:str) -> str: return base64.b64encode(text) def Base64_Decode(self, text:str) -> str: return base64.b64decode(text) def Send(self, profile:str=""): #TODO load Template - format text # Read Config and Sender-Profile configMain = configparser.ConfigParser() configMainFile="config/config.ini" configMain.read(configMainFile) deviceName=configMain["global"]["devicename"] config = configparser.ConfigParser() configFile="config/email.ini" config.read(configFile) if profile=="": if config and "general" in config and "send" in config["general"]: profile=config["general"]["send"] if profile=="": print("Failed to send E-Mail. No profile found") return if profile not in config: print(f"Profile '{profile}' not found in {configFile}") return # Read SMTP Info smtpHost=config[profile]["smtp"] smtpUser=config[profile]["login"] smtpPass=config[profile]["password"] smtpMail=config[profile]["email"] if smtpHost=="" or smtpUser=="" or smtpPass=="": print(f"Failed to load SMTP Host / Login") return # Set From / To strFrom = self.From.Name+" <"+smtpMail+">" strTo = self.To.Name+" <"+self.To.Mail+">" # Prepare E-Mail msgRoot = MIMEMultipart('related') msgRoot['Subject'] = self._subject msgRoot['From'] = strFrom msgRoot['To'] = strTo msgRoot.preamble = 'This is a multi-part message in MIME format.' msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) msgText = MIMEText(self._message) msgAlternative.attach(msgText) msgText = MIMEText(self._html, 'html') msgAlternative.attach(msgText) #TODO add images ## HTML ## This example assumes the image is in the current directory #fp = open('test.jpg', 'rb') #msgImage = MIMEImage(fp.read()) #fp.close() ## Define the image's ID as referenced above #msgImage.add_header('Content-ID', '') #msgRoot.attach(msgImage) #TODO add custom headers # Create SMTP Connection and send E-Mail import smtplib smtp = smtplib.SMTP() smtp.connect(smtpHost) smtp.starttls() #TODO check if TLS is working - maybe config.ini option smtp.login(smtpUser, smtpPass) smtp.sendmail(strFrom, strTo, msgRoot.as_string()) smtp.quit()