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 28 Python
Django权限机制实现代码详解
Feb 05 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
破解安装Pycharm的方法
Oct 19 Python
简单了解python中对象的取反运算符
Jul 01 Python
python实现while循环打印星星的四种形状
Nov 23 Python
python中count函数简单用法
Jan 05 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
python实现飞船大战
Apr 24 Python
python如何实现递归转非递归
Feb 25 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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
基于mysql的bbs设计(三)
2006/10/09 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
iframe实用操作锦集
2014/04/22 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
python实现下载整个ftp目录的方法
2017/01/17 Python
Python中str.format()详解
2017/03/12 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
python list转置和前后反转的例子
2019/08/26 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
《雨点》教学反思
2014/02/12 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
实习指导老师评语
2014/04/26 职场文书
超越自我演讲稿
2014/05/21 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
罚站检讨书
2015/01/29 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
导游词之西安骊山
2019/12/20 职场文书
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL