flask_mail.Attachment不可JSON序列化

时间:2019-02-06 14:20:37

标签: flask celery flask-mail

我正在尝试使用celery发送电子邮件,它可以包含附件文件,不能包含附件,当我发送带有附件的电子邮件时发生错误,它说:

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)
            }
        )
)

0 个答案:

没有答案