Files
SemesterapparatsManager/src/ui/dialogs/mail.py

218 lines
7.6 KiB
Python

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 = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style
type="text/css">
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: "\2610"; }
li.checked::marker { content: "\2612"; }
</style></head><body style=" font-family:''Segoe UI''; font-size:9pt; font-weight:400;
font-style:normal;">
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px;
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
"""
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("<html>")[0]
mail_html = mail_template.split("<html>")[1]
mail_html = "<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())