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导入csv文件出现SyntaxError问题分析
Dec 15 Python
Python语言生成水仙花数代码示例
Dec 18 Python
python sys.argv[]用法实例详解
May 25 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
python文件和文件夹复制函数
Feb 07 Python
python模拟实现分发扑克牌
Apr 22 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 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
我的论坛源代码(十)
2006/10/09 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
用js实现trim()的解决办法
2013/04/16 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
bootstrap table表格插件使用详解
2017/05/08 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
详解JavaScript 的变量
2019/03/08 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
Pyramid添加Middleware的方法实例
2013/11/27 Python
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python 多个参数不为空校验方法
2019/02/14 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
电子商务自荐书范文
2014/01/04 职场文书
销售顾问岗位职责
2014/02/25 职场文书
岗位职责怎么写
2014/03/14 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
航班延误投诉信
2015/07/02 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL