Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >附件不起作用的Node.js Gmail API草稿

附件不起作用的Node.js Gmail API草稿
EN

Stack Overflow用户
提问于 2021-07-18 06:36:49
回答 1查看 90关注 0票数 1

我正在尝试使用Gmail API在Node.js中创建一个简单的带有PDF附件的草稿。草稿被创建并在Gmail中显示,但它没有附件。此外,当在Gmail中点击草稿时,它会打开一个没有标题或内容的空草稿。当我尝试使用几乎相同的代码发送电子邮件时,它工作得很好。

这是我的代码:

代码语言:javascript
运行
AI代码解释
复制
const createMailEncodedMessage = async (params) => {
    const msg = await buildMailBody(params)

    // The body needs to be base64url encoded.
    const encodedMessage = Buffer.from(msg)
        .toString('base64')
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=+$/, '')

    return encodedMessage
}

const sendEmail = async (params) => {
    if (!auth) {
        await init()
    }

    const encodedMessage = await createMailEncodedMessage(params)
    return await gmail.users.messages.send({
        userId: 'me',
        requestBody: {
            raw: encodedMessage,
        },
    })
}

const createDraft = async (params) => {
    if (!auth) {
        await init()
    }

    const encodedMessage = await createMailEncodedMessage(params)

    return await gmail.users.drafts.create({
        userId: 'me',
        requestBody: {
            message: {
                raw: encodedMessage,
            }
        }
    })
}

const buildMailBody = ({ from, to, subject, body, attachments }) => {
    return new Promise((resolve, reject) => {
        let mail = new MailComposer({
            from,
            to,
            //text: 'I hope this works',
            html: body,
            subject,
            textEncoding: 'base64',
            attachments: attachments?.map(a => ({
                filename: a.fileName,
                content: fs.createReadStream(a.filePath),
            })),
        })

        mail.compile().build((error, msg) => {
            if (error) {
                reject(error)
            }

            resolve(msg)
        })
    })
}
EN

回答 1

Stack Overflow用户

发布于 2021-08-11 01:09:41

在回顾了这个问题之后,我开发了一个代码,您可以使用它来实现您的目标。此脚本将发送一封带有两个示例附件的users.messages.send电子邮件。我使用quickstart中描述的凭据流来管理令牌和作用域。请记住,您将需要一个方法来处理电子邮件MIME类型和base64转换。为了制作一个工作示例,我使用了MailComposer库来控制MIME类型。以下脚本应按原样工作,您只需设置凭据以使其运行(您可以使用快速入门中描述的步骤):

代码语言:javascript
运行
AI代码解释
复制
const fs = require('fs');
const readline = require('readline');
const {
  google
} = require('googleapis');
const MailComposer = require('nodemailer/lib/mail-composer');
const SCOPES = ['https://mail.google.com/'];
const TOKEN_PATH = 'token.json';

fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  authorize(JSON.parse(content), sendEmailWithAttachments);
});

function authorize(credentials, callback) {
  const {
    client_secret,
    client_id,
    redirect_uris
  } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
    client_id, client_secret, redirect_uris[0]);

  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getNewToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

function getNewToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token',
        err);
      oAuth2Client.setCredentials(token);
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

function sendEmailWithAttachments(auth) {
  let mail = new MailComposer({
    to: "{ RECIPIENT EMAIL }",
    text: "Morbi imperdiet gravida leo in commodo.",
    html: "Morbi <i>imperdiet</i> gravida <b>leo</b> in commodo.",
    subject: "Donec et porttitor erat",
    textEncoding: "base64",
    attachments: [{
        filename: 'attachment1.txt',
        content: 'UHJhZXNlbnQgc2VtcGVyIGF1Z3VlIHV0IGJpYmVuZHVtIHVsbGFtY29ycGVyLiBOdW5jIGluIG1hdXJpcyB1dCBxdWFtIHRyaXN0aXF1ZSBwcmV0aXVtIHF1aXMgZXQgbWkuIER1aXMgZW5pbSBsZW8sIGltcGVyZGlldCBxdWlzIHVybmEgZXUsIHBsYWNlcmF0IGZpbmlidXMgcXVhbS4gRXRpYW0gbWFzc2EgbG9yZW0sIHJ1dHJ1bSB2ZWwgc29kYWxlcyBhYywgYWNjdW1zYW4gZXQgcHVydXMuIFV0IG5lYyBsb3JlbSBpbnRlcmR1bSwgYWxpcXVhbSBuaXNpIGVnZXN0YXMsIGVnZXN0YXMgZWxpdC4gSW50ZWdlciB2ZWwgb3JuYXJlIGVyb3MsIGVnZXQgbGFjaW5pYSB2ZWxpdC4gRXRpYW0gZGlhbSBzZW0sIGFsaXF1YW0gYSBzb2xsaWNpdHVkaW4gdml0YWUsIHBvcnRhIGFjIGVsaXQuIEludGVyZHVtIGV0IG1hbGVzdWFkYSBmYW1lcyBhYyBhbnRlIGlwc3VtIHByaW1pcyBpbiBmYXVjaWJ1cy4gU3VzcGVuZGlzc2UgbmVjIGltcGVyZGlldCB1cm5hLiBTdXNwZW5kaXNzZSBhIGVzdCB1bHRyaWNpZXMsIHZlbmVuYXRpcyB1cm5hIGlkLCBzY2VsZXJpc3F1ZSBwdXJ1cy4gQWVuZWFuIHN1c2NpcGl0IGxhY3VzIHNlbSwgYXQgZWdlc3RhcyBhbnRlIGFsaXF1YW0gYXQu',
        encoding: 'base64'
      },
      {
        filename: 'attachment2.txt',
        content: 'VmVzdGlidWx1bSBwdWx2aW5hciBzZW1wZXIgY29udmFsbGlzLiBPcmNpIHZhcml1cyBuYXRvcXVlIHBlbmF0aWJ1cyBldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLCBuYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBNYWVjZW5hcyBvcm5hcmUganVzdG8gc2VkIGFyY3UgaWFjdWxpcyBlZmZpY2l0dXIuIEZ1c2NlIHJob25jdXMsIGVzdCBmaW5pYnVzIGRpZ25pc3NpbSB2YXJpdXMsIHNhcGllbiB0dXJwaXMgcGxhY2VyYXQgcmlzdXMsIHNpdCBhbWV0IGZpbmlidXMgbmliaCBmZWxpcyBldSBsYWN1cy4gUHJvaW4gZWxlbWVudHVtLCBlcmF0IGEgYXVjdG9yIGx1Y3R1cywgcmlzdXMgb2RpbyBmcmluZ2lsbGEgcmlzdXMsIGlkIGNvbW1vZG8gbG9yZW0gdmVsaXQgaWQgbnVuYy4gRnVzY2Ugc2VkIHB1bHZpbmFyIG5pc2wsIGlkIGx1Y3R1cyBlcmF0LiBNYWVjZW5hcyBuZWMgY29uZGltZW50dW0gZmVsaXMuIE51bmMgZWxlbWVudHVtLCBqdXN0byBhIHZvbHV0cGF0IGJsYW5kaXQsIG1hZ25hIGlwc3VtIHBvcnRhIGFudGUsIHF1aXMgYmliZW5kdW0gbGVjdHVzIG9yY2kgdXQgbWF1cmlzLiBGdXNjZSBwdWx2aW5hciBmZWxpcyBhdCBudW5jIGNvbnNlY3RldHVyIGRpY3R1bS4gRXRpYW0gdmFyaXVzLCB0dXJwaXMgdGluY2lkdW50IHByZXRpdW0gcnV0cnVtLCBtZXR1cyBtYXVyaXMgbW9sZXN0aWUgZXgsIG5lYyBldWlzbW9kIGVuaW0ganVzdG8gYXQgZXN0Lg',
        encoding: 'base64'
      },
    ]
  });
  
  mail.compile().build((error, msg) => {
    if (error) return console.log('ERROR - ' + error);
    const encodedMessage = Buffer.from(msg).toString('base64').replace(
      /\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
    const gmail = google.gmail({
      version: 'v1',
      auth
    });
    gmail.users.messages.send({
      userId: 'me',
      resource: {
        raw: encodedMessage,
      }
    }, (err, result) => {
      if (err) return console.log('ERROR: ' + err);
      console.log("Email sent: ", result.data);
    });
  })
}

该脚本分两个步骤工作。首先,它使用该库构建与标准MIME类型兼容的电子邮件。其次,它使用先前构建的电子邮件调用Gmail API。如果邮件发送成功,接口会返回邮件的ID和标签。如有疑问,请留言澄清。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68426653

复制
相关文章
(二)html 复杂表格
---- <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>程序员之美</title> <meta charset="utf-8" /> <style type="text/css"> /*表格样式*/ table { width: 90%; back
花狗Fdog
2020/11/03
2.5K0
(二)html 复杂表格
python生成html表格
最近做一个小工具,需要将统计数据生成html表格。在网上搜罗一圈后发现用pandas生成表格非常好用。代码如下:
py3study
2020/01/13
7.2K0
网站抓取引子 - 获得网页中的表格
爬虫是都不陌生的一个概念,比如百度、谷歌都有自己的爬虫工具去抓取网站、分析、索引,方便我们的查询使用。 在我们浏览网站、查询信息时,如果想做一些批量的处理,也可以去分析网站的结构、抓取网页、提取信息,然后就完成了一个小爬虫的写作。 网页爬虫需要我们了解URL的结构、HTML语法特征和结构,以及使用合适的抓取、解析工具。我们这篇先看一个简单的处理,给一个直观的感受:一个函数抓取网页的表格。以后再慢慢解析如何更加定制的获取信息。 HMDB (人类代谢组数据库)收录了很多代谢组的数据,用于代谢组学、临床化学、生物
生信宝典
2018/02/05
3.1K0
网站抓取引子 - 获得网页中的表格
HTML表格中<td scope="col">与<td scope="row">的含义
HTML表格中<td scope="col">与<td scope="row">的含义
wfaceboss
2019/04/08
2.4K0
html中表格整体居中,html中怎么把表格居中
html中把表格居中的方法:首先创建一个HTML示例文件;然后使用table标签创建一个两行两列的表格;接着给table标签添加一个class属性;最后将margin属性设置为“0 auto”即可。
全栈程序员站长
2022/07/22
14.6K0
html中表格整体居中,html中怎么把表格居中
抓取html页面中的json数据
抓取html页面中的json数据
Java架构师必看
2021/08/03
3.3K0
Python 抓取邮件中表格到Excel
上代码 import imapclient # 这个包导不进来,先导入 pyzmail36,下载好后再改回 pyzmail 即可 import pyzmail from bs4 import BeautifulSoup import pandas as pd import xlsxwriter import html5lib # 提取邮件里面的表格 class my_eamil(): """ 构造函数,创建一个类的入口 self指的是类实例对象本身
Java架构师必看
2021/08/09
1.3K0
Python用列表生成html表格
Python用列表生成html表格 d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } def generate_tr(name, score): if score < 60: #如果小于60分,表格输出时标红 return '<tr><td>%s</td><td style="color:red">%s</td></tr>'% (name,score) else: return '<tr><td>%s</td><td>%s
py3study
2020/01/13
3.2K0
python爬虫图片抓取(python从网络上抓取照片)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128295.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
1.6K0
python爬虫图片抓取(python从网络上抓取照片)
Python自动化邮件添加HTML表格图像和Excel附件
wb = load_workbook(fileName,data_only=True)
沈宥
2022/05/09
6250
Python自动化邮件添加HTML表格图像和Excel附件
html表格
<table>、<tr>和<td>是HTML表格最基本的3个标签,其他标题标签<caption>、表头单元格<th>可以没有,但是这3者必须要有。
Qwe7
2022/05/16
4.1K0
Html 表格
看了上图百度的搜索页面,有木有心动一下,别慌你也能够的。这就是我们今天要讲的表单。
全栈程序员站长
2022/07/05
3.3K0
Html 表格
HTML表格
            4.cellspacing:外边距(单元格和单元格之间的距离)
十月梦想
2018/08/29
4.1K0
HTML表格代码_html如何制作表格代码
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169633.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
14.9K0
七 .Html的表格
1.表格 owspan 纵向的合并单元格 colspan 横向的合并单元格 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Docume
小海怪的互联网
2020/10/26
2.1K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
数据森麟
2019/11/29
1.1K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
一墨编程学习
2019/08/20
1.6K0
Python 自动整理 Excel 表格
相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作。最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格的自动化整理。
短短的路走走停停
2019/07/30
2.2K0
Python 自动整理 Excel 表格
html代码大全表格_html表格代码怎么写
在做前台html中我们经常用到一些表格,苦逼的后台程序猿大多都简简单单的写一些标签,下面分享一下只用h5就能写出一些精美的form
全栈程序员站长
2022/09/22
7.9K0
点击加载更多

相似问题

VBA HTML表格抓取-特定于复杂表格的原始数据

111

我可以在Python中从html文件中抓取表格吗?

112

用Python从网页中抓取表格

43

HTML复杂表格

20

Python从网站上抓取表格?

012
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文