一.用的软件是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. 「NOIP2016」天天爱跑步

    传送门 Luogu 解题思路 树上差分+桶计数. 我们发现在一条路径上的点 \(i\) ,它可以观测到玩家的条件是: \(i \in (u \to LCA),dep_u=w_i+dep_i\) \(i ...

  2. Centos7 静默安装 Oracle11G

    1.准备安装包: 安装包官网下载地址:https://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-l ...

  3. call 和 apply 用法

    ECMAScript规范中,所有函数都包含这两个方法,并且两个方法的使用基本一致,都是用于改变函数的作用域,即改变函数体内 this 指向.不同的是 call 方法的第二个参数可以接收任意个参数,以逗 ...

  4. springCloud 之 Eureka服务治理机制及代码运行

    服务提供者 服务注册: 服务提供者在启动的时候通过发送Rest请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server在收到这个请求后,将元数 ...

  5. SqlServer查看锁表与解锁

    某些情况下,sqlserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住 其他任何连接查询表数据时都不会返回 这时需要手工杀掉产生死锁的会话ID,才能恢复正常 查看 ...

  6. 065、Java面向对象之定义一个Book类,在主类中使用Book类

    01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...

  7. espcms P8.19082801 vulnerability

    author: naiquan chai Net name:Hanamizuki花水木 Through  the vulnerability  we can get the webshell if w ...

  8. 移动 web 开发问题和优化小结

    1.前言 到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏领域.用户要求越来越高,网站功能越来越好,效果越来越炫酷,这就要求我们产品质量越来越高,w ...

  9. pyhton scipy最小二乘法(scipy.linalg.lstsq模块)

    最小二乘法则是一种统计学习优化技术,它的目标是最小化误差平方之和来作为目标J(θ)J(θ),从而找到最优模型. 7. SciPy最小二乘法 最小二乘法则是一种统计学习优化技术,它的目标是最小化误差平方 ...

  10. git commit -m 和 git commit -am 区别

    git commit -m 和 git commit -am 通常修改一个文件 并且将文件提交到本地分支的命令是: git add . git commit -m 'update' 以上两个命令其实可 ...