Python Sendgrid发送带有PDF附件文件的电子邮件

Joh*_*ohn 8 python pdf email-attachments sendgrid

我正在尝试将PDF文件附加到sendgrid发送的电子邮件中.

这是我的代码:

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

from_email = Email("from@example.com")
subject = "subject"
to_email = Email("to@example.com")
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)
Run Code Online (Sandbox Code Playgroud)

但是Sendgrid Python库抛出错误HTTP Error 400:Bad Request.

我的代码出了什么问题?

Joh*_*ohn 15

我找到了解决方案.我替换了这一行:

pdf = open(pdf_path, "rb").read().encode("base64")
Run Code Online (Sandbox Code Playgroud)

这样 :

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

encoded = base64.b64encode(data)
Run Code Online (Sandbox Code Playgroud)

现在它有效.我可以在set_content中发送编码文件:

attachment.set_content(encoded)
Run Code Online (Sandbox Code Playgroud)

注意:上面的答案适用于Sendgrid v2或更低版本.对于v3及以上使用:

encoded = base64.b64encode(data).decode()
Run Code Online (Sandbox Code Playgroud)

  • 就像旁注一样.你不需要`f.close()`因为退出`with`语句时文件被关闭了. (8认同)

Edd*_*Paz 10

这是我的解决方案,与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()
Run Code Online (Sandbox Code Playgroud)


Joh*_*rry 8

直接来自Sendgrid 文档

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)
Run Code Online (Sandbox Code Playgroud)

  • 是的,它现在在文档中,因为他们拿走了我的代码。我因此得到了奖励。他们给我寄来了 sendgrid 的好东西以寻求贡献 ^^ (2认同)