You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.7 KiB
Python

import sys
import re
import threading
from base64 import b64encode
from typing import *
from socket import *
from PyQt5.Qt import *
from main_window_ui import Ui_MainWindow
from log_window_ui import Ui_Dialog
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
@static_vars(
matcher=re.compile(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"))
def validate_email(email: str):
return validate_email.matcher.fullmatch(email)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.btnSendMail.clicked.connect(self.send_mail)
self.txtFrom.textChanged.connect(self.mail_changed)
def mail_changed(self):
pass
def send_mail(self):
servaddr = self.txtServer.text()
username = self.txtFrom.text()
password = self.txtPassword.text()
receiver = self.txtTo.text()
subjects = self.txtSubject.text()
contents = self.txtContent.toPlainText()
if not validate_email(username) or not validate_email(receiver):
QMessageBox.critical(self, "Invalid address", "Invalid From or To")
return
lw = LogWindow(
(servaddr, username, password, receiver, subjects, contents))
lw.exec()
class LogWindow(QDialog, Ui_Dialog):
def __init__(self, data):
super(LogWindow, self).__init__()
self.setupUi(self)
threading.Thread(target=self.do_update_status, args=(data, )).start()
def do_update_status(self, data):
(servaddr, username, password, receiver, subjects, contents) = data
ss = socket(AF_INET, SOCK_STREAM)
try:
ss.connect((servaddr, 25))
except Exception:
QMessageBox.critical(self, "Connection Failed",
"Failed connecting smtp server")
return
def comm(msg: str):
msg += "\r\n"
ss.sendall(msg.encode())
self.textBrowser.append("C: " + msg)
self.textBrowser.append("S: " + ss.recv(1 << 20).decode())
comm("HELO " + servaddr)
comm("AUTH LOGIN")
comm(b64encode(username.encode()).decode())
comm(b64encode(password.encode()).decode())
comm("MAIL FROM:<{}>".format(username))
comm("RCPT TO:<{}>".format(receiver))
comm("DATA")
comm('\r\n'.join(["Subject: " + subjects, "", contents, "."]))
comm("QUIT")
if __name__ == "__main__":
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
app.exec()