尝试从 S3 发送文件作为电子邮件附件时,字节类型的对象不可 JSON 序列化

Object of type bytes is not JSON serializable when trying to send a file from S3 as an email attachment

错误信息:

"errorMessage": "Object of type bytes is not JSON serializable"

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)

您需要将您的文件内容编码为 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)