使用先前存储在数据库中的凭据执行发送电子邮件的 API 端点。 (使用 Gmail REST API)

Posted

技术标签:

【中文标题】使用先前存储在数据库中的凭据执行发送电子邮件的 API 端点。 (使用 Gmail REST API)【英文标题】:API endpoint to execute send emails using the credentials previous stored in the database. (Using Gmail REST API) 【发布时间】:2021-02-09 02:54:57 【问题描述】:

我有一个任务,他们要求我使用 OAuth 2.0 获取用户凭据并将其保存在数据库中(例如 MongoDB)。我能够完成这一步。

第二个任务是让 API 端点使用之前存储的凭据执行发送电子邮件。 (使用 Gmail REST API)。我正在努力完成第二个任务,并且一直在互联网上搜索。

PS:我是用 Nodejs 做的

【问题讨论】:

【参考方案1】: 文档:https://developers.google.com/gmail/api/quickstart/nodejs 设置 Gmail REST API 并获取您的 clientId 和客户端密码 编写一个发送邮件的函数 我用过nodemailar的例子,应该和gmail差不多
var nodemailer = require('nodemailer');
var crypto = require('crypto');

let transporter = nodemailer.createTransport(
    host: 'smtp.sendgrid.net',
    port: 465,
    auth: 
        user: 'apikey',
        pass: 'Your Key'
    
);

function generateVerificationToken() 
    return crypto.randomBytes(16).toString('hex');


exports.addUserEmail = function (req, res) 
    Users.find( email: req.body.email , (err, users) => 
        if (err)  res.send("Err"); return 
        if (users.length == 0) 
            var user = new Users(req.body);

            user.verification.verification_token = generateVerificationToken();

            user.save(function (err, email) 
                if (err)
                    res.send(err);
                sendVerificationEmail(req, user.verification.verification_token, email.email, (err) => 
                    if (err)  console.log(err); return res.status(500).send( msg: err.message ); 
                    res.status(200).send( 
                        'A verification email has been sent to ' : email.email 
                    );
                );
            );
        
        else 
            res.status(400).send( Error : 'Invalid Request',
                Error : 'This email is already Registered'
            );
        
    );
;

function sendVerificationEmail(req, token, email, cb) 
    let emailText = 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/user\/verify\/?token=' + token + '&email=' + email + '.\n';
    var mailOptions = 
        from: 'donotreply@Express-Server.com',
        to: email,
        subject: 'Account Verification Token',
        text: emailText
    ;
    transporter.sendMail(mailOptions, function (err) 
        cb(err);
    );


在你的路线中

    app.route('/user/register')
    .post(users.addUserEmail);

【讨论】:

以上是关于使用先前存储在数据库中的凭据执行发送电子邮件的 API 端点。 (使用 Gmail REST API)的主要内容,如果未能解决你的问题,请参考以下文章

使用流明发送电子邮件,而不在 env 文件中设置 smtp 凭据

如何使用存储在 Excel 中的地址向多个收件人发送电子邮件?

无法使用 python SDK 在 ECS fargate 作业上发送邮件,并在另一个 aws 帐户中使用经过验证的 SES 的凭据

DocuSign 集成。是不是可以在未经用户同意的情况下获得身份验证令牌。我想使用我的凭据在内部发送 docusign 信封电子邮件 [关闭]

使用 java 验证 smtp 服务器凭据而不实际发送邮件

GCP Cloud Tasks:缩短创建先前创建的命名任务的时间