mail.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from dataclasses import dataclass
  2. import smtplib
  3. import ssl
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6. from email.mime.application import MIMEApplication
  7. from email.utils import make_msgid
  8. import config
  9. @dataclass
  10. class Message:
  11. mailto: str
  12. subject: str
  13. html: str
  14. attachment: list
  15. class mail:
  16. connected = False
  17. def __init__(self, cfg=None):
  18. self.cfg = cfg
  19. if cfg is None:
  20. self.cfg = config.config()
  21. self.mail_cfg = self.cfg.smtp
  22. self.reply_to = self.cfg.kunde.replace(' ', '-').lower() + '@global-cube.com'
  23. self.context = ssl.create_default_context()
  24. def __enter__(self):
  25. try:
  26. if self.mail_cfg.secure == 'ssl':
  27. self.mailserver = smtplib.SMTP_SSL(self.mail_cfg.server, self.mail_cfg.port, context=self.context)
  28. else:
  29. self.mailserver = smtplib.SMTP(self.mail_cfg.server, self.mail_cfg.port)
  30. self.mailserver.set_debuglevel(1)
  31. if self.mail_cfg.secure == 'tls':
  32. # self.context.options |= ssl.OP_NO_TLSv1_2 | ssl.OP_NO_TLSv1_3
  33. self.context.minimum_version = ssl.TLSVersion["TLSv1_2"]
  34. self.mailserver.ehlo()
  35. self.mailserver.starttls(context=self.context)
  36. print(self.mailserver.login(self.mail_cfg.username, self.mail_cfg.password))
  37. print(self.mailserver.noop())
  38. self.connected = True
  39. except smtplib.SMTPException as e:
  40. print(e)
  41. return self
  42. def __exit__(self, exc_type, exc_val, exc_tb):
  43. if self.mailserver.connected:
  44. self.mailserver.quit()
  45. def send(self, mailto, subject, html, attachment=None):
  46. msg = self.message(mailto, subject, html, attachment)
  47. msg['Message-ID'] = make_msgid(domain=self.mail_cfg.server)
  48. res = {'id': msg['Message-ID'], 'mailto': mailto, 'status': 'OK'}
  49. try:
  50. result = self.mailserver.sendmail(self.mail_cfg.email, mailto, '\n' + msg.as_string())
  51. print(result)
  52. except smtplib.SMTPException as e:
  53. print(e)
  54. def message(self, mailto, subject, html, attachment):
  55. msg = MIMEMultipart('alternative')
  56. msg['Reply-To'] = self.reply_to
  57. msg['From'] = f'Global Cube <{self.mail_cfg.email}>'
  58. msg['To'] = mailto
  59. msg['Subject'] = subject
  60. # text = '\n'.join([x for x, _ in attachment])
  61. # msg.attach(MIMEText(text, 'plain'))
  62. msg.attach(MIMEText(html, 'html'))
  63. for name, filename in attachment or []:
  64. with open(filename, "rb") as f:
  65. part = MIMEApplication(f.read(), Name=name)
  66. part['Content-Disposition'] = f'attachment; filename="{name}"'
  67. msg.attach(part)
  68. return msg
  69. if __name__ == '__main__':
  70. with mail() as m:
  71. m.send('robert.bedner@gmail.com', 'Test 123', ['C:\\GAPS\\Portal\\daten\\1_1_Taegliche_Erfolgskontrolle_1.pdf'])