Python Sendgrid send email with PDF attachment file

后端 未结 3 1986

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_A         


        
相关标签:
3条回答
  • 2021-01-12 01:07

    Straight from the Sendgrid docs:

    import urllib.request as urllib
    import base64
    import os
    import json
    from sendgrid import SendGridAPIClient
    from sendgrid.helpers.mail import (Mail, Attachment, FileContent, FileName, FileType, Disposition, ContentId)
    
    import os
    import json
    from sendgrid import SendGridAPIClient
    from sendgrid.helpers.mail import Mail
    
    message = Mail(
        from_email='from_email@example.com',
        to_emails='to@example.com',
        subject='Sending with Twilio SendGrid is Fun',
        html_content='<strong>and easy to do anywhere, even with Python</strong>')
    file_path = 'example.pdf'
    with open(file_path, 'rb') as f:
        data = f.read()
        f.close()
    encoded = base64.b64encode(data).decode()
    attachment = Attachment()
    attachment.file_content = FileContent(encoded)
    attachment.file_type = FileType('application/pdf')
    attachment.file_name = FileName('test_filename.pdf')
    attachment.disposition = Disposition('attachment')
    attachment.content_id = ContentId('Example Content ID')
    message.attachment = attachment
    try:
        sendgrid_client = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
        response = sendgrid_client.send(message)
        print(response.status_code)
        print(response.body)
        print(response.headers)
    except Exception as e:
        print(e.message)
    
    0 讨论(0)
  • 2021-01-12 01:15

    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()
    
    0 讨论(0)
  • 2021-01-12 01:25

    This is my solution, Works with Sendgrid V3

        # Where it was uploaded Path.
        file_path = "MY_FILE_PATH"
    
        with open(file_path, 'rb') as f:
            data = f.read()
    
        # Encode contents of file as Base 64
        encoded = base64.b64encode(data).decode()
    
        """Build attachment"""
        attachment = Attachment()
        attachment.content = encoded
        attachment.type = "application/pdf"
        attachment.filename = "my_pdf_attachment.pdf"
        attachment.disposition = "attachment"
        attachment.content_id = "PDF Document file"
    
        sg = sendgrid.SendGridAPIClient(apikey=settings.SENDGRID_API_KEY)
    
        from_email = Email("origin@gmail.com")
        to_email = Email('recipient@gmail.com')
        content = Content("text/html", html_content)
    
        mail = Mail(from_email, 'Attachment mail PDF', to_email, content)
        mail.add_attachment(attachment)
    
        try:
            response = sg.client.mail.send.post(request_body=mail.get())
        except urllib.HTTPError as e:
            print(e.read())
            exit()
    
    0 讨论(0)
提交回复
热议问题