应用unicloud实现定时发布天气邮件提醒

4 篇文章 0 订阅

前言

提示:这里可以添加本文要记录的大概内容:

一直想写一个定时发送天气提醒的邮件


提示:以下是本篇文章正文内容,下面案例可供参考

一、前期准备

1.申请unicloud云服务
2.自己申请开启想用的邮箱smtp服务相关服务(自用新浪邮箱)
3.在相应的云函数里面运行终端命令(npm install nodemailer),安装相关包。
4.在网上找类似国家天气网的API,我用的是(http://wthrcdn.etouch.cn/WeatherApi?citykey=“城市代码”)

二、使用步骤

1.引入包

在云函数里面引入nodemailer包:

const nodemailer = require('nodemailer')

2.处理天气API获取天气返回信息

代码如下(示例):

let url="http://wthrcdn.etouch.cn/WeatherApi?citykey="+//城市代码
let ddl = await uniCloud.httpclient.request(url, {data: {}})

此API返回的数据为xlm格式数据,我自己手写了一个js将xml转对象的方法

function lookup(str, label, type) {  //参数1:需要找的xml的字符串,参数2:数据存储的标签,参数3:正则表达式的匹配方式(“”,“g”)
	var regex = new RegExp('(?<=<' + label + '>)(.*?)(?=<\\/' + label + '>)', type)
	return str.match(regex);
}

//函数的调用
function transformXml(xmls) {
	//console.log(xmls)
	let info = new Object();
	xmls = lookup(xmls, "resp", "")[0]
	// 获取城市
	info.city = lookup(xmls, "city", "")[0]
	// 获取温度
	info.wendu = lookup(xmls, "wendu", "")[0] + "摄氏度"
	// 获取当前风向,风力
	let nowfeng = new Object();
	nowfeng.fengli = lookup(xmls, "fengli", "")[0].replace(/[^0-9]/ig, "") + "级"
	nowfeng.fengxiang = lookup(xmls, "fengxiang", "")[0]
	info.nowfeng = nowfeng
	// 获取当前湿度
	info.nowshidu = lookup(xmls, "shidu", "")[0]
	// 获取今日预测信息
	var weather = lookup(xmls, "weather", "")[0]
	var d = new Date();
	var year = d.getFullYear();
	var mon = d.getMonth() + 1; //取年月
	info.nowdate = year + '年' + mon + '月' + lookup(weather, "date", "")[0]
	info.pre_tem = lookup(weather, "high", "")[0] + "、" + lookup(weather, "low", "")[0]
	// 获取预测白天天气数据
	var day = new Object();
	var white = lookup(weather, "day", "")[0];
	day.type = lookup(white, "type", "")[0]
	day.fengxiang = lookup(white, "fengxiang", "")[0]
	day.fengli = lookup(white, "fengli", "")[0].replace(/[^0-9]/ig, "") + "级"
	info.day = day
	// 获取预测晚上天气数据
	var night = new Object();
	var black = lookup(weather, "night", "")[0];
	night.type = lookup(black, "type", "")[0]
	night.fengxiang = lookup(black, "fengxiang", "")[0]
	night.fengli = lookup(black, "fengli", "")[0].replace(/[^0-9]/ig, "") + "级"
	info.night = night
	// 获取相关指数
	var zhishus = lookup(xmls, "zhishu", "g");
	var zhishu = [];
	for (var ddl = 0; ddl < zhishus.length; ddl++) {
		var item = new Object();
		item.name = lookup(zhishus[ddl], "name", "g")[0];
		item.value = lookup(zhishus[ddl], "value", "g")[0];
		item.detail = lookup(zhishus[ddl], "detail", "g")[0];
		zhishu.push(item)
	}
	info.zhishu = zhishu
	return info;
}

3.应用发送邮件的服务(参考为新浪邮箱)

代码如下(示例):

//服务实例化
let transporter = nodemailer.createTransport({
	 		host: 'smtp.sina.com',
	 		secureConnection: true,
	 		port: 465,
	 		secure: true,
	 		auth: {
	 			user: '自己的邮箱地址',
	 			pass: '自己申请的服务验证码'
	 		}
	 	})
const infos = await transporter.sendMail({
	 		from: info[count].fromname+'<必须同上面自己的邮箱地址>',
	 		to: info[count].addresseeeamil, //收件人邮箱地址
	 		subject: '天气提醒',  //标题
	 		html: h5js, //内容,将上面对象化处理的天气信息通过拼接字符串的方式(注意转义字符)处理为html代码格式
	 		text: ""
	 	})
	 	//判断是否发送成功
	 	if (infos.messageId) {
	 		log.push({
	 			code: info[count].addresseename,
	 			msg: '发送成功'
	 		})
	 	} else {
	 		log.push({
	 			code: info[count].addresseename,
				msg: '发送失败'
			})
		}
	 }

4.提供一个问候时间判断函数

function counttime() {
	var hours = getOffsetDate(8).getHours();
	if (hours >= 0 && hours < 5) {
		return "凌晨好"
	} else if (hours >= 5 && hours < 8) {
		return "早晨好"
	} else if (hours >= 8 && hours < 11) {
		return "上午好"
	} else if (hours >= 11 && hours < 13) {
		return "中午好"
	} else if (hours >= 13 && hours < 18) {
		return "下午好"
	} else if (hours >= 18 && hours <= 24) {
		return "晚上好"
	}
}


function getOffsetDate(offset) {
	return new Date(
		Date.now() + (new Date().getTimezoneOffset() + (offset || 0) * 60) * 60000
	)
}

5.unicloud服务器云函数的定时触发(参考为阿里云)

提示:提供一些简单写法,具体规则参考uniapp的官方说明文档

*/5 * * * * * * 表示每5秒触发一次
0 0 2 1 * * * 表示在每月的1日的凌晨2点触发
0 15 10 * * MON-FRI * 表示在周一到周五每天上午10:15触发
0 0 10,14,16 * * * * 表示在每天上午10点,下午2点,下午4点触发
0 */30 9-17 * * * * 表示在每天上午9点到下午5点内每半小时触发
0 0 12 * * WED * 表示在每个星期三中午12点触发

总结注意细节

1.nodemailer必须安装在对应云函数的文件夹下面,上传的时候一并上传
2.要特别注意,服务器的时间大多是都是0时区,所以在counttime()函数里面的时间获取应用了8时区的时间(中国北京时间)
3.建议完成后,先拿自己的邮箱实验几天,避免出现中间出错,发送bug反馈信息给收件人(贼鸡尴尬,别问我的感受)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值