Как устранить ошибку: TypeError: требуется объект, похожий на байты, а не 'str' с FLASK-MAIL? - PullRequest
1 голос
/ 23 апреля 2019

В одном из моих проектов FLASK я использую электронную почту для отправки электронных писем. Я пытался прикрепить файл журнала к почте, но получил сообщение об ошибке: 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. Одним из решений было бы использование объекта байта (msg.attach(b'../logs/chaos.log', fp.read())). но это, похоже, не решает мою проблему. очевидно, существует существенное понятие, которое ускользает от меня, так как решить эту ошибку?

1 Ответ

0 голосов
/ 23 апреля 2019

Вы вводите неверные аргументы для msg.attach().См. API для правильных параметров.Первый аргумент должен быть именем файла, второй тип контента, третий данные.Поэтому вызов должен выглядеть примерно так:

with app.open_resource("../logs/chaos.log") as fp:
    msg.attach('chaos.log', 'text/plain', fp.read())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...