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

js代码:

  1. //引用superagent包,用于服务器发送http请求
  2. const request = require('superagent');
  3. //导入cheerio包 解析http
  4. const cheerio = require('cheerio');
  5. //导入 art-template
  6. const template = require('art-template');
  7. //导入PATH
  8. const path = require('path');
  9. //导入nodemaler发送邮件的包
  10. const nodemailer = require('nodemailer');
  11. //导入定时任务包
  12. var schedule = require('node-schedule');
  13.  
  14. function getDate(){
  15. return new Promise((resolve , reject)=>{
  16. //现在的时间
  17. const today = new Date();
  18. //认识的时间
  19. const meet = new Date("**-**-**");
  20. //认识的天数
  21. const count = Math.floor((today - meet)/1000/60/60/24);
  22. //今天的日期
  23. const format = today.getFullYear() + " / " +(today.getMonth()+1) + " / " + today.getDate();
  24. const dayDate = {
  25. count,
  26. format
  27. }
  28. // console.log(daydate);
  29. resolve(dayDate);
  30. });
  31. }
  32. // getDate();
  33.  
  34. //请求墨迹天气的数据
  35. function getMojiData(){
  36. return new Promise((resolve , reject)=>{
  37. request.get('http://tianqi.moji.com/weather/china/hebei/shijiazhuang').end((err,res)=>{
  38. if(err) return console.log("数据请求失败");
  39. // console.log(res.text);
  40. const $ = cheerio.load(res.text);
  41. //温度
  42. const wendu = $(".wea_weather em").text();
  43. //图片
  44. const icon = $('.wea_weather span img').attr('src');
  45. //天气
  46. const weather = $(".wea_weather b").text();
  47. //提示
  48. const tips = $(".wea_tips em").text();
  49. //墨迹对象
  50. const mojiData = {
  51. icon,
  52. weather,
  53. wendu,
  54. tips
  55. }
  56. resolve(mojiData);
  57. });
  58. });
  59.  
  60. }
  61. // getMojiData();
  62.  
  63. //请求One页面抓取数据
  64. function getOneData(){
  65. return new Promise((resolve , reject)=>{
  66. request.get('http://wufazhuce.com/').end((err,res)=>{
  67. if(err) return console.log("数据请求失败");
  68.  
  69. //把返回值中的数据解析成HTML
  70. const $ = cheerio.load(res.text);
  71. //抓取One的图片
  72. const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
  73. //抓取One的文本
  74. const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(0).text();
  75.  
  76. const OneData = {
  77. img,
  78. text
  79. }
  80.  
  81. resolve(OneData);
  82. });
  83. });
  84.  
  85. }
  86.  
  87. function getOneData_2(){
  88. return new Promise((resolve , reject)=>{
  89. request.get('http://wufazhuce.com/').end((err,res)=>{
  90. if(err) return console.log("数据请求失败");
  91.  
  92. //把返回值中的数据解析成HTML
  93. const $ = cheerio.load(res.text);
  94. //抓取One的图片
  95. const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(2).attr('src');
  96. //抓取One的文本
  97. const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(2).text();
  98.  
  99. const OneData = {
  100. img,
  101. text
  102. }
  103.  
  104. resolve(OneData);
  105. });
  106. });
  107.  
  108. }
  109. // getOneData();
  110.  
  111. //渲染邮件
  112. async function renderTemplate(){
  113. //获取日期数据
  114. const dayData = await getDate();
  115. //获取墨迹天气数据
  116. const mojiData = await getMojiData();
  117. //获取One数据
  118. const oneData = await getOneData();
  119. // console.log(dayData);
  120. // console.log(mojiDate);
  121. // console.log(oneData);
  122. return new Promise((resolve,reject)=>{
  123. const html = template(path.join(__dirname,"./mail.html"),{
  124. dayData,
  125. mojiData,
  126. oneData
  127. });
  128. // console.log(html);
  129. resolve(html);
  130. });
  131.  
  132. }
  133.  
  134. async function renderTemplate_2(){
  135. //获取日期数据
  136. const dayData = await getDate();
  137. //获取墨迹天气数据
  138. const mojiData = await getMojiData();
  139. //获取One数据
  140. const oneData = await getOneData_2();
  141. // console.log(dayData);
  142. // console.log(mojiDate);
  143. // console.log(oneData);
  144. return new Promise((resolve,reject)=>{
  145. const html = template(path.join(__dirname,"./mail.html"),{
  146. dayData,
  147. mojiData,
  148. oneData
  149. });
  150. // console.log(html);
  151. resolve(html);
  152. });
  153.  
  154. }
  155. // renderTemplate();
  156.  
  157. async function sendMail() {
  158.  
  159. const html = await renderTemplate();
  160. // console.log(html);
  161.  
  162. let transporter = nodemailer.createTransport({
  163. host: "smtp.163.com",
  164. port: 465,
  165. secure: true, // true for 465, false for other ports
  166. auth: {
  167. user: "**@**", // generated ethereal user
  168. pass: "***" // generated ethereal password
  169. }
  170. });
  171.  
  172. // send mail with defined transport object
  173. let mailOptions = {
  174. from: '"自己" <**@**>', // sender address
  175. to: "**@**", // list of receivers
  176. subject: "最好的自己", // Subject line
  177. html: html // html body
  178. };
  179.  
  180. transporter.sendMail(mailOptions,(error,info = {}) =>{
  181. if(error){
  182. console.log(error);
  183. sendMail();
  184. }
  185. console.log("发送成功",info.messageId);
  186. console.log("等待下一次发送!");
  187. });
  188.  
  189. }
  190.  
  191. async function sendMail_2() {
  192.  
  193. const html = await renderTemplate_2();
  194. // console.log(html);
  195.  
  196. let transporter = nodemailer.createTransport({
  197. host: "smtp.163.com",
  198. port: 465,
  199. secure: true, // true for 465, false for other ports
  200. auth: {
  201. user: "**@**", // generated ethereal user
  202. pass: "***" // generated ethereal password
  203. }
  204. });
  205.  
  206. // send mail with defined transport object
  207. let mailOptions = {
  208. from: '"自己" <**@**>', // sender address
  209. to: "**@**", // list of receivers
  210. subject: "最好的自己", // Subject line
  211. html: html // html body
  212. };
  213.  
  214. transporter.sendMail(mailOptions,(error,info = {}) =>{
  215. if(error){
  216. console.log(error);
  217. sendMail();
  218. }
  219. console.log("发送成功",info.messageId);
  220. console.log("等待下一次发送!");
  221. });
  222.  
  223. }
  224.  
  225. // sendMail_2();
  226.  
  227. var j = schedule.scheduleJob('00 45 21 * * *', function(){
  228. sendMail();
  229. console.log('定时任务执行完毕!');
  230. });
  231.  
  232. var j_2 = schedule.scheduleJob('00 35 22 * * *', function(){
  233. sendMail_2();
  234. console.log('定时任务执行完毕!');
  235. });

下面是页面的样式:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <div style="border: 0px solid red; width: 100%; margin: 40px auto; color: gray; text-align: center; font-size: 20px;" align="center">
  9. <span>我们已经生活了</span>
  10. <span style="font-size: 24px; color: red;">{{dayData.count}}</span>
  11. <span></span>
  12. </div>
  13.  
  14. <div style="border: 0px solid red; width: 100%; margin: 0 auto; color: gray; text-align: center;">
  15. <img src="{{mojiData.icon}}"
  16. style="background: royalblue;"
  17. alt="天气图标"
  18. >
  19. <b style="display: block; color: black; font-size: 24px; margin: 15px 0;">
  20. 天气:{{mojiData.weather}}
  21. </b>
  22. <span style="display: block; color: black; font-size: 22px; margin: 15px 0;">
  23. 温度:{{mojiData.wendu}}
  24. </span>
  25. <span style="display: block; color: lightgray; font-size: 20px;">
  26. 提示:{{mojiData.tips}}
  27. </span>
  28. </div>
  29.  
  30. <div style="text-align: center;margin: 35px 0;">
  31. <span style="display: block; margin-top: 55px;color: gray; font-size: 15px;">
  32. ONE 一个
  33. </span>
  34.  
  35. <span style="display: block; margin-top: 25px;color: lightgray; font-size: 22px;">
  36. {{dayData.format}}
  37. </span>
  38.  
  39. <img src="{{oneData.img}}"
  40. style="margin-top:10px; width: 100%;"
  41. alt="One配图"
  42. >
  43. <div style="margin: 10px auto; width: 85%; color: gray;">
  44. {{oneData.text}}
  45. </div>
  46. </div>
  47. </body>
  48. </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. MySql中指定符号分割并分行展示

    1.涉及到的函数三个: 1.1 REPLACE('value','str1','str2') 用法规则:使用str2替换掉value中的所有的str1; SELECT REPLACE('我来了','来 ...

  2. mybatis 字符串比较 == 用法

    private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...

  3. ixgbe 驱动 为xxx驱动做准备1

    网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...

  4. Socket listen 简要分析

    #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int ...

  5. UNP——原始套接字

    1.原始套接字的用处 使用原始套接字可以构造或读取网际层及其以上报文. 具体来说,可以构造 ICMP, IGMP 协议报文,通过开启 IP_HDRINCL 套接字选项,进而自定义 IPv4首部. 2. ...

  6. day002|python基础回顾2

    目录 00 上节课复习 01 基本数据类型 02 与用户交互 03 运算符 04 流程运算之if判断 05 流程判断之while循环 06 TEST 00 上节课复习 ""&quo ...

  7. Mysql预处理语句prepare、execute、deallocate

    前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...

  8. Maximum execution time of 30 seconds exceeded in

    在执行一次php脚本的时候,遇到了这样的报错,经过c Maximum execution time of 30 seconds exceeded in 翻译过来就是:执行时间超过了30秒最长执行时间: ...

  9. 使用pdfFactory为PDF文件设定查看选项

    一般情况下,大部分PDF文件都会按照默认的查看设置,以100%的尺寸显示第一页的内容.但在一些特殊情况下,PDF文件的创建者会设定其他的文件查看尺寸,或设定打开页为第N页,来达到引起阅读者关注的目的. ...

  10. FL Studio录制面板知识讲解

    FL Studio录制面板可以设置与录制有关的选项,它还有一个用来设置音符对齐的全局吸附选择器.刚接触水果这款音乐制作软件的同学通常不是很清楚这里的知识的,下面小编就给大家讲解一下. 1.首先,我们来 ...