Есть класс реализованный на основе модуля MIMEMultipart:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
class SendMessage(object):
def __init__(self, host, port, send_from, send_to):
self.host = host
self.port = port
self.send_from = send_from
self.send_to = send_to
def __enter__(self):
self.server = smtplib.SMTP(host=self.host, port=self.port)
self.server.starttls()
return self
def send(self, task, message, filelist=None, Subject=None, copy_to=None, msg_type=None):
# attach message
msg = MIMEMultipart(border = ';')
msg['From'] = self.send_from
msg['To'] = self.send_to
msg['CC'] = copy_to
if Subject is None:
msg['Subject'] = "Airflow result, dag: {task}.".format(task=task)
else:
msg['Subject'] = Subject
if msg_type == None:
msg.attach(MIMEText(message, 'plain'))
elif msg_type == 'html':
msg.attach(MIMEText(message, 'html'))
# attach file
if filelist is not None:
for file in filelist:
part = MIMEBase('application', "octet-stream")
part.set_payload(open(file, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=file)
msg.attach(part)
self.server.send_message(msg)
def __exit__(self, type, value, traceback):
self.server.quit()
Интересует функция send которая принимает список получателей и список в копию(msg['To'], msg['Cc']). Передается строка например: 'bla@mail.ru' или 'bla@mail.ru; blabla@mail.ru' (в копи тоже самое)
Далее мы запускаем эту функцию в блоке try except:
send_args = {
"host": 'exch.mail.local',
"port": 25,
"send_from": 'worker@mail.ru',
"send_to": 'bla@mail.ru; blabla@mailru'
}
try:
with SendMessage(**send_args) as email_host:
email_host.send(task=None, message='lol', Subject='lol', msg_type=msg_type)
print('Message Send')
except Exception as err:
print(f"Ошибка отправки сообщения: {err}")
Проблема: Нужно отлавливать случаи когда сообщение не отправилось или отправилось только части получателей. Хотелось бы понять как достать статус отправки сообщения из модуля