import os import sys from PyQt6 import QtCore, QtGui, QtWidgets from src import Icon, settings as config from .dialog_sources.Ui_mail_preview import Ui_eMailPreview as MailPreviewDialog from .mailTemplate import MailTemplateDialog empty_signature = """


""" class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog): def __init__( self, app_id, app_name, app_subject, prof_name, prof_mail, parent=None, default_mail="Information zum Semesterapparat", ): super().__init__(parent) self.setupUi( self, # app_id, # app_name, # app_subject, # prof_name, ) logger.info("Setting up mail dialog") self.appid = app_id self.appname = app_name self.subject = app_subject self.profname = prof_name self.mail_data = "" self.signature = self.determine_signature() self.prof_mail = prof_mail self.comboBox.currentIndexChanged.connect(self.set_mail) self.prof_name.setText(prof_name) self.mail_name.setText(self.prof_mail) self.load_mail_templates() # if none of the radio buttons is checked, disable the accept button of the dialog self.setWindowIcon(Icon("mail").icon) self.btn_okay.setEnabled(False) Icon("edit_note", self.newTemplate) self.newTemplate.clicked.connect(self.open_new_template) if default_mail is not None: # get the nearest match to the default mail for i in range(self.comboBox.count()): if default_mail in self.comboBox.itemText(i): default_mail = self.comboBox.itemText(i) break self.comboBox.setCurrentText(default_mail) self.gender_female.clicked.connect(self.set_mail) self.gender_male.clicked.connect(self.set_mail) self.gender_non.clicked.connect(self.set_mail) self.btn_okay.clicked.connect(self.createAndSendMail) def open_new_template(self): logger.info("Opening new template dialog") # TODO: implement new mail template dialog dialog = MailTemplateDialog() dialog.exec() pass def determine_signature(self): if config.mail.signature is empty_signature or config.mail.signature == "": return """Mit freundlichen Grüßen Ihr Semesterapparatsteam Mail: semesterapparate@ph-freiburg.de Tel.: 0761/682-778 | 07617682-545""" else: return config.mail.signature def load_mail_templates(self): # print("loading mail templates") logger.info("Loading mail templates") mail_templates = os.listdir("mail_vorlagen") logger.info(f"Mail templates: {mail_templates}") for template in mail_templates: self.comboBox.addItem(template) def get_greeting(self): prof = self.profname.split(" ")[0] if self.gender_male.isChecked(): self.btn_okay.setEnabled(True) return f"Sehr geehrter Herr {prof}," elif self.gender_female.isChecked(): self.btn_okay.setEnabled(True) return f"Sehr geehrte Frau {prof}," elif self.gender_non.isChecked(): self.btn_okay.setEnabled(True) name = f"{self.profname.split(" ")[1]} {self.profname.split(" ")[0]}" return f"Guten Tag {name}," def set_mail(self): logger.info("Setting mail") email_template = self.comboBox.currentText() if email_template == "": logger.debug("No mail template selected") return with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f: mail_template = f.read() email_header = email_template.split(".eml")[0] if "{AppNr}" in email_template: email_header = email_template.split(".eml")[0] email_header = email_header.format(AppNr=self.appid, AppName=self.appname) self.mail_header.setText(email_header) self.mail_data = mail_template.split("")[0] mail_html = mail_template.split("")[1] mail_html = "" + mail_html Appname = self.appname mail_html = mail_html.format( Profname=self.profname.split(" ")[0], Appname=Appname, AppNr=self.appid, AppSubject=self.subject, greeting=self.get_greeting(), signature=self.signature, ) self.mail_body.setHtml(mail_html) logger.info(f"Mail template set to {email_template}") def createAndSendMail(self): logger.info("Sending mail") import smtplib import ssl from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText tolist = [self.prof_mail, "semesterapparate@ph-freiburg.de"] self.btn_okay.setText("Mail wird gesendet") smtp_server = config.mail.smtp_server port: int = config.mail.port sender_email = config.mail.sender password = config.mail.password message = MIMEMultipart() message["From"] = sender_email message["To"] = self.prof_mail message["Subject"] = self.mail_header.text() # include a Fcc to the senders sent folder message["cc"] = "semesterapparate@ph-freiburg.de" mail_body = self.mail_body.toHtml() message.attach(MIMEText(mail_body, "html")) mail = message.as_string() with smtplib.SMTP_SSL(smtp_server, port) as server: server.connect(smtp_server, port) # server.connect(smtp_server, port) # server.auth(mechanism="PLAIN") if config.mail.use_user_name is True: # print(config["mail"]["user_name"]) server.login(config.mail.user_name, password) else: server.login(sender_email, password) server.sendmail(sender_email, tolist, mail) # print("Mail sent") # end active process server.quit() logger.info("Mail sent, closing connection to server and dialog") # close the dialog self.accept() def launch_gui(app_id="", app_name="", app_subject="", prof_name="", prof_mail=""): app = QtWidgets.QApplication(sys.argv) dialog = Mail_Dialog( app_id=app_id, app_name=app_name, app_subject=app_subject, prof_name=prof_name, prof_mail=prof_mail, default_mail="Information bezüglich der Auflösung des Semesterapparates", ) dialog.show() sys.exit(app.exec()) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Dialog = QtWidgets.QDialog() ui = Mail_Dialog() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec())