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? 用什么工 ...
随机推荐
- MySql中指定符号分割并分行展示
1.涉及到的函数三个: 1.1 REPLACE('value','str1','str2') 用法规则:使用str2替换掉value中的所有的str1; SELECT REPLACE('我来了','来 ...
- mybatis 字符串比较 == 用法
private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...
- ixgbe 驱动 为xxx驱动做准备1
网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...
- Socket listen 简要分析
#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int ...
- UNP——原始套接字
1.原始套接字的用处 使用原始套接字可以构造或读取网际层及其以上报文. 具体来说,可以构造 ICMP, IGMP 协议报文,通过开启 IP_HDRINCL 套接字选项,进而自定义 IPv4首部. 2. ...
- day002|python基础回顾2
目录 00 上节课复习 01 基本数据类型 02 与用户交互 03 运算符 04 流程运算之if判断 05 流程判断之while循环 06 TEST 00 上节课复习 ""&quo ...
- Mysql预处理语句prepare、execute、deallocate
前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...
- Maximum execution time of 30 seconds exceeded in
在执行一次php脚本的时候,遇到了这样的报错,经过c Maximum execution time of 30 seconds exceeded in 翻译过来就是:执行时间超过了30秒最长执行时间: ...
- 使用pdfFactory为PDF文件设定查看选项
一般情况下,大部分PDF文件都会按照默认的查看设置,以100%的尺寸显示第一页的内容.但在一些特殊情况下,PDF文件的创建者会设定其他的文件查看尺寸,或设定打开页为第N页,来达到引起阅读者关注的目的. ...
- FL Studio录制面板知识讲解
FL Studio录制面板可以设置与录制有关的选项,它还有一个用来设置音符对齐的全局吸附选择器.刚接触水果这款音乐制作软件的同学通常不是很清楚这里的知识的,下面小编就给大家讲解一下. 1.首先,我们来 ...