【问题标题】:Stripe: attach invoice pdf to emailStripe:将发票 pdf 附加到电子邮件
【发布时间】:2020-05-28 12:02:35
【问题描述】:

我目前正在尝试使用 nodejs 向客户发送附有 pdf 发票的电子邮件,但我不知道如何从 invoice_pdf 字段获取 pdf 文件。

我尝试了fsgotrequest,但我无法获得文件内容。

例如我试过:

let file = await got(invoice.invoice_pdf)
let fileContent = Buffer.from(file['body'])
...
// mail conf
attachments: [{
    'type': 'application/pdf',
    'name': invoice.number + '.pdf',
    'content': fileContent.toString('base64'),
}],

收到的电子邮件附有一个pdf,但它是一个没有内容的空白页。

有什么帮助吗?
非常感谢

编辑:Mandrill 附件的文档

【问题讨论】:

  • 这个问题的答案取决于您的邮件服务期望 pdf 附件的格式。您能否分享您正在使用的工具的文档?不过,一般的方法是使用 axios 之类的库发出 GET 请求以获取 PDF 数据,然后将其作为附件传递给您的电子邮件服务。
  • 嗨 ttmarek,我刚刚使用 Mandrill 的附件文档编辑了我的帖子。我用提供的示例测试了我的代码,它运行良好。我真的认为问题出在我的fileContent 上,因为invoice_pdf 并不直接指向实际文件,而是指向在浏览器中动态生成和下载文件的页面
  • 我怀疑这个问题与您使用 got 检索 PDF 的方式有关。我对那个图书馆不太熟悉。可能值得在项目 repo 上提出一个问题,询问在 base64 中获取 PDF 的规范方法是什么。

标签: node.js stripe-payments


【解决方案1】:

我们使用流解决了这个问题:

async function readFile(url: string): Promise<Buffer> {
    return new Promise(function(resolve,reject){
        const bufs = []
        let finalBuf = Buffer.from('')
        got.stream(url)
        .on('data', d => bufs.push(d))
        .on('end', async function () {
            finalBuf = Buffer.concat(bufs)
            resolve(finalBuf)
        })
        .on('error', reject)
    })
}

export async function sendInvoiceEmail(invoice: Stripe.Invoice) {
    try {
            ...
            const finalBuf = await readFile(invoice.invoice_pdf)

            const options = {
                ...
                attachments: [
                    {
                        'type': 'application/pdf',
                        'name': 'invoice.pdf',
                        'content': finalBuf.toString('base64'),
                    }
                ],
            }

            await MailerClient.send(options)
    } catch (err) {
        logger.error(err, 'Error while trying to send mail')
        throw err
    }
}

感谢那些试图提供帮助的人:)

【讨论】:

    【解决方案2】:

    您是否尝试过使用NPM Package pdfreaderpdf2json 这些包将帮助您首先阅读内容,然后您可以将数据存储到变量中,然后将其传递到附件中。

    【讨论】:

    • 我做了,但它不起作用,因为invoice_pdf 就像https://pay.stripe.com/invoice/blibli/blabla/pdf。它不是实际的文件,该文件是在访问 url 时动态生成的。 pdfreaderpdf2json 都给出了类似 no such file 的错误
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-01-18
    相关资源
    最近更新 更多