感恩节特辑:给心爱的人们定时群发天气邮件

如何使用

只要下载了这段代码,你也可以做到~

或者填写群里的收集邮件的链接也可以

欢迎Fork和Star!!!!

项目地址:https://github.com/Andrew8102/NodeMail

这是一个定时抓取网络上天气信息,并通过邮件发送给一些人的一个小的项目,原本是只能发给一个人,现在我把它改成可以群发了,群发给谁呢?当然是你在意的一(帮)人!

为了看懂这个东西,你需要了解几点知识

Node.js, Pm2, Git, SQL

如果你说你这些字母完全认得,但合起来就不认得了,那么

请点击进上面的地址,查看README文件,按上面的操作即可!

核心盘点(可以不看)

使用数据库来发送邮件给更多人

最近发生了一点小事,然后我把邮件的收件人改成了自己,于是每天早晨 6 点都能收到自己的一份“暖暖的邮件”,非常感动,想把这份温暖传递给更多人,于是想到了加一个群发模块

实际上项目内 nodemailer 是有群发功能的,只要在收件人处写一个 array 即可,但我偏偏不这么简单的搞,一定要用上数据库!要学习一下!

知识储备

技术栈:`SQL`,`SQLite`,`Node.js`

SQLite

为什么选择`SQLite`呢,首先因为东西就像`Excel`一样是一个单独的数据库文件,非常便于携带,同时查询又比较方便,相比`MySQL`、`MongoDB`更加的轻量化,此外因为是`Pm2`挂`Node`,所以我不想单独安装一个`MongoDB`,搞`MySQL`的话权限什么的又特别复杂我又怕和`Apache`冲突出事,所以就选择了`SQLite`

基础语法

什么进入退出程序还是要知道的

进入程序

由于 macOS 系统自带 sqlite,直接在 terminal 中输入 sqlite3 即可进入

$ sqlite3
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

退出程序

在 sqlite 命令行内输入`.quit`或者`.exit`

SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .exit

SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .quit
查看结构
.schema email
CREATE TABLE email(
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name CHAR(20) NOT NULL,
    dept CHAR(20) NOT NULL,
    email CHAR(50)
);

 

其他操作和 SQL 操作别无二致,不讲了,感觉基本通用的

设置输出
sqlite>.header on
sqlite>.mode column
sqlite>.timer on
sqlite>
先加入数据

创建表

sqlite> CREATE TABLE email(
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name CHAR(20) NOT NULL,
    dept CHAR(20) NOT NULL,
    email CHAR(50)
);

加入基础数据

INSERT INTO email (name,dept,email)
VALUES ( 'A', 'fuwubu', 'a@gmail.com');
INSERT INTO email (name,dept,email)
VALUES ( 'B', 'fuwubu', 'b@gmail.com');
INSERT INTO email (name,dept,email)
VALUES ( 'C', 'fuwubu', 'c@gmail.com');

然后输入`select * from email;`就可以输出啦

 

sqlite> select * from email;
select * from email;
ID name dept email
---------- ---------- ---------- -----------
1             A         fuwubu     a@gmail.com
2             B         fuwubu     b@gmail.com
3             C         fuwubu     c@gmail.com
Run Time: real 0.000 user 0.000139 sys 0.000103

 

node 导入 Sqlite 模块


var sqlite3 = require('sqlite3').verbose()
var file = './subscribeList.db' //这里写的就是数据库文件的路径
var db = new sqlite3.Database(file)

function getEmail() {
  let p = new Promise(function(resolve, reject) {
    db.all('select email from email', function(err, row) {
      for (let key in row) {
        emailList.push(row[key].email)
      }
    })
    setTimeout(() => {
      resolve(emailList)
    }, 100)
  })
  return p
}

Promise.all([getEmail()])
  .then(function(data) {
    console.log(JSON.stringify(data[0]))
  })
  .catch(function(err) {
    console.log('获取数据失败: ', err)
  })

在最后一个 Promise 这里就需要添加其他函数了,然后就可以获得对应的数据了

输出结果:

[ 'a@gmail.com', 'b@gmail.com', 'c@gmail.com' ]

使用 Promise 顺序执行

Promise.all([getOneData(), getWeatherTips(), getWeatherData(), getEmail()])
    .then(function(data) {
        HtmlData['todayOneData'] = data[0]
        HtmlData['weatherTip'] = data[1]
        HtmlData['threeDaysData'] = data[2]
        HtmlData['email'] = data[3]
        sendMail(HtmlData)
    })
    .catch(function(err) {
        getAllDataAndSendMail() //再次获取
        console.log('获取数据失败: ', err)
    })

然后修改该修改的邮件以及需要发送的邮件地址即可,用 pm2 执行就行啦~

本 branch 地址:https://github.com/Andrew8102/NodeMail

请Fork或者Star一下啦!!!

累死我了,但总之感恩节快乐!!!

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

1 + 9 =