通过 Google Drive 和 Nodemailer 发送 PDF 附件

通过 Google Drive 和 Nodemailer 发送 PDF 附件
Node.js

发送附件而不下载

使用 Node.jsNodemailer 直接从 Google Drive 发送电子邮件附件可以简化工作流程,但也可能导致空白 PDF 等问题。此方法避免下载文件,而是使用 Google Drive API 以所需格式导出文件。目标是将文件处理直接从云存储无缝集成到电子邮件通信中。

然而,可能会出现挑战,例如附件在收到时显示为空白。即使电子邮件成功发送并模仿原始文件的页面结构,也可能会发生这种情况。了解并解决这些问题对于维护通过此类自动化流程发送的文档的完整性至关重要。

命令 描述
google.drive 使用提供的特定版本和身份验证详细信息初始化 Google Drive API 客户端。
drive.files.export 根据指定的文件 ID 和 MIME 类型从 Google Drive 导出文件,允许以不同格式下载文件,无需手动下载。
nodemailer.createTransport 使用 SMTP 传输创建可重用的传输器对象,此处为具有 OAuth2 身份验证的 Gmail 配置。
transporter.sendMail 发送带有定义的邮件选项的电子邮件,包括附件和内容类型。
OAuth2 处理 OAuth2 身份验证,这是安全访问和修改 Google 服务所必需的。
oauth2Client.getAccessToken 从 Google 的 OAuth 2.0 服务器检索访问令牌以对请求进行身份验证。

解释电子邮件附件的 Node.js 和 Google API 集成

该脚本使用 Node.js 与 Google Drive 交互并通过以下方式发送电子邮件 节点邮件程序 无需下载文件。首先, 谷歌驱动器 命令初始化 Google Drive API,使应用程序能够访问用户的驱动器。这 驱动器.文件.导出 命令至关重要,因为它使用数组缓冲区响应类型直接以 PDF 格式导出文件。这避免了下载和重新上传文件的需要,从而促进从 Google Drive 到电子邮件的直接流。

节点邮件程序 然后利用库来处理电子邮件发送过程。通过使用设置传输器 节点邮件程序.createTransport,该脚本使用 OAuth2 配置 Gmail 的 SMTP 设置,确保使用通过以下方式获得的令牌进行安全身份验证 oauth2Client.getAccessToken。最后, 传输器.sendMail 命令发送带有 PDF 附件的电子邮件。如果附件显示为空白,则问题可能与 PDF 数据在这些过程中的缓冲或流式传输方式有关。

修复通过 Google Drive 和 Nodemailer 发送的空白 PDF

Node.js 服务器端解决方案

const {google} = require('googleapis');
const nodemailer = require('nodemailer');
const {OAuth2} = google.auth;
const oauth2Client = new OAuth2({
  clientId: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET',
  redirectUri: 'https://developers.google.com/oauthplayground'
});
oauth2Client.setCredentials({
  refresh_token: 'YOUR_REFRESH_TOKEN'
});
const drive = google.drive({version: 'v3', auth: oauth2Client});
async function sendEmail() {
  const attPDF = await drive.files.export({
    fileId: 'abcde123',
    mimeType: 'application/pdf'
  }, {responseType: 'stream'});
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      type: 'OAuth2',
      user: 'your.email@example.com',
      clientId: 'YOUR_CLIENT_ID',
      clientSecret: 'YOUR_CLIENT_SECRET',
      refreshToken: 'YOUR_REFRESH_TOKEN',
      accessToken: await oauth2Client.getAccessToken()
    }
  });
  const mailOptions = {
    from: 'your.email@example.com',
    to: 'recipient@example.com',
    subject: 'Here is your PDF',
    text: 'See attached PDF.',
    attachments: [{
      filename: 'MyFile.pdf',
      content: attPDF,
      contentType: 'application/pdf'
    }]
  };
  await transporter.sendMail(mailOptions);
  console.log('Email sent successfully');
}
sendEmail().catch(console.error);

了解 Node.js 中的流处理和缓冲区转换

使用 Node.js 和 Google Drive 的 API 通过电子邮件发送附件时,正确处理流和缓冲区操作以确保文件的完整性至关重要。在这种情况下,了解 Node.js 中流和缓冲区的性质可以查明附件可能显示为空白的原因。 Node.js 缓冲区用于处理二进制数据。当来自 Google Drive 的数据作为数组缓冲区接收时,必须将其转换为与 Nodemailer 兼容的格式,以确保文件内容在传输过程中保持完整。

此转换过程至关重要,因为任何处理不当或不正确的缓冲区转换都可能导致数据损坏或文件传输不完整,如 PDF 附件中的空白页所示。重要的是要确保正确管理从 Google Drive 到 Nodemailer 的流,并且在将数据附加到电子邮件之前,缓冲区适当地填充了从 Drive 获取的数据。这涉及深入研究 Node.js 中的流事件处理和缓冲区管理。

使用 Node.js 和 Google Drive 发送电子邮件附件:常见问题

  1. 问题: 如何在 Node.js 中使用 Google Drive API 进行身份验证?
  2. 回答: 通过使用您的客户端 ID、客户端密钥和重定向 URI 设置 OAuth2 客户端来使用 OAuth 2.0 身份验证,然后检索访问令牌。
  3. 问题: 为什么我的 PDF 附件以空白文件形式发送?
  4. 回答: 这通常是由于在将文件附加到电子邮件之前对文件的字节流或缓冲区转换处理不当而导致的。
  5. 问题: 使用 Node.js 发送带附件的电子邮件有哪些必要的依赖项?
  6. 回答: 主要依赖项是用于发送电子邮件的“nodemailer”和用于与 Google Drive 交互的“googleapis”。
  7. 问题: 如何将 Google Drive 文件转换为缓冲区而不下载它?
  8. 回答: 使用“files.export”方法,将“responseType”设置为“arrayBuffer”,并适当转换此缓冲区以用于电子邮件附件。
  9. 问题: 我可以使用 Gmail 之外的其他电子邮件服务直接从 Google 云端硬盘发送附件吗?
  10. 回答: 是的,只要电子邮件服务支持 SMTP 并且您使用该服务的适当 SMTP 设置来配置 Nodemailer。

总结 Node.js 中的附件处理

Google Drive 通过 Node.jsNodemailer 集成,提供了一个强大的工具来处理应用程序中的文件附件。但是,开发人员必须确保正确管理流,并在整个过程中保持数据完整性,以防止附件中出现空白页等问题。此场景强调了彻底测试和理解 JavaScript 后端中的流和缓冲区处理的重要性。