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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 Python
python使用post提交数据到远程url的方法
Apr 29 Python
在Python中使用成员运算符的示例
May 13 Python
简单谈谈python中的语句和语法
Aug 10 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
用django设置session过期时间的方法解析
Aug 05 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
python实现FTP循环上传文件
Mar 20 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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
php中json_encode中文编码问题分析
2011/09/13 PHP
php常用Stream函数集介绍
2013/06/24 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python学习小技巧总结
2018/06/10 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Python解析多帧dicom数据详解
2020/01/13 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
师德演讲稿范文
2014/05/06 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
邓小平理论心得体会
2014/09/09 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android
mysql序号rownum行号实现方式
2022/12/24 MySQL