这就是简单的发送邮件,这个插件还可以上传附件,详情可参考nodemailer文档:https://nodemailer.com/about/
1. 下载 nodemailer
npm install nodemailer --save
2. 邮箱授权
当然,要发送邮件,我们需要有自己的邮箱,并且要去获取到授权码
这里以QQ邮箱为例:
进入邮箱 》 设置 》 账户 》POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
开启POP3/SMYP服务,获取授权码
在app/service/tool.js文件
// app/service/tool.js
'use strict';
const Service = require('egg').Service;
// 引入nodemailer
const nodemailer = require('nodemailer');
const user_email = 'qq邮箱';// 账号
const auth_code = '授权码';// 授权码
// 封装发送者信息
const transporter = nodemailer.createTransport({
service: 'qq',// 调用qq服务器
secureConnection: true,// 启动SSL
port: 465,// 端口就是465
auth: {
user: user_email, // 账号
pass: auth_code, // 授权码
},
});
class ToolService extends Service {
async sendMail(email, subject, html) {
// 邮件参数及内容
const mailOptions = {
from: user_email, // 发送者,与上面的user一致
to: email, // 接收者,可以同时发送多个,以逗号隔开
subject, // 标题
html,
};
try {
// 调用函数,发送邮件
await transporter.sendMail(mailOptions);
return true;
} catch (err) {
return false;
}
}
}
module.exports = ToolService;
在测试controller中调用, app/controller/test.js
// app/controller/test.js
'use strict';
const Controller = require('egg').Controller;
class TestController extends Controller {
async testSendMail() {
let { ctx, app } = this;
const email = '接收者的邮箱'; // 接收者的邮箱
const subject = '测试邮件';// 标题
const html = '<h2>测试一下</h2>';
const has_send = await this.service.tool.sendMail(email, subject, html);
if(has_send){
ctx.apiSuccess('发送成功');
}else{
ctx.apiFail('发送失败');
}
}
}
module.exports = TestController;
路由发请求
//测试邮件
router.get('/test', controller.test.testSendMail);
发送公司内部邮件 最主要的配置是这个tls:{rejectUnauthorized: false}, 解决报错问题
在app/service/mail.js文件
'use strict';
const Service = require('egg').Service;
// 引入nodemailer
const nodemailer = require('nodemailer');
const user_email = '账号';// 账号
// 封装发送者信息
const transporter = nodemailer.createTransport({
host:'ip',//邮箱服务的主机,如mail.casetekcorp.com 10.131.119.228 IP地址比较靠谱
port:25,//对应的端口号
//开启安全连接
secure:false,
ignoreTLS:true,
tls:{rejectUnauthorized: false},//解决 unable to verify the first certificate 无法验证第一个证书
logger: false,
debug: true, // include SMTP traffic in the logs
//用户信息
auth:{
user:'user',
pass:'pass'
}
});
class MailService extends Service {
async sendMail(email, html) {
let dirname=(__dirname.replace(/\\|\//g, '/')).replace('service', 'public')
//E:\shebeidianjian\系统后台\app\service
//E:/shebeidianjian/系统后台/app/service replace替换 \ 成 /
//把service 替换 publice E:/shebeidianjian/系统后台/app/public
// 邮件参数及内容
const mailOptions = {
from: user_email, // 发送者,与上面的user一致
to: email, // 接收者,可以同时发送多个,以逗号隔开
subject:'标题', // 标题
html,
//发送附件
attachments:[
{
filename : '报表.xlsx',
//E:/shebeidianjian/系统后台/app/public/1668823098624914报表.xlsx
path: dirname+ '/1668823098624914报表.xlsx'
},
{
filename : 'content.txt',
content : '发送内容'
}
]
};
try {
// 调用函数,发送邮件
await transporter.sendMail(mailOptions);
return true;
} catch (err) {
return false;
}
}
}
module.exports = MailService;
在测试controller中调用, app/controller/test.js
// app/controller/test.js
'use strict';
const Controller = require('egg').Controller;
class TestController extends Controller {
async testSendMail() {
let { ctx, app } = this;
const email = '接收者的邮箱'; // 接收者的邮箱
const html = `<p>自定义内容</p>`;
const has_send = await this.service.mail.sendMail(email, html);
if(has_send){
ctx.apiSuccess('发送成功');
}else{
ctx.apiFail('发送失败');
}
}
}
module.exports = TestController;
路由发请求
//测试邮件
router.get('/test', controller.test.testSendMail);