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