Node.js 应用---定时给自己发送邮件
参照传智播客的视频所写代码。
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 应用---定时给自己发送邮件的更多相关文章
- node.js爬取数据并定时发送HTML邮件
node.js是前端程序员不可不学的一个框架,我们可以通过它来爬取数据.发送邮件.存取数据等等.下面我们通过koa2框架简单的只有一个小爬虫并使用定时任务来发送小邮件! 首先我们先来看一下效果图 差不 ...
- Node.js定时邮件的那些事儿
近开发一个项目,需要在Node.js程序里实现定期给管理员发邮件的功能. 笔者平时只会在Web界面收发邮件.对邮件的原理完全不懂(可能大学教过,然而全忘了),直到要解决这个问题.请教了几个业务的同事, ...
- 用Node.js发送邮件
本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...
- Node.js发送邮件
1.使用nodemailer模块 var nodemailer = require("nodemailer"); 2.代码如下 exports.send_email = funct ...
- Node.js使用Nodemailer发送邮件
除了Python,在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用.Nodemailer包就可以帮助我们快速实现发送邮件的功能. Nodemailer简介 Nodem ...
- node.js 模拟自动发送邮件验证码
node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...
- node.js爱心邮件
一.用的软件是VsCode:下载地址:https://code.visualstudio.com/ 二.用的是node.js完成:下载地址:http://nodejs.cn/download/ 无脑下 ...
- Node.js入门
开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
随机推荐
- Java 实现输入公历日期输出农历日期、生肖、天干地支、节日、节气等信息
最近的工作中客户要求前台页面展示日历,日历内容包括:农历年月日日.公历年月日.生肖.天干地支.农历节日.公历节日.24节气等信息,之前在网上查找资料关于Java实现方面的文章不少,但是大多数针对节气. ...
- 主题包含一张index.html
有半年之久没有更新新作品了,但这个小小领地我并没有忘记,我会坚持下去,一直在这等你,等你的每次回眸,感恩你的每次驻足,这已经足够成为我坚守的动力和理由,尽管现在有很多不足和不尽人意,也没很多的时间管理 ...
- mysql yyyy-MM-dd function UNIX_TIMESTAMP('yyyy-MM-dd HH:mm:ss')
mysql yyyy-MM-dd function UNIX_TIMESTAMP('yyyy-MM-dd HH:mm:ss') select UNIX_TIMESTAMP('1997-10-04 22 ...
- Golang调度器GMP原理与调度全分析(转 侵 删)
该文章主要详细具体的介绍Goroutine调度器过程及原理,包括如下几个章节. 第一章 Golang调度器的由来 第二章 Goroutine调度器的GMP模型及设计思想 第三章 Goroutine调度 ...
- 剑指offer刷题(算法类_2)
排序 035-数组中的逆序对(归并排序) 题目描述 题解 代码 复杂度 029-最小的K个数(堆排序) 题目描述 题解 代码 复杂度 029-最小的K个数(快速排序) 题目描述 题解 代码 复杂度 位 ...
- 预估Ceph集群恢复时间
一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...
- Angualr 内置工具-SelectionModel
SelectionModel: 被用来控制选中一个和多个item时候的逻辑.例如下拉菜单,复选框选中等,非常方便. 引入:import{SelectionModel}from'@angular/cdk ...
- C#设计模式-原型模式(Prototype Pattern)
引言 在软件开发过程中,我们习惯使用new来创建对象.但是当我们创建一个实例的过程很昂贵或者很复杂,并且需要创建多个这样的类的实例时.如果仍然用new操作符去创建这样的类的实例,会导致内存中多分配一个 ...
- 没找到Wkhtmltopdf,报表会被显示为html
windows10 odoo 打印报表时提示 没找到Wkhtmltopdf,报表会被显示为html 现象 原因 没有安装Wkhtmltopdf,没有配置环境变量,odoo在电脑系统中找不到Wkhtml ...
- Linux(Centos6.8)配置Nginx环境
1.环境配置 操作系统:centos6.8 [root@host79 ~]# uname -a Linux host79.pluto 2.6.32-642.el6.x86_64 #1 SMP Tue ...