参照传智播客的视频所写代码。

js代码:

//引用superagent包,用于服务器发送http请求
const request = require('superagent');
//导入cheerio包 解析http
const cheerio = require('cheerio');
//导入 art-template
const template = require('art-template');
//导入PATH
const path = require('path');
//导入nodemaler发送邮件的包
const nodemailer = require('nodemailer');
//导入定时任务包
var schedule = require('node-schedule'); function getDate(){
return new Promise((resolve , reject)=>{
//现在的时间
const today = new Date();
//认识的时间
const meet = new Date("**-**-**");
//认识的天数
const count = Math.floor((today - meet)/1000/60/60/24);
//今天的日期
const format = today.getFullYear() + " / " +(today.getMonth()+1) + " / " + today.getDate();
const dayDate = {
count,
format
}
// console.log(daydate);
resolve(dayDate);
});
}
// getDate(); //请求墨迹天气的数据
function getMojiData(){
return new Promise((resolve , reject)=>{
request.get('http://tianqi.moji.com/weather/china/hebei/shijiazhuang').end((err,res)=>{
if(err) return console.log("数据请求失败");
// console.log(res.text);
const $ = cheerio.load(res.text);
//温度
const wendu = $(".wea_weather em").text();
//图片
const icon = $('.wea_weather span img').attr('src');
//天气
const weather = $(".wea_weather b").text();
//提示
const tips = $(".wea_tips em").text();
//墨迹对象
const mojiData = {
icon,
weather,
wendu,
tips
}
resolve(mojiData);
});
}); }
// getMojiData(); //请求One页面抓取数据
function getOneData(){
return new Promise((resolve , reject)=>{
request.get('http://wufazhuce.com/').end((err,res)=>{
if(err) return console.log("数据请求失败"); //把返回值中的数据解析成HTML
const $ = cheerio.load(res.text);
//抓取One的图片
const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
//抓取One的文本
const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(0).text(); const OneData = {
img,
text
} resolve(OneData);
});
}); } function getOneData_2(){
return new Promise((resolve , reject)=>{
request.get('http://wufazhuce.com/').end((err,res)=>{
if(err) return console.log("数据请求失败"); //把返回值中的数据解析成HTML
const $ = cheerio.load(res.text);
//抓取One的图片
const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(2).attr('src');
//抓取One的文本
const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(2).text(); const OneData = {
img,
text
} resolve(OneData);
});
}); }
// getOneData(); //渲染邮件
async function renderTemplate(){
//获取日期数据
const dayData = await getDate();
//获取墨迹天气数据
const mojiData = await getMojiData();
//获取One数据
const oneData = await getOneData();
// console.log(dayData);
// console.log(mojiDate);
// console.log(oneData);
return new Promise((resolve,reject)=>{
const html = template(path.join(__dirname,"./mail.html"),{
dayData,
mojiData,
oneData
});
// console.log(html);
resolve(html);
}); } async function renderTemplate_2(){
//获取日期数据
const dayData = await getDate();
//获取墨迹天气数据
const mojiData = await getMojiData();
//获取One数据
const oneData = await getOneData_2();
// console.log(dayData);
// console.log(mojiDate);
// console.log(oneData);
return new Promise((resolve,reject)=>{
const html = template(path.join(__dirname,"./mail.html"),{
dayData,
mojiData,
oneData
});
// console.log(html);
resolve(html);
}); }
// renderTemplate(); async function sendMail() { const html = await renderTemplate();
// console.log(html); let transporter = nodemailer.createTransport({
host: "smtp.163.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "**@**", // generated ethereal user
pass: "***" // generated ethereal password
}
}); // send mail with defined transport object
let mailOptions = {
from: '"自己" <**@**>', // sender address
to: "**@**", // list of receivers
subject: "最好的自己", // Subject line
html: html // html body
}; transporter.sendMail(mailOptions,(error,info = {}) =>{
if(error){
console.log(error);
sendMail();
}
console.log("发送成功",info.messageId);
console.log("等待下一次发送!");
}); } async function sendMail_2() { const html = await renderTemplate_2();
// console.log(html); let transporter = nodemailer.createTransport({
host: "smtp.163.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "**@**", // generated ethereal user
pass: "***" // generated ethereal password
}
}); // send mail with defined transport object
let mailOptions = {
from: '"自己" <**@**>', // sender address
to: "**@**", // list of receivers
subject: "最好的自己", // Subject line
html: html // html body
}; transporter.sendMail(mailOptions,(error,info = {}) =>{
if(error){
console.log(error);
sendMail();
}
console.log("发送成功",info.messageId);
console.log("等待下一次发送!");
}); } // sendMail_2(); var j = schedule.scheduleJob('00 45 21 * * *', function(){
sendMail();
console.log('定时任务执行完毕!');
}); var j_2 = schedule.scheduleJob('00 35 22 * * *', function(){
sendMail_2();
console.log('定时任务执行完毕!');
});

下面是页面的样式:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div style="border: 0px solid red; width: 100%; margin: 40px auto; color: gray; text-align: center; font-size: 20px;" align="center">
<span>我们已经生活了</span>
<span style="font-size: 24px; color: red;">{{dayData.count}}</span>
<span>天</span>
</div> <div style="border: 0px solid red; width: 100%; margin: 0 auto; color: gray; text-align: center;">
<img src="{{mojiData.icon}}"
style="background: royalblue;"
alt="天气图标"
>
<b style="display: block; color: black; font-size: 24px; margin: 15px 0;">
天气:{{mojiData.weather}}
</b>
<span style="display: block; color: black; font-size: 22px; margin: 15px 0;">
温度:{{mojiData.wendu}}
</span>
<span style="display: block; color: lightgray; font-size: 20px;">
提示:{{mojiData.tips}}
</span>
</div> <div style="text-align: center;margin: 35px 0;">
<span style="display: block; margin-top: 55px;color: gray; font-size: 15px;">
ONE 一个
</span> <span style="display: block; margin-top: 25px;color: lightgray; font-size: 22px;">
{{dayData.format}}
</span> <img src="{{oneData.img}}"
style="margin-top:10px; width: 100%;"
alt="One配图"
>
<div style="margin: 10px auto; width: 85%; color: gray;">
{{oneData.text}}
</div>
</div>
</body>
</html>

每天都要照顾好自己。

Node.js 应用---定时给自己发送邮件的更多相关文章

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

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

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

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

  3. 用Node.js发送邮件

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

  4. Node.js发送邮件

    1.使用nodemailer模块 var nodemailer = require("nodemailer"); 2.代码如下 exports.send_email = funct ...

  5. Node.js使用Nodemailer发送邮件

    除了Python,在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用.Nodemailer包就可以帮助我们快速实现发送邮件的功能. Nodemailer简介 Nodem ...

  6. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  7. node.js爱心邮件

    一.用的软件是VsCode:下载地址:https://code.visualstudio.com/ 二.用的是node.js完成:下载地址:http://nodejs.cn/download/ 无脑下 ...

  8. Node.js入门

    开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...

  9. [译]Node.js Interview Questions and Answers (2017 Edition)

    原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...

随机推荐

  1. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  2. C++ 基础 2:C++ 对 C 语言的拓展

    1 引用 1.1 定义及编程实践 引用,是某个已存在变量的另一个名字. 一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 注意: 引用没有定义,是一种关系型声明.声明它和原有某一 ...

  3. axios封装接口

    我们一般都是在做一个大型项目的时候,需要用到很多接口时,我们为了方便使用,就把接口封装起来. 先安装axios命令 :npm install axios --save 那么思路是什么呢? 首先在src ...

  4. RPC协议实践入门

    RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...

  5. 利用日志文件getshell

    一.包含日志文件漏洞利用概述           当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件.        利用思路也比较简单,当我们访 ...

  6. binary hacks读数笔记(ld 链接讲解 一)

    首先我们先看两段代码: a.c extern int shared; int main(){ int a=100; swap(&a,&shared); } b.c int shared ...

  7. Nacos 多环境配置

    本文探讨Nacos作为配置中心,如何实现不同环境(开发.测试.灰度.正式)的配置管理问题 就像Maven用groupId.artifactId.version三者来定位jar包在仓库中的位置一样,Na ...

  8. 基于RBAC实现权限管理

    基于RBAC实现权限管理 技术栈:SpringBoot.SpringMVC RBAC RBAC数据库表 主体 编号 账号 密码 001 admin 123456 资源 编号 资源名称 访问路径 001 ...

  9. 阿里面试官:你连个java多线程都说不清楚,我招你进来干什么

    创建线程的方法 继承Thread类 继承Thread类,重写run方法,通过线程类实例.start()方法开启线程. public class TestThread1 extends Thread{ ...

  10. 苹果电脑不安装flash的话怎么看直播

    直播这种娱乐方式的兴起,让很多游戏玩家.脱口秀演员.歌手等拥有了一个更加宽广的舞台,可以更好地展现自己的才能.大部分的直播都是采取视频影像的方式直播,只有少部分才会采用纯音频的方式. 由于很多直播网站 ...