一.用的软件是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. 第一章、ssh安装及远程登入配置

    1.Ubuntu下 确认 SSH Server 是否启动 输入: sudo ps -e | grep ssh. 如果正确启动, 命令行中会显示sshd. 安装服务端 OpenSSH Server 输入 ...

  2. Vue + Webpack 根据不同环境打包

    修改 prod.env.js // 当前正在运行的脚本名称 const TARGET = process.env.npm_lifecycle_event // 第一个参数 let argv = pro ...

  3. 使用zabbix server监控tomcat实战案例

    使用zabbix server监控tomcat实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大家都知道,zabbix server效率高是使用C语言编写的,有很多应用程序 ...

  4. 51nod 1433:0和5

    1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 小K手中有n张牌,每张牌上有一个一位数的数, ...

  5. 用JS写一个网站树形菜单

    先上效果图: 主体内容就是侧边展示的一二三级菜单,树形结构的. 前端页面布局内容,页面内容简单用ul li 来完成所有的罗列项.用先后顺序来区分一级二级三级: <body> <b&g ...

  6. decompiler of java

    运维了两个java项目,但是没有源代码,整天都是各种问题,各方面都不配合.我也只是个小小的兵,但是工作还是要做. 转机 偶然想试一试decomplier,就找到了gd-gui,感觉用着挺好的,到把项目 ...

  7. markdown超链接怎么写?

    效果:我的微博 #上面的效果就是下面这种写法: [ 我的微博 ]( http://weibo.com/5833683560/profile?topnav=1&wvr=6&is_all= ...

  8. php笔记04

    PHP+MySQL 连接数据库 mysqli <?php $servername="localhost"; $username="root"; $pass ...

  9. C++ 根据日期判断星期几

    int CaculateWeekDay(int y,int m, int d) { ||m==) { m+=; y--; } *m+*(m+)/+y+y/-y/+y/)%; ; }

  10. CentOS 6.8 32位 安装mysql8

    1.清理掉之前安装过的mysql rpm -qa | grep mysql mysql-libs-5.1.52-1.el6_0.1.x86_64 yum remove mysql-libs-5.1.5 ...