zoukankan      html  css  js  c++  java
  • 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;  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;  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;  100%;"
                    alt="One配图"
                 >
                <div style="margin: 10px auto;  85%; color: gray;">
                     {{oneData.text}}
                </div>
            </div>
        </body>
    </html>

    每天都要照顾好自己。

  • 相关阅读:
    Toast的替代者Snackbar
    SnappyDB—Android上的NoSQL数据库简介
    ButterKnife使用小结
    The following classes could not be found:
    asp.net后台解析JSON,并将值赋给对象
    .NET4.0的listview与DataPager的结合使用时的模板编辑
    ASP.NET 后台页面无法识别服务器控件ID
    Asp.net中判断是否是指定页面请求的代码示例
    ASP.NET中修改从数据库获取的datatable中的值
    GridView自定义分页样式(上一页,下一页,到第几页)
  • 原文地址:https://www.cnblogs.com/wuren-best/p/11782552.html
Copyright © 2011-2022 走看看