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 相关文章推荐
用Python实现协同过滤的教程
Apr 08 Python
python创建关联数组(字典)的方法
May 04 Python
PyCharm代码格式调整方法
May 23 Python
python3使用QQ邮箱发送邮件
May 20 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
python3 下载网络图片代码实例
Aug 27 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
什么是python的列表推导式
May 26 Python
python re.match()用法相关示例
Jan 27 Python
浅谈python数据类型及其操作
May 25 Python
Python基础知识学习之类的继承
May 31 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
python3大文件解压和基本操作
2017/12/15 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python request使用方法及问题总结
2020/04/26 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
公司营业员的自我评价
2014/03/04 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
家长会标语
2014/06/24 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书