尝试从 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)
错误信息:
"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)