flask_mail.Attachment не является сериализуемым JSON - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь отправить письмо с помощью сельдерея, оно может содержать файл вложения и не может, ошибка возникает, когда я отправляю письмо с прикрепленным файлом, он говорит:

EncodeError: <flask_mail.Attachment object at 0x7f5061af70d0> is not JSON serializable

@celery.task(name='task.email')
def send_async_email(msg_dict):
    msg = Message()
    msg.__dict__.update(msg_dict)
    try:
        mail.send(msg)
    except SMTPRecipientsRefused:
        return "Email invalid"

def msg_to_dict(to, subject, template, attachment, **kwargs):
    app = current_app._get_current_object()
    msg = Message(
        subject=subject,
        sender=app.config['APP_MAIL_SENDER'],
        recipients=to
    )
    msg.body = template
    if attachment is not None:
        data = attachment.get_json()
        with app.open_resource(data.get('file')) as fp:
            msg.attach(data.get('name'), data.get('type'), fp.read())
    return msg.__dict__

def send_email(to, subject, template, attachment, **kwargs):
    send_async_email.delay(msg_to_dict(to, subject, template, attachment, **kwargs))

Внутри контроллера:

send_email(
    to=emails.split(','),
    subject=current_app.config['APP_LETTERS_TITLE'] + ' - ' + subject,
    template=html_body,
    sender=current_app.config['APP_MAIL_SENDER'],
    attachment=
        jsonify(
            {
                'name':str(file.filename),
                'type':str(file.content_type),
                'file':os.path.join(current_app.config['ATTACHMENTS_UPLOAD_FOLDER'], file.filename)
            }
        )
)
...