安装:
const nodemailer = require('nodemailer'); // 用于发送电子邮件
其中谷歌相关配置及其API开通查看:http://t.csdnimg.cn/v4wHr
Gmail谷歌邮箱配置:
let transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
type: "OAuth2",
user: '你的谷歌邮箱@gmail.com',//
pass: '谷歌邮箱密码',
clientId:"你的clientId",
clientSecret: "你的clientSecret",
refreshToken: "你的refreshToken",//有限时
accessToken:"你的 accessToken",//有限时
}
}
);
完整代码:
const router = require('@koa/router')()
const nodemailer = require('nodemailer'); // 用于发送电子邮件
// 配置电子邮件发送器
// refreshToken和accessToken会更新
let transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
type: "OAuth2",
user: '******@gmail.com',//谷歌邮箱
pass: '*********',//谷歌邮箱密码
clientId:"**********",//凭据-客户端ID
clientSecret: "**********",//凭据-客户端密钥
refreshToken:"****************",//必填参数,随token过期失效
accessToken: "**********",//必填参数,随token过期失效
}
}
);
// 生成随机验证码
function generateVerificationCode() {
return Math.floor(1000 + Math.random() * 9000).toString();
}
// 存储验证码与邮箱的映射关系,可以使用数据库或内存存储
const verificationCodes = new Map();
router.post('/send-verification-code', async ctx => {
const { email } = ctx.request.body;
// 生成验证码
const code = generateVerificationCode();
// 存储验证码,通常需要设置过期时间
verificationCodes.set(email, code);
// 发送验证码邮件
const mailOptions = {
from: '*********@gmail.com',//你的谷歌邮箱
to: email,
subject: '验证码邮件',
text: `您的验证码是: ${code}`
};
console.log('mailOptions:',mailOptions);
try {
const res = await transporter.sendMail(mailOptions);
console.log(res);
ctx.body = { success: true, message: '验证码邮件已发送' };
} catch (error) {
console.log('connect ETIMEDOUT超时/token过期导致refreshToken、accessToken更新');
ctx.body = { success: false, message: '无法发送验证码邮件' };
}
});
使用postman测试:
发送成功:
如果接口返回数据为
{ “success”: false, “message”: “无法发送验证码邮件” }
存在俩种情况:
- fefresh token、access token失效:fefresh token、access
token具有时效性,会根据Step1的token失效而失效,解决方法需要更新token,并获取更新的fefresh
token、access token
- 网络连接存在问题,大陆区域与非大陆区域访问需借助相关工具