飞道的博客

Node.js之自动发送邮件 | 仅二十行代码即可

236人阅读  评论(0)

前言

因为最近自己建站需要添加友链,又不想每次去改静态文件,所以抽出来一个表单,准备给大家填写自己的信息然后提交到后台审核,但是我需要一个邮件来通知大家已经审核通过了,所以我就需要一个发邮件的插件 nodemailer[0] ,当然大佬们已经知道了。因为平时node玩的比较少,所以也在这里记录一下

先上效果图

老严你这标题党 ,说好的定时给女朋友发邮件的小浪漫呢?咱不着急哈?后面会讲到,我们先试下自己手动一步一步的去使用这款插件 nodemailer

准备工作

我们发邮件会需要一个 SMTP 授权码!我们需要去邮箱里面获取,这里我选择的是QQ邮箱(因为搜到的教程就是QQ的)

  1. 进入QQ邮箱

  1. 选择账户

  1. 翻到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

  1. POP3/SMTP服务后面的开启

  1. 发送信息进行验证

  1. 复制授权码

配置

stop 就是这里,别滑太快了

创建一个文件夹

目录名各位请便

创建入口文件

我这里命名是 app.js 各位自便

初始化

npm init -y

安装

npm install nodemailer

老严这里的 nodemailer 安装的是 4.4.0 的版本

package.js

完成之后大概长这样


   
  1. {
  2.    "name""nodeMailDemo",
  3.    "version""1.0.0",
  4.    "description""",
  5.    "main""app.js",
  6.    "scripts": {
  7.      "test""echo \"Error: no test specified\" && exit 1",
  8.      // dev 这是老严自己加上去的哈
  9.      "dev": "node app.js"
  10.   },
  11.    "keywords": [],
  12.    "author""",
  13.    "license""ISC",
  14.    "dependencies": {
  15.      "nodemailer""^4.4.0"
  16.   }
  17. }

come baby

大家看黑板,现在这里是重点了哈,集中注意力 进入到 app.js 中

引入

const nodemailer = require('nodemailer'); 

创建


   
  1. // 创建 nodemailer 配置
  2. let transporter = nodemailer.createTransport({
  3.      //支持列表:https://nodemailer.com/smtp/well-known/
  4.     service:  'QQ'// 老严用的是 QQ
  5.     port:  465// SMTP 端口 这个不用管
  6.     secureConnection:  true
  7.     auth: {
  8.         user:  '你的邮箱@qq.com',
  9.         pass:  '这里填写我们刚刚获取到的smtp授权码'
  10.     }
  11. });

发送内容


   
  1. let mailOptions = {
  2.     from:  '"NickName" <你的邮箱@qq.com>'
  3.     to:  '接收人的邮箱'
  4.     subject:  '发文章的标题', /
  5.     text:  '这里填写你发送的内容'
  6.      // html:'这里也可以写html'
  7. };

执行发送


   
  1. transporter.sendMail(mailOptions, (error, info) => {
  2.      if (error) {
  3.          return console.log(error);
  4.     }
  5.     console.log( '邮件发送成功 ID:', info.messageId);
  6. });

总共才 20 来行的代码到底行不行呢?

node app.js

老严的配置


   
  1. const nodemailer = require( 'nodemailer');  //发送邮件的node插件
  2. function sendEmail (data){
  3.     let transporter = nodemailer.createTransport({
  4.         service:  'QQ'// 发送者的邮箱厂商,支持列表:https://nodemailer.com/smtp/well-known/
  5.         port:  465// SMTP 端口
  6.         secureConnection:  true// SSL安全链接
  7.         auth: {    //发送者的账户密码
  8.             user:  '2407488005@qq.com'//账户
  9.             pass:  'smtp 授权码'//smtp授权码,到邮箱设置下获取
  10.         }
  11.     });
  12.     let mailOptions = {
  13.         from:  '"悲伤日记" <2407488005@qq.com>'// 发送者昵称和地址
  14.         to: data.email,  // 接收者的邮箱地址
  15.         subject:  '悲伤日记 | 友链交换请求审核结果'// 邮件主题
  16.         html: data.content
  17.     };
  18.      //发送邮件
  19.     transporter.sendMail(mailOptions, (error, info) => {
  20.          if (error) {
  21.              return console.log(error);
  22.         }
  23.         console.log( '邮件发送成功 ID:', info.messageId);
  24.     }); 
  25. }
  26. // 这里是 nickName, createTime, link 通过 api 返回的参数进行动态填写的
  27. let nickName, createTime, link;
  28. nickName =   '严先生的博客'
  29. createTime =  '2021-01-26 15:20';
  30. link =  'http://blog.lovemysoul.vip'
  31. let data = {
  32.     email: '491324693@qq.com',
  33.     content: `<img style="width:100px;" src="http://blog.lovemysoul.vip/favicon.ico" alt="logo"/>
  34.         <p style="text-indent: 2em;">亲爱的 ${ nickName } </p>
  35.         <p style="text-indent: 2em;">您在${ createTime } 申请的 ${ link } 交换友链已经审核通过!已经自动创建成功!可以前往 <a href="http://blog.lovemysoul.vip/Friendship.html">悲伤日记</a> 进行查看。感谢您的支持!</p>
  36.         <p style="text-indent: 2em;">祝您工作顺利,心想事成</p>
  37.         <p style="text-align: right;">—— 悲伤日记</p>
  38.         <p>如有疑问可以关注悲伤日记微信公众号进行协调 </p>
  39.         <img style="width:150px" src="http://blog.lovemysoul.vip/_assets/beishang.0aa26ed3.jpg" alt="公众号二维码" srcset="">
  40.     `
  41. }
  42. sendEmail(data) 

执行发送


   
  1. node app.js
  2. # or 
  3. npm run dev

Di~ 收到了!

打开一看

开始定时任务

因为我们执行完发送邮件之后,这个任务执行完成就已经关闭了。我们需要一个定时任务来给它一直跑 node-schedule

安装

npm install node-schedule

使用


   
  1. // 引入
  2. var schedule = require( 'node-schedule');
  3. // 定时执行
  4. schedule.scheduleJob( '10 * * * * *', ()=>{
  5.     sendEmail(data)
  6. });

schedule 讲解

引用一名博主的讲解 《Nodejs学习笔记(十二)--- 定时任务(node-schedule)》[2]


   
  1. *  *  *  *  *  *
  2. ┬ ┬ ┬ ┬ ┬ ┬
  3. │ │ │ │ │  |
  4. │ │ │ │ │ └ day of week ( 0 -  7) ( 0 or  7 is Sun)
  5. │ │ │ │ └───── month ( 1 -  12)
  6. │ │ │ └────────── day of month ( 1 -  31)
  7. │ │ └─────────────── hour ( 0 -  23)
  8. │ └──────────────────── minute ( 0 -  59)
  9. └───────────────────────── second ( 0 -  59, OPTIONAL)
  10.   6个占位符从左到右分别代表:秒、分、时、日、月、周几
  11.    '*'表示通配符,匹配任意,当秒是 '*'时,表示任意秒数都触发,其它类推
  12.   下面可以看看以下传入参数分别代表的意思
  13. 每分钟的第 30秒触发:  '30 * * * * *'
  14. 每小时的 130秒触发 : '30 1 * * * *'
  15. 每天的凌晨 1130秒触发 : '30 1 1 * * *'
  16. 每月的 11130秒触发 : '30 1 1 1 * *'
  17. 2016年的 111130秒触发 : '30 1 1 1 2016 *'
  18. 每周 11130秒触发 : '30 1 1 * * 1'

每分钟的第10秒钟发送邮件

看看邮箱

全部代码


   
  1. const nodemailer = require( 'nodemailer');  //发送邮件的node插件
  2. var schedule = require( 'node-schedule');
  3. function sendEmail (data){
  4.     let transporter = nodemailer.createTransport({
  5.         service:  'QQ'
  6.         port:  465
  7.         secureConnection:  true
  8.         auth: {  
  9.             user:  '2407488005@qq.com'
  10.             pass:  '授权码'
  11.         }
  12.     });
  13.     let mailOptions = {
  14.         from:  '"悲伤日记" <2407488005@qq.com>',
  15.         to: data.email, 
  16.         subject:  '悲伤日记 | 友链交换请求审核结果'
  17.         html: data.content
  18.     };
  19.     transporter.sendMail(mailOptions, (error, info) => {
  20.          if (error) {
  21.              return console.log(error);
  22.         }
  23.         console.log( '邮件发送成功 ID:', info.messageId);
  24.     }); 
  25. }
  26. let nickName, createTime, link ;
  27. nickName =   '严先生的博客'
  28. createTime =  '2021-01-26 15:20';
  29. link =  'http://blog.lovemysoul.vip'
  30. let data = {
  31.     email: '491324693@qq.com',
  32.     content: `<img style="width:100px;" src="http://blog.lovemysoul.vip/favicon.ico" alt="logo"/>
  33.         <p style="text-indent: 2em;">亲爱的 ${ nickName } </p>
  34.         <p style="text-indent: 2em;">您在${ createTime } 申请的 ${ link } 交换友链已经审核通过!已经自动创建成功!可以前往 <a href="http://blog.lovemysoul.vip/Friendship.html">悲伤日记</a> 进行查看。感谢您的支持!</p>
  35.         <p style="text-indent: 2em;">祝您工作顺利,心想事成</p>
  36.         <p style="text-align: right;">—— 悲伤日记</p>
  37.         <p>如有疑问可以关注悲伤日记微信公众号进行协调 </p>
  38.         <img style="width:150px" src="http://blog.lovemysoul.vip/_assets/beishang.0aa26ed3.jpg" alt="公众号二维码" srcset="">
  39.     `
  40. }
  41. schedule.scheduleJob( '10 * * * * *', ()=>{
  42.     sendEmail(data)
  43. });

想给女朋友整点小浪漫?

前面的都会了? 想要玩这个那还不简单,继续找轮子,老严在 GitHub 上找到了一个完美的 demo 亲测有效

demo :https://github.com/Vincedream/NodeMail

直接克隆下来


   
  1. git clone https: //github.com/Vincedream/NodeMail.git
  2. &
  3. cd NodeMail

安装依赖

npm install

修改配置文件

进入到根目录的 main.js 然后修改刚刚我们说的配置 全部填写进去之后

node main.js

注意 startDaylocal 这两个变量记得修改,不然我怕你会被家暴

自己也可以进行自定义一点东西这样会更好 如 邮件的主题 EmailSubject

我贴一下模板 感觉有点过分


   
  1. let msgTitle = [ "亲爱滴小宝贝!星期一了又是元气满满的一天 taim i'ngra leat",
  2.                  "小宝贝!熬过了昨天和一上午,还有三天半放假 I love you",
  3.                  "冲冲冲本周已经过完1/2了!今天也要要开开心心的噢 je t'aime",
  4.                  "周四了!不管你在哪里,我永远都在你转身的距离。ich liebe dich",
  5.                  "哈哈哈,还有半天就要放假了!快坑老公吃大餐吧 σε αγαπώ se agapo",
  6.                  "你老公在旁边,直接喊他说爱你!哼"
  7. ]
  8. let EmailSubject = msgTitle[ new Date().getDay() -  1]

单身狗暴击 * 9999999

发送时间 EmailHourEmialMinminute 可以自己选择一下 如13:14 ,5:20 等等 我就不在这凑热闹了

执行一下这骚操作

node main.js

结果

注解地址

[0] https://github.com/nodemailer/nodemailer

[1] https://github.com/node-schedule/node-schedule

[2] https://www.cnblogs.com/zhongweiv/p/node_schedule.html

- END -


转载:https://blog.csdn.net/Crazymryan/article/details/113287438
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场