无法使用 gmail api node js 发送邮件

Unable to send mail using gmail api node js

我已关注 gmail api 发送电子邮件。我收到错误消息:

"message": "400 - \"{\n \"error\": {\n \"errors\": [\n {\n \"domain\": \"global\",\n \"reason\": \"invalidArgument\",\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n ],\n \"code\": 400,\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n}\n\""

这是我为使用 gmail api 和 node.js 发送邮件而编写的一段代码。帮我解决问题。

router.post('/composeMail', async (req, res, next) => {
    function makeBody(to, from, subject, message) {
        let str = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
            "Content-length: 5000\n",
            "Content-Transfer-Encoding: message/rfc822\n",
            "to: ", to,"\n",
            "from: ", from,"\n",
            "subject: ", subject,"\n\n",
            message
        ].join('');
        console.log("String: ", str);
        // let encodedMail = new Buffer(str).toString("base64").replace(/\+/g, '-').replace(/\//g, '_');
        let encodedMail = btoa(str).replace(/\+/g, '-').replace(/\//g, '_');
        return encodedMail;
    }
    let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
    let obj = {};
    obj.raw = raw;
    let body = JSON.stringify(obj);
    let option = {
        url: "https://www.googleapis.com/gmail/v1/users/userId/messages/send",
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${req.query.access_token}`
        },
        qs: {
            userId: 'me'
        },
        body: body
    };

    await request(option).then(body => {
        return res.apiOk(body);
    }).catch(err => {
        return res.apiError(err);
    })
});
  • 您想通过请求模块使用 Gmail API 发送电子邮件。

如果我的理解是正确的,这个修改怎么样?我认为有几个答案。所以请将此视为其中之一。

修改点:

  • 请使用https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send作为终点。
  • 将值用作字符串。
  • 'Content-Type': 'message/rfc822' 添加到 headers。

修改后的脚本:

请修改makeBody()如下。

function makeBody(to, from, subject, message) {
    let str = [
        "to: ", to, "\n",
        "from: ", from, "\n",
        "subject: ", subject, "\n\n",
        message,
    ].join('');
    return str;
}

请修改option如下。

let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
const userId = 'me'; // Please modify this for your situation.
let option = {
    url: "https://www.googleapis.com/upload/gmail/v1/users/" + userId + "/messages/send",
    method: 'POST',
    headers: {
        'Authorization': `Bearer ${req.query.access_token}`,
        'Content-Type': 'message/rfc822',
    },
    body: raw,
};

注:

  • 此修改后的脚本假定 Gmail API 在 API 控制台启用,并且发送电子邮件所需的范围包含在访问令牌的范围内。

参考:

在我的环境中,我可以确认这个修改后的脚本运行良好。但如果这不是你想要的,我很抱歉。