You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过SendGrid动态生成含自定义数据的PDF附件?

解决方案建议

一、自定义PDF生成的可靠路径

  • 优先在服务器端直接生成带客户专属数据的PDF:
    • 用成熟的PDF生成库,比如Python的ReportLab(支持从空白文档生成带自定义文本、表格的PDF)、PyPDF2(基于模板PDF填充自定义数据);Node.js可选pdfkit或html-pdf(先渲染含客户数据的HTML,再转PDF)。这种方式能完全控制PDF生成流程,避免URL传输带来的问题。
    • 如果依赖第三方PDF生成服务,务必先验证服务返回的内容:用curl -o test.pdf https://your-pdf-service-url下载文件,打开确认是否为有效PDF,同时检查响应头的Content-Type是否为application/pdf,Content-Disposition是否包含attachment标识。

二、SendGrid添加PDF附件的正确操作

SendGrid API要求附件内容为Base64编码的二进制数据,以下是关键实现要点:

  • 不管是本地生成的PDF还是从服务拉取的有效二进制流,都要先做Base64编码,且编码后的字符串不能有换行、截断。
  • 示例代码(Python):
    import base64
    import os
    from sendgrid import SendGridAPIClient
    from sendgrid.helpers.mail import Mail, Attachment, FileContent, FileName, FileType, Disposition
    
    # 读取/生成客户专属PDF的二进制内容
    with open("client_custom_data.pdf", "rb") as f:
        pdf_bin = f.read()
    encoded_pdf = base64.b64encode(pdf_bin).decode("utf-8")
    
    # 构造邮件
    msg = Mail(
        from_email="your-sender@domain.com",
        to_emails="client@example.com",
        subject="你的专属数据PDF",
        html_content="<p>请查收附件中的专属PDF文档</p>"
    )
    
    # 配置附件
    attachment = Attachment()
    attachment.file_content = FileContent(encoded_pdf)
    attachment.file_name = FileName(f"client_{client_id}_data.pdf")
    attachment.file_type = FileType("application/pdf")
    attachment.disposition = Disposition("attachment")
    msg.attachment = attachment
    
    # 发送邮件
    sg = SendGridAPIClient(os.environ.get("SENDGRID_API_KEY"))
    sg.send(msg)
    

三、URL生成PDF损坏的常见排查点

  • 响应内容错误:如果第三方服务返回的是HTML页面(比如权限错误、参数错误页面)而非二进制PDF,直接编码会导致文件损坏。用浏览器访问URL,确认下载的是有效PDF,或在代码中检查响应状态码(必须是200)及响应头的Content-Type。
  • 请求模式错误:用HTTP库获取PDF时,务必以二进制模式读取内容。比如Python的requests库要加stream=True并取response.content,而非response.text(后者会把二进制转成文本,破坏PDF结构)。
  • 编码遗漏/重复:如果URL返回的是已Base64编码的PDF字符串,不要重复编码,直接使用该字符串作为file_content的值;如果是原始二进制,则必须做Base64编码。

内容的提问来源于stack exchange,提问作者Takuhii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:02:35