实现邮箱验证服务

下载nodejs

官网下载Node.js — Run JavaScript Everywhere,一路安装就可以了

文件夹中命令窗口

npm init

根据提示同意会创建一个package.json文件

接下来安装grpc-js包,也可以安装grpc,grpc是C++版本,grpc-js是js版本,C++版本停止维护了。所以用grpc-js版本。

npm install @grpc/grpc-js

接着安装proto-loader用来动态解析proto文件

npm install @grpc/proto-loader

我们再安装email处理的库

npm install nodemailer

在写代码发送邮件之前,我们先去邮箱开启smtp服务。我用的163邮箱,在邮箱设置中查找smtp服务器地址,需要开启smtp服务。这个是固定的,不需要修改。

网易163邮箱的 SMTP 服务器地址为: smtp.163.com

发送邮件,建议使用授权码(有的邮箱叫 独立密码),确保邮箱密码的安全性。授权码在邮箱设置中进行设置。如果开启了授权码,发送邮件的时候,必须使用授权码。

这里设置开启smtp服务和授权码。

因为我们要实现参数可配置,所以要读取配置,先在文件夹内创建一个config.json文件

{
    "email": {
      "user": "@163.com",
      "pass": ""
    },

    "mysql":{
        "host":"127.0.0.1",
        "port":3306,
        "passwd":
    },

    "redis":{
        "host":"47.113.193.180",
        "port":6379,
        "passwd":123456
    }

}

user是我们得邮箱地址,pass是邮箱得授权码,只有有了授权码才能用代码发邮件

另外我们也要用到一些常量和全局得变量,所以我们定义一个const.js

 

const fs = require('fs');
let config = JSON.parse(fs.readFileSync('config.json', 'utf8'));  //解析config.json文件中的数据保存在config类中
let email_user = config.email.user;
let email_pass = config.email.pass;
let mysql_host = config.mysql.host;
let mysql_port = config.mysql.port;
let mysql_passwd = config.mysql.passwd;
let redis_host = config.redis.host;
let redis_port = config.redis.port;
let redis_passwd = config.redis.passwd;
let code_prefix = "code_";
module.exports = {email_pass, email_user, mysql_host, mysql_port,redis_host, redis_port, redis_passwd, code_prefix,mysql_passwd} //导出外部使用的对象

接下来封装发邮件的模块,新建一个email.js文件

const nodemailer = require('nodemailer'); //包含要使用的库
const config_module = require("./config")//包含要使用的库
/**
 * 创建发送邮件的代理
 */
let transport = nodemailer.createTransport({ //创建发送邮件的代理
    host: 'smtp.163.com', 	//使用服务的地址
    port: 465, //服务的端口,网上查
    secure: true, //否使用安全连接
    auth: {
        user: config_module.email_user, // 发送方邮箱地址
        pass: config_module.email_pass // 邮箱授权码或者密码
    }
});

/**
 * 发送邮件的函数
 * @param {*} mailOptions_ 发送邮件的参数
 * @returns 
 */
function SendMail(mailOptions_){
    return new Promise(function(resolve, reject){ //reject程序有错返回,resolve正常返回
      /*Promise 如同c++中的future
      Promise中有一个await函数,future中有wait()函数,等待async函数的返回。这两个等待函数都需要在async异步函数中使用
      */
        transport.sendMail(mailOptions_, function(error, info){ //sendMail是一个异步函数,结果返回并不代表邮件发送成功,所以需要使用Promise进行管理
            if (error) {
                console.log(error);
                reject(error);
            } else {
                console.log('邮件已成功发送:' + info.response);
                resolve(info.response)
            }
        });
    })
}
module.exports.SendMail = SendMail  //导出函数

我们新建server.js,用来启动grpc server

//接口实现
async function GetVarifyCode(call, callback) { //call是请求 ,callback回复,需要和message.proto中的参数对应
    console.log("email is ", call.request.email)
    try{
        uniqueId = uuidv4();  //生成验证码
        console.log("uniqueId is ", uniqueId)
        let text_str =  '您的验证码为'+ uniqueId +'请三分钟内完成注册'
        //发送邮件
        let mailOptions = {
            from: 'secondtonone1@163.com', //发送的地址
            to: call.request.email, //发到的邮箱地址
            subject: '验证码',
            text: text_str, //发送的内容
        };
        let send_res = await emailModule.SendMail(mailOptions); //通过被promise管理的异步函数发送邮件,使用await等待发送返回的结果
        console.log("send res is ", send_res)
        callback(null, { email:  call.request.email,
            error:const_module.Errors.Success
        }); //返回的内容,
    }catch(error){
        console.log("catch error is ", error)
        callback(null, { email:  call.request.email,
            error:const_module.Errors.Exception
        }); 
    }
}
function main() {
    var server = new grpc.Server()
    server.addService(message_proto.VarifyService.service, { GetVarifyCode: GetVarifyCode })
  //message_proto.VarifyService.service,message.proto文件中自己声明的函数   第一个GetVarifyCode是服务的名字,第二个是调用的接口
    server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {//grpc.ServerCredentials.createInsecure()安全校验
        server.start()
        console.log('grpc server started')        
    })
}
main()

在nodejs中使用npm run server启动 //server是自己设置的名字,在package.json文件中的main字段的值接收服务的名字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值