前言
提示:这里可以添加本文要记录的大概内容:
一直想写一个定时发送天气提醒的邮件
提示:以下是本篇文章正文内容,下面案例可供参考
一、前期准备
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反馈信息给收件人(贼鸡尴尬,别问我的感受)