Как устранить ошибку: TypeError: требуется объект, подобный байтам, а не ‘str’ с помощью FLASK-MAIL?

#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())