我已经创建了一个小的概念验证来测试从Gmail API检索PDF附件.我能够成功地阅读邮箱和附件.我能够从附件中提取数据,在经历了一些try 和错误后,我甚至无法打开PDF,现在我能够打开PDF了.但这些PDF文件被认为是乱码.此外,我收件箱大小中的原始PDF与以编程方式检索的PDF不同. 我觉得这和Base64解码有关.我做了谷歌搜索,try 了一些技巧,但似乎都不起作用.

在搜索SO时,建议使用decodeBase64函数中的技巧来使PDF工作.我已经在下面的代码中包含了它,但它也不起作用.

这是成功提取PDF附件并将其写入本地文件系统的代码.但是PDF附件的大小和我收件箱里的不一样,打开时会乱码.有什么建议吗?

const Base64 = require('js-base64')
......

// Successfully pulls attachments
async function getAttachment(messageId, attachmentId, auth) {
  const response = await google.gmail('v1').users.messages.attachments.get({
      auth: auth,
      userId: 'me',
      messageId: messageId,
      id: attachmentId
  });
  return response.data;
}

// Stack Overflow suggestion to fix PDF. It fixed "Unable to Open" file but PDF is still garbled.
function decodeBase64(str) {
  str = str.replace(/_/g, '/').replace(/-/g, '+') // important line
  return Base64.atob(str)
}


// Working code to pull messages with attachments from GMAIL code hidden for brevity
....
....
getAttachment(messageId, attachmentId, auth).then(attachmentBufferData => {
       fs.writeFile(part.filename, decodeBase64(attachmentBufferData.data));
});

推荐答案

在您的显示脚本中,如何进行以下修改?

修改后的脚本:

From:

function decodeBase64(str) {
  str = str.replace(/_/g, '/').replace(/-/g, '+') // important line
  return Base64.atob(str)
}

To:

function decodeBase64(str) {
  str = str.replace(/_/g, '/').replace(/-/g, '+');
  return Buffer.from(str, "base64");
}
  • 我认为在这种情况下,可能不需要使用str = str.replace(/_/g, '/').replace(/-/g, '+');.所以,请测试这两种模式是否有它.

另外,请修改如下.

From:

getAttachment(messageId, attachmentId, auth).then(attachmentBufferData => {
       fs.writeFile(part.filename, decodeBase64(attachmentBufferData.data));
});

To:

getAttachment(messageId, attachmentId, auth).then((attachmentBufferData) => {
  fs.writeFileSync(part.filename, decodeBase64(attachmentBufferData.data));
});

注:

  • 当我使用示例邮箱测试上述修改时,我确认PDF文件可以正确导出.
  • 修改后的脚本假定您的身份验证、邮件ID和附件ID为有效值.请注意这一点.

Node.js相关问答推荐

如果非SQL函数在事务内部运行失败,PG-Promise事务会回滚吗?

Node.js PNG缓冲区获取未知图像格式错误

在编译时强制不缩小类型范围

Mongodb - 在数组数组中查找()

使用单个 MongoDB 查询更新多个元素

如何在 node /快速服务器上配置 mongoDB

每个数组值在 mongodb 中查找一个文档

Angular Build 生产返回致命的 javascript 无效大小错误

try 在 NodeJS 项目中实现 SimplePay (OTP) 支付网关,但我无法获得与技术文档中相同的签名

Node.js |如何在微服务之间转发标头?

在新创建的 Angular 工作区上运行 ng lint 时出错

如何promise AWS JavaScript 开发工具包?

这到底是什么';拒绝未经授权';对我来说是什么意思?

Node JS:自动 Select `http.get`与`https.get`

React Native ios build:找不到 node

在单独的模块中定义 Mongoose 模型

名称类型为 mongoose 的字段

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

卸载代码/模块

用于轻松部署和更新的 Node.js 设置