eggjs 使用nodemailer发送邮件

这就是简单的发送邮件,这个插件还可以上传附件,详情可参考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);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光浅止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值