node.js爱心邮件
一.用的软件是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爱心邮件的更多相关文章
- Node.js定时邮件的那些事儿
近开发一个项目,需要在Node.js程序里实现定期给管理员发邮件的功能. 笔者平时只会在Web界面收发邮件.对邮件的原理完全不懂(可能大学教过,然而全忘了),直到要解决这个问题.请教了几个业务的同事, ...
- node.js发邮件
在node上使用第三方类库(nodemailer)发邮件是一件很esay的事情:) app.js 以QQ邮箱为例 var nodemailer = require('nodemailer'); v ...
- 转:Node.js邮件发送组件- Nodemailer 1.0发布
原文来自于http://www.infoq.com/cn/news/2014/07/node.js-nodemailer1.0-publish Nodemailer是一个简单易用的Node.js邮件发 ...
- node.js爬取数据并定时发送HTML邮件
node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...
- 使用Node.js还可以发邮件
前言 今天,我们给大家开发一个小效果.篇幅比较短,主要给大家展示效果.实战 首先我们初始化一个Node项目 npm init -y 创建一个app.js文件 'use strict'; const n ...
- 用Node.js发送邮件
本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...
- node.js + webstorm :配置开发环境
一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...
- Node.js入门:包结构
JavaScript缺少包结构.CommonJS致力于改变这种现状,于是定义了包的结构规范(http://wiki.commonjs.org/wiki/Packages/1.0 ).而NPM的 ...
- 8 步搭建 Node.js + MongoDB 项目的自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...
随机推荐
- 「NOIP2012」开车旅行
传送门 Luogu 解题思路 第一步预处理每个点后面的最近点和次近点,然后就是模拟题意. 但是如果就这么搞是 \(O(N^2)\) 的,不过可以过70分,考场上也已经比较可观了. 考虑优化. 预处理最 ...
- WIN2008中部署网站后样式及JS加载不了(转载)
今天在一台刚刚装好的WIN2008上部署一个问题,一切按流程来:① 控制面板加IIS,把.NET 3.5打勾② 装.NET 4.0框架③ 装MSSQL2012④ IIS中部署网站⑤ 修改web.con ...
- ES6中 ,var,let和const的区别
var的特点 没有代码块的概念,全局范围内都有效 存在“变量提升”现象,即变量可以在声明之前使用,值为undefined let的特点 声明的变量仅在块级作用域内有效,存在了代码块的概念 不存在“变量 ...
- 201707《Ruby元编程》
元编程不过是编程--经典必读 作用域(绑定) 打破作用域门的方式 对象模型图 七条规则 法术手册 作用域(绑定) 改变作用域的关键字, 分别是module,class和def.我们称为作用域的门(sc ...
- spingboot2.0外部引入xml配置文件时找不到文件等报错
之前的项目可以启动,后面不知道为什么都不行了,报错如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bindin ...
- canon 打印机 连接不上 netgear 路由器
解决方法很简单,只要把信道设置到 10以内即可.
- 应用于Oculus Quest的VR头显应用
项目需要一个VR头显项目来展示算法成果,设备为Oculus Quest一体机,基于android平台(平台要切换为android),体验了下设备效果还行,但还是有点沙窗效应.记录一下开发流程. 先贴个 ...
- platform设备驱动框架
驱动框架 通过使用platform设备驱动框架,实现led驱动与设备操作的分离. 我们关注led_drv里面的 struct platform_driver led_drv里面的.probe函 ...
- Problem J. Joseph’s Problem 约瑟夫问题--余数之和
链接:https://vjudge.net/problem/UVA-1363 题意:给出n k,当 i 属于 1~n 时 ,求解 n% i 的和 n 和 k 的范围都是 1 到 10^9; 商相同 ...
- Json实体类驼峰名称转化器
背景 我们常用一些网站,将json转化成实体类.但不巧的是,这些自动生成的都是小驼峰.需要进一步的改成大驼峰+JsonProperty.接着同事说他已经有个工具了.我稍微简化了一下 方法 首先行分离. ...