python定时利用QQ邮件发送天气预报的实例


Posted in Python onNovember 17, 2017

大致介绍

好久没有写博客了,正好今天有时间把前几天写的利用python定时发送QQ邮件记录一下

1、首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.com/douments/api/s6/weather-forecast)

2、利用python的jinja2模块写一个html模板,用于展示数据

3、python的email构建邮件,smtplib发送邮件

4、最后使用crontab定时执行python脚本

涉及的具体知识可以去看文档,本文主要就是解释代码的结构

和风天气API

API没什么好说的,利用requests库去请求数据,然后提取出数据,使用方法和风天气API说的很详尽了

python定时利用QQ邮件发送天气预报的实例

HTML模板

利用jinja2在和脚本同级的目录写一个HTML模板

python定时利用QQ邮件发送天气预报的实例

写好模板,我们就需要在脚本中引入他,并给他传递数据

python定时利用QQ邮件发送天气预报的实例

email构建邮件,smtplib发送邮件

注意:

1、首先需要开启QQ邮箱的SMTP服务,一般端口是465

2、在构建邮件和发送邮件时都需要接受者的邮箱,但是他们需要的数据格式是不同的,在构建邮件时,接受者邮箱需要转换成一个string,而在发送邮件时,接受者邮箱必须是一个list

python定时利用QQ邮件发送天气预报的实例

crontab定时发送邮件

我想对crontab说:

python定时利用QQ邮件发送天气预报的实例

这个crontab真的是大坑,坑了我好久,坑的我不行不行的

既然你们诚心诚意的发问了,那我就大发慈悲的告诉你们是那些坑吧

1、在crontab中要写绝对路径,包括python3,查看python的安装位置:

python定时利用QQ邮件发送天气预报的实例

2、如果脚本中涉及了中文,记得一定要写export LANG="****",如果不知道属性是什么:

python定时利用QQ邮件发送天气预报的实例

然后 crontab -e写入类似下面的代码:

python定时利用QQ邮件发送天气预报的实例

表示在每晚的22:00执行脚本,具体的crontab语法可以自行搜索

邮件:

python定时利用QQ邮件发送天气预报的实例

ok!

源代码:

#!/usr/local/bin/python3
# coding=utf-8

import requests
import json
import smtplib
import jinja2
import os.path as pth
import time
from email.mime.text import MIMEText
from email.header import Header

HEFEN_D = pth.abspath(pth.dirname(__file__))
LOCATION = '北京'
ORIGINAL_URL = 'https://free-api.heweather.com/s6/weather/forecast?parameters'
TO = ['8*******@qq.com', '2********@qq.com']


def sendEmail(content, title, from_name, from_address, to_address, serverport, serverip, username, password):
 msg = MIMEText(content, _subtype='html',_charset='utf-8')
 msg['Subject'] = Header(title, 'utf-8')
 # 这里的to_address只用于显示,必须是一个string
 msg['To'] = ','.join(to_address)
 msg['From'] = from_name
 try:
  s = smtplib.SMTP_SSL(serverip, serverport)
  s.login(username, password)
  # 这里的to_address是真正需要发送的到的mail邮箱地址需要的是一个list
  s.sendmail(from_address, to_address, msg.as_string())
  print('%s----发送邮件成功' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 except Exception as err:
  print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
  print(err)

def get_data():
 new_data = []
 parametres = {
  'location': LOCATION,
  'key': '************ ', #注册和风天气会给你一个KEY
  'lang': 'zh',
  'unit': 'm'
 }

 try:
  response = requests.get(ORIGINAL_URL,params=parametres)
  r = json.loads(json.dumps(response.text,ensure_ascii=False,indent=1))
  r = json.loads(response.text)
 except Exception as err:
  print(err)

 weather_forecast = r['HeWeather6'][0]['daily_forecast']
 for data in weather_forecast:
  new_obj = {}
  # 日期
  new_obj['date'] = data['date']
  # 日出时间
  new_obj['sr'] = data['sr']
  # 日落时间
  new_obj['ss'] = data['ss']
  # 最高温度
  new_obj['tmp_max'] = data['tmp_max']
  # 最低温度
  new_obj['tmp_min'] = data['tmp_min']
  # 白天天气状况描述
  new_obj['cond_txt_d'] = data['cond_txt_d']
  # 风向
  new_obj['wind_dir'] = data['wind_dir']
  # 风力
  new_obj['wind_sc'] = data['wind_sc']
  # 降水概率
  new_obj['pop'] = data['pop']
  # 能见度
  new_obj['vis'] = data['vis']

  new_data.append(new_obj)
 return new_data



def render_mail(data):
 env = jinja2.Environment(
   loader = jinja2.FileSystemLoader(HEFEN_D)
  )
 return env.get_template('hefentianqi.html').render({'data': data})

def main():
 config = {
 "from": "2********@qq.com",
 "from_name": '预报君',
 "to": TO,
 "serverip": "smtp.qq.com",
 "serverport": "465",
 "username": "2*******@qq.com",
 "password": "**********" #QQ邮箱的SMTP授权码
 }

 title = "别走,我给你看个宝贝"

 data = get_data()
 body = render_mail(data)
 sendEmail(body, title, config['from_name'], config['from'], config['to'], config['serverport'], config['serverip'], config['username'], config['password'])


main()

以上这篇python定时利用QQ邮件发送天气预报的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
Python实现一个简单的MySQL类
Jan 07 Python
python检查序列seq是否含有aset中项的方法
Jun 30 Python
Python注释详解
Jun 01 Python
Python 操作MySQL详解及实例
Apr 30 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
python2 与python3的print区别小结
Jan 16 Python
python实现五子棋人机对战游戏
Mar 25 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
详解python eval函数的妙用
Nov 16 #Python
Python算法之图的遍历
Nov 16 #Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 #Python
python字典操作实例详解
Nov 16 #Python
python实现报表自动化详解
Nov 16 #Python
TF-IDF算法解析与Python实现方法详解
Nov 16 #Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 #Python
You might like
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
序列化Python对象的方法
2020/08/01 Python
Python request post上传文件常见要点
2020/11/20 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
一套C++笔试题面试题
2012/06/06 面试题
高中体育教学反思
2014/01/24 职场文书
建筑个人求职信范文
2014/01/25 职场文书
优秀党员获奖感言
2014/02/18 职场文书
竞聘书格式及范文
2014/03/31 职场文书
本科生自荐信
2014/06/18 职场文书
连锁超市项目计划书
2014/09/15 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
入团申请书格式
2019/06/20 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android