簡體   English   中英

Python Sendgrid 發送帶有 PDF 附件文件的電子郵件

[英]Python Sendgrid send email with PDF attachment file

我正在嘗試將 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)

但是 Sendgrid Python 庫拋出錯誤 HTTP 錯誤 400:錯誤請求。

我的代碼有什么問題?

我找到了解決方案。 我替換了這一行:

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

通過這個:

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

encoded = base64.b64encode(data)

現在它起作用了。 我可以在 set_content 中發送編碼文件:

attachment.set_content(encoded)

注意:以上答案適用於 Sendgrid v2 或更低版本。 對於 v3 及更高版本使用:

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

這是我的解決方案,適用於 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()

直接來自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)

“如何將多個文件附加到郵件中?”

構建附加附件:

file_path = 'test_filename1.pdf'
with open(file_path, 'rb') as f:
    data = f.read()
    f.close()
encoded = base64.b64encode(data).decode()
attachment1 = Attachment()
attachment1.file_content = FileContent(encoded)
attachment1.file_type = FileType('application/pdf')
attachment1.file_name = FileName('test_filename1.pdf')
attachment1.disposition = Disposition('attachment')
attachment1.content_id = ContentId('Example Content ID1')

file_path = 'test_filename2.pdf'
with open(file_path, 'rb') as f:
    data = f.read()
    f.close()
encoded = base64.b64encode(data).decode()
attachment2 = Attachment()
attachment2.file_content = FileContent(encoded)
attachment2.file_type = FileType('application/pdf')
attachment2.file_name = FileName('test_filename2.pdf')
attachment2.disposition = Disposition('attachment')
attachment2.content_id = ContentId('Example Content ID2')

mail.attachment = [attachment1,attachment2]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM