使用 nodejs fs 从电子邮件中保存 PDF

Save PDF from email using nodejs fs

我正在使用一个名为 mail-notifier 的 npm 包来处理收到的新电子邮件,我希望能够将附件保存到文件夹中,node fs 似乎能够做到这一点,但我可以想通了。

这是附件如何进入的示例。

{
  contentType: 'application/pdf',
  transferEncoding: 'base64',
  contentDisposition: 'attachment',
  fileName: 'somedocument.pdf',
  generatedFileName: 'somedocument.pdf',
  contentId: 'f0b4b8a7983590814558ce2976c71629@mailparser',
  checksum: 'bc084ae645fd6e6da0aa4d74c9b95ae6',
  length: 29714,
  content: <Buffer 25 50 44 46 2d 31 2e 34 0a 25 d3 eb e9 e1 0a 31 20 30 20 6f 62 6a 0a 3c 3c 2f 43 72 65 61 74 6f 72 20 28 43 68 72 6f 6d 69 75 6d 29 0a 2f 50 72 6f 64 ... 29664 more bytes>
}

这是我在其他地方看到的尝试过的方法,但上面写着

mail.attachments.forEach((attachment) => {
 var output = fs.createWriteStream('/example-folder/' + attachment.generatedFileName);
 attachment.stream.pipe(output);
});

虽然说 stream.pipe 不是函数,但会抛出错误。

我要将缓冲区传递给写入流吗?缓冲区和它有什么关系吗?

由于文件是作为Buffer存储在attachment.content中的,所以有两种使用方法:

  1. 您可以使用 fs.writeFile('/example-folder/' + attachment.generatedFileName, attachment.content );
  2. output.write(attachment.content);.end 如果你也想关闭文件)

(1) uses the non-streaming API while (2) uses the streaming API but has no performance benefit since the whole file is already in memory

尝试stream

const { PassThrough } = require('stream');
 
 
mail.attachments.forEach((attachment) => {
    var output = fs.createWriteStream('/example-folder/' + attachment.generatedFileName);
    var pass = new PassThrough();
    pass.end(attachment.content);
    pass.pipe(output);
});