#python-3.x #flask
#python-3.x #flask
Вопрос:
В одном из моих проектов FLASK я использую flask-mail для отправки электронных писем. Я попытался прикрепить файл журнала к почте, но получаю сообщение об ошибке: TypeError: a bytes-like object is required, not 'str'
. Вот полная ошибка:
Exception in thread Thread-37:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "/home/Tobin/Documents/PYTHON-PROJECTS/FLASK CHAOS V1/app/email.py", line 7, in send_async_email
mail.send(msg)
File "/home/Tobin/.local/lib/python3.7/site-packages/flask_mail.py", line 492, in send
message.send(connection)
File "/home/Tobin/.local/lib/python3.7/site-packages/flask_mail.py", line 427, in send
connection.send(self)
File "/home/Tobin/.local/lib/python3.7/site-packages/flask_mail.py", line 190, in send
message.as_bytes() if PY3 else message.as_string(),
File "/home/Tobin/.local/lib/python3.7/site-packages/flask_mail.py", line 385, in as_bytes
return self._message().as_bytes()
File "/home/Tobin/.local/lib/python3.7/site-packages/flask_mail.py", line 349, in _message
f = MIMEBase(*attachment.content_type.split('/'))
TypeError: a bytes-like object is required, not 'str'
Вот мой код:
from threading import Thread
from flask_mail import Message
from app import app, mail
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email(subject, sender, recipients, text_body):
msg = Message(subject, sender=sender, recipients=recipients)
msg.body = text_body
with app.open_resource("../logs/chaos.log") as fp:
msg.attach(b'../logs/chaos.log', fp.read())
Thread(target=send_async_email, args=(app, msg)).start()
Я прочитал в предыдущем сообщении, что было невозможно открыть файл в двоичном режиме и обработать его как str. Одним из решений было бы использовать объект byte ( msg.attach(b'../logs/chaos.log', fp.read())
). но это, похоже, не решает мою проблему. по-видимому, есть важное понятие, которое ускользает от меня, так как решить эту ошибку?
Ответ №1:
Вы предоставляете неправильные аргументы msg.attach()
. Правильные параметры см. в API. Первым аргументом должно быть имя файла, вторым — тип содержимого, третьим — данные. Таким образом, вызов должен читать что-то вроде этого:
with app.open_resource("../logs/chaos.log") as fp:
msg.attach('chaos.log', 'text/plain', fp.read())