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? 用什么工 ...
随机推荐
- Core WebApi项目快速入门(一):环境部署
1.WebApi新建与部署 1.1 新建Core WebApi工程 1.2 部署 1.2.1 IIS部署 首先以文件方式发布应用程序,然后下载依赖.net core运行时及host安装包 在iis中看 ...
- 将CSV的数据发送到kafka(java版)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- select限制之文件描述符限制
1.一个进能够打开的最大文件描述符限制.可以通过两种方式修改ulimit -n :获取最大文件描述符个数ulimit -n 2048:修改为2048个 该限制的测试代码: 客户端程序: /* 1.se ...
- Ceph的Mon数据重新构建工具
关于mon的数据的问题,一般正常情况下都是配置的3个mon的,但是还是有人会担心 Mon 万一三个同时都挂掉了怎么办,那么集群所有的数据是不是都丢了,关于后台真实数据恢复,有去后台取对象,然后一个个拼 ...
- 医学AI论文解读 |Circulation|2018| 超声心动图的全自动检测在临床上的应用
文章来自微信公众号:机器学习炼丹术.号主炼丹兄WX:cyx645016617.文章有问题或者想交流的话欢迎- 参考目录: @ 目录 0 论文 1 概述 2 pipeline 3 技术细节 3.1 预处 ...
- Python_算法汇总
1. 约瑟夫环: # 约瑟夫环:共31个数,每隔9个删除一个,要求输出前15个号码 a=[x for x in range(1,31)] #生成编号 del_number = 8 #该删除的编号 fo ...
- SQL Server 常用近百条SQL语句(收藏版)
1. sqlserver查看实例级别的信息,使用SERVERPROPERTY函数 select SERVERPROPERTY ('propertyname') 2. 查看实例级别的某个参数XX的配置 ...
- 汇编语言常用的DOS功能调用
今天掌握了汇编语言常用的DOS功能调用,现在列出来供参考. 1.单字符输入(1号调用) 格式:MOV AH,1 INT 21H 功能:达到输入状态,从键盘上输入字符的ASCII码送入AX中,并送显示器 ...
- Spark闭包 | driver & executor程序代码执行
Spark中的闭包 闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响. 其实,在学习Spark时,一个比较难理解的 ...
- 记一次容器内执行ansible命令卡住
1.由来 最近在使用kylin_v10系统,发现当在此系统下运行的容器内执行#ansible localhost -m setup 命令会卡住不动,于是和同事一起经过如下排查最终找到解决问题的办法. ...