首页 > 解决方案 > 尝试从 S3 发送文件作为电子邮件附件时,字节类型的对象不是 JSON 可序列化的

问题描述

错误信息:

"errorMessage": "bytes 类型的对象不是 JSON 可序列化的"

def _get_file():
    s3 = boto3.resource('s3')
    obj = s3.Object(S3_BUCKET_NAME, S3_ITEM_NAME)
    return obj.get()['Body'].read()

def _send_email_with_ebook(email):
    data = {
        ...
        "attachments": [
            {
                "content": _get_ebook_file(),
                "type": "application/pdf",
                "filename": "my_file.pdf"
            }
        ]
    }

    headers = {'Authorization': 'Bearer {}'.format(SENDGRID_API_KEY), 'Content-Type': 'application/json'}
    r = requests.post(SENDGRID_API_URL, json=data, headers=headers)

标签: pythonamazon-web-servicesamazon-s3sendgrid-api-v3

解决方案


您需要对您的文件内容进行 base64 编码,例如:

import base64

def _get_file():
    s3 = boto3.resource('s3')
    obj = s3.Object(S3_BUCKET_NAME, S3_ITEM_NAME)
    return obj.get()['Body'].read()

def _send_email_with_ebook(email):
    data = {
        ...
        "attachments": [
            {
                "content": base64.b64encode(_get_ebook_file()),
                "type": "application/pdf",
                "filename": "my_file.pdf"
            }
        ]
    }

    headers = {'Authorization': 'Bearer {}'.format(SENDGRID_API_KEY), 'Content-Type': 'application/json'}
    r = requests.post(SENDGRID_API_URL, json=data, headers=headers)

推荐阅读