Search code examples
pythonpdfemail-attachmentssendgrid

Python Sendgrid send email with PDF attachment file


I'm trying to attach a PDF file to my email sent with sendgrid.

Here is my code :

sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))

from_email = Email("[email protected]")
subject = "subject"
to_email = Email("[email protected]")
content = Content("text/html", email_body)

pdf = open(pdf_path, "rb").read().encode("base64")
attachment = Attachment()
attachment.set_content(pdf)
attachment.set_type("application/pdf")
attachment.set_filename("test.pdf")
attachment.set_disposition("attachment")
attachment.set_content_id(number)

mail = Mail(from_email, subject, to_email, content)
mail.add_attachment(attachment)

response = sg.client.mail.send.post(request_body=mail.get())

print(response.status_code)
print(response.body)
print(response.headers)

But the Sendgrid Python library is throwing an error HTTP Error 400: Bad Request.

What is wrong with my code ?


Solution

  • I found a solution. I replaced this line :

    pdf = open(pdf_path, "rb").read().encode("base64")
    

    By this :

    with open(pdf_path, 'rb') as f:
        data = f.read()
    
    encoded = base64.b64encode(data)
    

    Now it works. I can send encoded file in the set_content :

    attachment.set_content(encoded)
    

    Note: The answer above works for Sendgrid v2 or lower. For v3 and up use:

    encoded = base64.b64encode(data).decode()