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

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. CentOS 8.x 下尝试安装.Net 5 的运行时

    1.背景 看着不管是群里还是公众号里这几天最热闹就是.Net 5.0 正式版的发布.C#9. 当然要开发.net 5.0 的项目就需要把VisualStudio升级的v16.8.0版本了.升级后自带着 ...

  2. VBA_headers_mapping

    Header Mapping--应对 Report Headers 的变化 Author : Collin_PXY 背景 在 RPA工作中,稳定的规则非常重要,因为 RPA项目就是基于规则而进行的,但 ...

  3. 安装tomcat for ubuntu linux差点没晕死我!

    我滴个神!装ubuntu的tomcat差点没有晕死我!怎么回事呢? 应该说是装好了,执行了bin/startup.sh了,出现以下画面: Using CATALINA_BASE: /home/niew ...

  4. Zabbix实现电话告警通知的配置方法分享

    如果要讨论下当下热门的监控系统,我想zabbix应该能够占有自己的一席之地,拥有不小的话语权吧.然而身为一名苦逼的运维,为了不错过重大的告警信息,就需要配置个[电话告警]来进行最快速的通知. zabb ...

  5. Ceph删除OSD上一个异常object

    前言 ceph里面的数据是以对象的形式存储在OSD当中的,有的时候因为磁盘的损坏或者其它的一些特殊情况,会引起集群当中的某一个对象的异常,那么我们需要对这个对象进行处理 在对象损坏的情况下,启动OSD ...

  6. ceph查询rbd的使用容量(快速)

    ceph在Infernalis加入了一个功能是查询rbd的块设备的使用的大小,默认是可以查询的,但是无法快速查询,那么我们来看看这个功能是怎么开启的 ceph版本 root@lab8107:~/cep ...

  7. 讲一讲Java的字符串常量池,看完你的思路就清晰了

    前言 很多朋友Java的字符串常量池的概念困扰了很长一段时间,最近研究了一下jvm指令码,终于对它有了大概的了解. 在展示案例前,我们需要先搞清楚一个概念,众所周知,jvm的内存模型由程序计数器.虚拟 ...

  8. FL Studio中的Layer控制器之如何叠加音色

    本章节将采用图文结合的方式给大家讲解电音编曲软件FL Studio中的Layer控制器是如何叠加音色的,感兴趣的朋友可以一起进来交流哦. Layer控制器也是FL Studio中一个特别有用的插件,主 ...

  9. 苹果电脑下载器Folx迷你窗口有什么用途

    苹果电脑下载器Folx的迷你窗口功能,及时地了解不同任务的下载进度.另外,也可以通过带宽活动窗口了解任务的占用带宽情况,以便及时限制过多的带宽占用.接下来,一起来看看如何操作吧. 图1:软件界面 一. ...

  10. jQuery 第五章 实例方法 详解内置队列queue() dequeue() 方法

    .queue() .dequeue() .clearQueue() ------------------------------------------------------------------ ...