一.用的软件是VsCode:下载地址:https://code.visualstudio.com/

二.用的是node.js完成:下载地址:http://nodejs.cn/download/

无脑下一步安装即可,如果还是不会,可以进入该网址查看:https://www.runoob.com/nodejs/nodejs-install-setup.html

node.js需要配置环境变量:这我就不多说了,自己百度。

三.创建项目

随便创建一个文件夹,右键使用vscode打开

1.在资源管理器下边空白处右键打开终端输入:npm init -y    初始化项目

2.如果没安装:npm命令的可以进入该网站查看:https://www.runoob.com/nodejs/nodejs-npm.html

该网站中还有node.js的一个常用web框架模块 express   的npm安装方法,在这里我们就不用他的框架了。

我们只需要导入5个依赖即可。

3.下载依赖包:

art-template:模板引擎

cheerio:解析html

node-schedule:定时任务

nodemailer:发送电子邮件

superagent:http请求

npm命令:npm i art-template cheerio node-schedule nodemailer superagent

4.新建一个html文件

 <!DOCTYPE html>  

 <html lang="en">  

 <head>  

     <meta charset="UTF-8">  

     <title>mail</title>  

 </head>  

 <body style="margin: 0px;padding: 0px;">
<div style="text-align: center">
<p>今天是我们在一起的第
<span>
{{dayData.count}}
</span>

</p>
<img style="background: cornflowerblue" src="{{mojiData.icon}}" alt="天气图标">
<h3>
天气:
<span>
{{mojiData.weather}}
</span>
</h3>
<p>
温度:
<span>
{{mojiData.temperature}}
</span>
</p>
<p>
提示:
<span>
{{mojiData.hint}}
</span>
</p>
<p>
ONE · 一个
</p>
<P>
{{ dayData.format }}
</P>
<div style="border: 1px solid red">
<img src="{{one.image}}" alt="图片" width="100%">
</div>
<p>
{{one.text}}
</p>
</div> </body>

最终邮件显示就是这样的:

5.该页面上显示的所有变化信息都是通过抓取墨迹天气和one一个网站的数据

墨迹天气网址:https://tianqi.moji.com/weather/china/hebei/zhangjiakou

one一个网址:http://wufazhuce.com/

抓取数据是靠要抓取信息在网页中的选择器抓取的。

注:在测试期间可在终端运行代码查看:命令:node   js文件名

6.新建ji文件

6.1.计算认识的天数:可以打开:console.log(dayData);和调用方法进行测试,其他方法一样.

 //1.0计算爱人认识的天数
function getDayDate(){ return new Promise((resolve,reject) =>{
//现在的时间
const today = new Date();
//认识的时间
const meet = new Date('2019-06-1');
//计算像是到几天的天数
//时间戳转换成天在向上取整
const count = Math.ceil((today - meet) / 1000 / 60 / 60 / 24);
//日期的格式化
const format = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' + today.getDate(); const dayData = {
count,
format
} // console.log(dayData);
resolve(dayData);
}) }
// getDayDate();

6.2.抓取墨迹天气数据

 //2.0  引入superagent 包,用于服务器发送http请求
const request = require('superagent'); //引入cheerio 包 用于把字符串解析成html
const cheerio = require('cheerio'); //请求墨迹天气获取数据
function getMojiData(){ return new Promise((resolve,reject) =>{
request.get('https://tianqi.moji.com/weather/china/hebei/zhangjiakou').end((err,res)=>{
if(err) return console.log("数据请求失败,请检查路径");
//console.log(res.text);
//把字符串转换城html,并可用 jQuery核心选择器湖区内容
const $ = cheerio.load(res.text);
//图标
const icon = $('.wea_weather span img').attr('src');
//天气
const weather = $('.wea_weather b').text();
//温度
const temperature = $('.wea_weather em').text();
//提示
const hint = $('.wea_tips em').text(); const mojiData = {
icon,
weather,
temperature,
hint
}
// console.log(mojiData);
resolve(mojiData); })
}) }
// getMojiData();

6.3.抓取one页面数据

 //3.0  请求one页面抓取数据
function getOne(){ return new Promise((resolve,reject) =>{
request.get('http://wufazhuce.com/').end((err,res)=>{
if(err) return console.log("数据请求失败,请检查路径");
//把返回值中的页面解析成html
const $ = cheerio.load(res.text);
//抓取图片
const image = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
//抓取文本
const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(0).text(); const one = {
image,
text
} // console.log(one);
resolve(one); })
}) } // getOne();

6.4.通过模板引擎引起替换html数据

 //4.0
//引入模板引擎
const template = require('art-template');
//导入 path 模块路径
const path = require('path'); //通过模板引起替换 heml 的数据
async function renderTemplate(){
//获取 日期
const dayData = await getDayDate();
//获取 墨迹天气数据
const mojiData = await getMojiData();
//获取 one数据
const one = await getOne(); // console.log(dayData);
// console.log(mojiData);
// console.log(one); //所有数据都获取成功时,进行模板引擎数据的替换
return new Promise((resolve,reject)=>{
const html = template(path.join(__dirname,'./love.html'),{
dayData,
mojiData,
one
});
resolve(html);
});
} // renderTemplate();

6.5.发送邮件:测试完之后可以进入邮箱查看一下哟!

 //5.0
//导入邮箱依赖
const nodemailer = require("nodemailer");
//发送邮件
async function sendNodeMain(){ //html页面内容
const html = await renderTemplate();
console.log(html);
//使用默认smtp传输,创建可重用邮箱对象
let transporter = nodemailer.createTransport({
host: "smtp.qq.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "577808444@qq.com", // generated ethereal user
pass: "pmznunfrpgzqbdcg" // generated ethereal password
}
}); // 使用定义的传输对象发送邮件
let mailOptions = {
from: '"帅气的小哥哥" <@qq.com>', // 发件人
to: "315391975@qq.com", // 收件人邮箱列表
subject: "爱的邮件", // 标题
html: html // html 内容
}; transporter.sendMail(mailOptions,(error,info = {})=>{
if(error){
console.log(error);
sendNodeMain();//再次发送
}
console.log("邮件发送成功",info.messageId);
console.log("静等下一次发送");
});
} // sendNodeMain();

6.6.定时发送邮件

 //6.0
//定时每天发送邮件 每天8时13分14秒
//导入node-schedule包
const schedule = require('node-schedule'); const j = schedule.scheduleJob('14 13 08 * * *', function(){
sendNodeMain();
console.log('邮件已发送');
});

好了,这就搞定了。

node.js爱心邮件的更多相关文章

  1. Node.js定时邮件的那些事儿

    近开发一个项目,需要在Node.js程序里实现定期给管理员发邮件的功能. 笔者平时只会在Web界面收发邮件.对邮件的原理完全不懂(可能大学教过,然而全忘了),直到要解决这个问题.请教了几个业务的同事, ...

  2. node.js发邮件

    在node上使用第三方类库(nodemailer)发邮件是一件很esay的事情:) app.js   以QQ邮箱为例 var nodemailer = require('nodemailer'); v ...

  3. 转:Node.js邮件发送组件- Nodemailer 1.0发布

    原文来自于http://www.infoq.com/cn/news/2014/07/node.js-nodemailer1.0-publish Nodemailer是一个简单易用的Node.js邮件发 ...

  4. node.js爬取数据并定时发送HTML邮件

    node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...

  5. 使用Node.js还可以发邮件

    前言 今天,我们给大家开发一个小效果.篇幅比较短,主要给大家展示效果.实战 首先我们初始化一个Node项目 npm init -y 创建一个app.js文件 'use strict'; const n ...

  6. 用Node.js发送邮件

    本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...

  7. node.js + webstorm :配置开发环境

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...

  8. Node.js入门:包结构

        JavaScript缺少包结构.CommonJS致力于改变这种现状,于是定义了包的结构规范(http://wiki.commonjs.org/wiki/Packages/1.0 ).而NPM的 ...

  9. 8 步搭建 Node.js + MongoDB 项目的自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...

随机推荐

  1. SpringData JPA使用JPQL的方式查询和使用SQL语句查询

    使用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件, 这时就可以使用@Query注解,结合JPQL的语句方式完成查询 持久 ...

  2. Windows驱动开发-DeviceIoControl函数参数dwIoControlCode

    函数语法 BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBuffer ...

  3. makecert 制作数字证书 给DLL加一个数字签名

    声明:文章整理自互联网 我仅需要给dll添加(替换)一个签名,所以我只看了第一步和第三步,其余的部分我没有测试,不能保证内容的是否正确. 看了很多关于DLL加签名的教程 大多是错误的 完全无法正常走下 ...

  4. oracle进入CDB

    第一步:使用sys登陆 CONN sys/change_on_install AS SYSDBA; 第二步:查看现在的容器名称 SHOW con_name; 第三步:改变容器为PDB ALTER SE ...

  5. Flume 1.9.0 的安装(比较简单, 操作也不像老版本那么繁琐了)

    之前已经完成了Hadoop集群.Hbase集群.Hive的搭建, 这次来安装一下flume-1.9.0 安装过程 将tar包上传并解压到指定目录, 并修改名称 tar -zxvf apache-flu ...

  6. Docker 搭建开源 CMDB平台 “OpsManage” 之 Mariadb

    整理了一下文档  今天来构建mariadb 主机还是 centos  172.16.0.200 构建第二个images   直接shell.sh 完成  #!/bin/bash echo " ...

  7. javaboot+es

    说明:可能有些书教你学es的时候,叫你下载什么kibana,crul……之类的也要版本对应,但实际上这些东西写代码不是必须.当时为了搞这些东西花了一天时间.我们用postman也可以写命令的. 正文: ...

  8. Prime Ring Problem素数环(HDU1016)

    Prime Ring Problem 思路:先看成一条链,往里头填数,满足任意相邻两数和为质数(这可以打表预处理出40以内的所有质数,扩展的时候枚举),填完了后检查首尾是否满足条件.字典序可以采用扩展 ...

  9. Java中默认方法

    默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法,Mortal 这个接口,增加了一个默认方法 r,这个方法有实现体,并且被声明为了default,如以下代码: 这 ...

  10. P1082 射击比赛

    P1082 射击比赛 转跳点: