【问题标题】:send email with gmail api not working使用gmail api发送电子邮件不起作用
【发布时间】:2017-01-22 11:28:57
【问题描述】:

我正在尝试使用 node.js 中的 google api 发送电子邮件

var sendmsg = function(auth) {

var to = 'foo@gmail.com',
    subject = 'Hello World',
    content = 'send a Gmail.'

var email = "To:  "+ to +"\r\n"+
    "Subject: "+subject+"\r\n"+
    content;

 var base64EncodedEmail = new Buffer(email).toString('base64');
 var gmail = google.gmail('v1');
 var request = gmail.users.messages.send({
   'userId': auth,
   'message': {
     'raw': base64EncodedEmail
   }
 }, function (err, result) {
       console.log('result'+result);
 });
};

我从谷歌文档中的快速入门示例中获取了这个示例,该示例读取了我的电子邮件帐户中的标签(效果很好)。我只是将范围更改为:

var SCOPES = ['https://mail.google.com/',
 'https://www.googleapis.com/auth/gmail.modify',
 'https://www.googleapis.com/auth/gmail.compose',
 'https://www.googleapis.com/auth/gmail.send'];

并创建了 var = email

var to = 'foo@gmail.com',
    subject = 'Hello World',
    content = 'send a Gmail.'

var email = "To:  "+ to +"\r\n"+
    "Subject: "+subject+"\r\n"+
    content;

然后我只是尝试使用 gmail.users.messages.send 方法.. 但是运行结果时返回以下内容:

<HTML>
 <HEAD>
   <TITLE>Bad Request</TITLE>
 </HEAD>
 <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
   <H1>Bad Request</H1>
   <H2>Error 400</H2>
 </BODY>
</HTML>

知道我错过了什么吗?我认为我创建 var 'email' 的方式是错误的,但我不确定它应该如何

【问题讨论】:

  • 链接到你使用的包?
  • 我正在使用这两个:“google-auth-library”:“^0.9.8”“googleapis”:“^13.0.0”

标签: javascript node.js gmail-api


【解决方案1】:

userId-字段的值必须是发件人的电子邮件地址(或简称me),auth-object 必须在auth 字段中传递,并且消息应该是在resource-字段中传递。您的消息缺少From 标头和有效内容之前的额外新行。消息也必须是 base64url 编码的:

function sendMessage(auth, from, to, subject, content) {
 // The Gmail API requires url safe Base64 
 // (replace '+' with '-', and '/' with '_')
 var encodedEmail = new Buffer(
   'From: ' + from + '\r\n' +
   'To: ' + to + '\r\n' +
   'Subject: ' + subject + '\r\n\r\n' +

   content 
 ).toString('base64').replace(/\+/g, '-').replace(/\//g, '_');

 var gmail = google.gmail('v1');
 var request = gmail.users.messages.send({
   auth: auth,
   userId: 'me',
   resource: {
     raw: encodedEmail
   }
 }, function (err, result) {
   console.log('result:', result);
 });
};

【讨论】:

  • 效果很好,谢谢 Tholle。也为了解释。
  • @DanielMarín 太好了!没问题。 :)
  • Tholle 你知道我在哪里可以找到我可以在那个 json 中传递哪些属性的文档吗? (我在发送函数中作为参数传递的那个)..我找不到它..
  • @DanielMarín 你只能给raw parameter and a threadId
  • 我什至删除了 from 标头,因为我注意到我可以在那里写任何东西并且不会有任何区别。所以我没有在那里尝试过。但令人惊讶的是,它奏效了。再次感谢 Tholle,抱歉这个愚蠢的问题。
【解决方案2】:

我强烈推荐使用 Nodemailers 系统,而不是自己构建正文:

const sendMail = async () => {
    const mail = await new MailComposer({
          to: ...,
          from: ...,
          subject: ...,
          html: ...,
        });

    const message = await mail.compile().build();

    const encodedMessage = message
          .toString('base64')
          .replace(/\+/g, '-')
          .replace(/\//g, '_')
          .replace(/=+$/, '');

    await gmail.users.messages.send({
      userId: 'me',
      requestBody: { raw: encodedMessage },
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 2015-01-02
    • 2017-04-14
    • 2019-10-16
    • 2021-09-11
    • 1970-01-01
    • 2017-03-07
    • 2017-05-25
    相关资源
    最近更新 更多