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说的很详尽了

HTML模板

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

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

email构建邮件,smtplib发送邮件

  注意:

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

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

crontab定时发送邮件

  我想对crontab说:

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

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

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

  

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

  

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

  

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

  邮件:

  ok??

  源代码:

  1 #!/usr/local/bin/python3
  2 # coding=utf-8
  3
  4 import requests
  5 import json
  6 import smtplib
  7 import jinja2
  8 import os.path as pth
  9 import time
 10 from email.mime.text import MIMEText
 11 from email.header import Header
 12
 13 HEFEN_D = pth.abspath(pth.dirname(__file__))
 14 LOCATION = ‘北京‘
 15 ORIGINAL_URL =  ‘https://free-api.heweather.com/s6/weather/forecast?parameters‘
 16 TO = [‘8*******@qq.com‘, ‘2********@qq.com‘]
 17
 18
 19 def sendEmail(content, title, from_name, from_address, to_address, serverport, serverip, username, password):
 20   msg = MIMEText(content, _subtype=‘html‘,_charset=‘utf-8‘)
 21   msg[‘Subject‘] = Header(title, ‘utf-8‘)
 22   # 这里的to_address只用于显示,必须是一个string
 23   msg[‘To‘] = ‘,‘.join(to_address)
 24   msg[‘From‘] = from_name
 25   try:
 26     s = smtplib.SMTP_SSL(serverip, serverport)
 27     s.login(username, password)
 28     # 这里的to_address是真正需要发送的到的mail邮箱地址需要的是一个list
 29     s.sendmail(from_address, to_address, msg.as_string())
 30     print(‘%s----发送邮件成功‘ % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 31   except Exception as err:
 32     print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
 33     print(err)
 34
 35 def get_data():
 36   new_data = []
 37   parametres = {
 38     ‘location‘: LOCATION,
 39     ‘key‘: ‘************ ‘, #注册和风天气会给你一个KEY
 40     ‘lang‘: ‘zh‘,
 41     ‘unit‘: ‘m‘
 42   }
 43
 44   try:
 45     response = requests.get(ORIGINAL_URL,params=parametres)
 46     r = json.loads(json.dumps(response.text,ensure_ascii=False,indent=1))
 47     r = json.loads(response.text)
 48   except Exception as err:
 49     print(err)
 50
 51   weather_forecast = r[‘HeWeather6‘][0][‘daily_forecast‘]
 52   for data in weather_forecast:
 53     new_obj = {}
 54     # 日期
 55     new_obj[‘date‘] = data[‘date‘]
 56     # 日出时间
 57     new_obj[‘sr‘] = data[‘sr‘]
 58     # 日落时间
 59     new_obj[‘ss‘] = data[‘ss‘]
 60     # 最高温度
 61     new_obj[‘tmp_max‘] = data[‘tmp_max‘]
 62     # 最低温度
 63     new_obj[‘tmp_min‘] = data[‘tmp_min‘]
 64     # 白天天气状况描述
 65     new_obj[‘cond_txt_d‘] = data[‘cond_txt_d‘]
 66     # 风向
 67     new_obj[‘wind_dir‘] = data[‘wind_dir‘]
 68     # 风力
 69     new_obj[‘wind_sc‘] = data[‘wind_sc‘]
 70     # 降水概率
 71     new_obj[‘pop‘] = data[‘pop‘]
 72     # 能见度
 73     new_obj[‘vis‘] = data[‘vis‘]
 74
 75     new_data.append(new_obj)
 76   return new_data
 77
 78
 79
 80 def render_mail(data):
 81   env = jinja2.Environment(
 82       loader = jinja2.FileSystemLoader(HEFEN_D)
 83     )
 84   return env.get_template(‘hefentianqi.html‘).render({‘data‘: data})
 85
 86 def main():
 87   config = {
 88   "from": "2********@qq.com",
 89   "from_name": ‘预报君‘,
 90   "to": TO,
 91   "serverip": "smtp.qq.com",
 92   "serverport": "465",
 93   "username": "2*******@qq.com",
 94   "password": "**********" #QQ邮箱的SMTP授权码
 95   }
 96
 97   title = "别走,我给你看个宝贝"
 98
 99   data = get_data()
100   body = render_mail(data)
101   sendEmail(body, title, config[‘from_name‘], config[‘from‘], config[‘to‘], config[‘serverport‘], config[‘serverip‘], config[‘username‘], config[‘password‘])
102
103
104 main()

时间: 2024-10-03 15:47:50

QQ邮件定时发送天气预报的相关文章

js 多个checkedBox分组互斥功能实现 由于QQ邮件无法发送暂且将js写在博客园

今天有一项目需要实现多个checkbox分组实现组内互斥功能 . 具体要求如下:大的分类分为A B C 三类, 其中 A   B 中又分为 A1 A2 A3   B1 B2 B3  二级分类,二级分类下又有 A11  A12 A13 A14  A21 A22 A31 A32  B11 B12 B13 B14 ... .要求实现 A B C 互斥 A1 A2 A3 B1 B2 B3 组内互斥.具体结构及代码如下 具体功能树如下: A A1 A11 A12 A13 A2 A21 A22 A3 A31

SAP B1 9.1开启邮件定时发送功能

SAP B1 9.1开启邮件定时发送功能需要几个步骤 1.服务端开启SBO Mailer 2.配置发件箱 3.设置警报提示管理 注意: 1.登陆人发件箱必须使用服务端上配置的发件箱,用户缺省设置邮箱也要为发件箱 2.设置好发送频率后,不管发件人是否登陆系统,邮件都会自动发送

java实现邮件定时发送

最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000); schedule方法的第一个参数是需要执行

Python实现微信定时发送天气预报

schedule实现定时 1 import requests 2 from requests import exceptions 3 from urllib.request import urlopen 4 from bs4 import BeautifulSoup 5 import re 6 from wxpy import * 7 import schedule 8 import time 9 10 11 bot=Bot(cache_path=True) #登陆网页微信,并保存登陆状态 12

用python自制微信机器人,定时发送天气预报

0 引言 前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己.最近无意中发现了wxpy库,用它来做再合适不过了.以下是wxpy库的简介: wxpy基于itchat,使用了 Web 微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计.微信公众号.微信好友.微信群基本信息获取等功能. 废话不多说,代码写起来. 1 环境 操作系统:Windows / Li

SPring中quartz的配置(可以用实现邮件定时发送,任务定时执行,网站定时更新等)

http://www.cnblogs.com/kay/archive/2007/11/02/947372.html 邮件或任务多次发送或执行的问题: 1.<property name="concurrent" value="false" />可以用于防止任务多次执行 2.将quartz的配置单独出来,防止tomcat加载spring. 具体做法:http://blog.csdn.net/zhujianpengzha/article/details/814

centos7通过邮件定时发送linux系统状态

#vim /etc/mail.rc 在文档最后添加以下两行 set from=***@163.com smtp=smtp.163.com set smtp-auth-user=***@163.com smtp-auth-password=*** smtp-auth=login 下面一行命令式测试添加后能不能发送邮件给***@qq.com #cat /etc/passwd | mail -s "system statue" [email protected] #vim /root/spa

Java发送QQ邮件

面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop3和smtp服务,其实这就是两个网络协议,一个是接受邮件的协议,一个是发送邮件的协议: POP3 是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第一个离线协议标准,P

java通过SMTP发送QQ邮件(参考自龙果学院)

java通过SMTP发送QQ邮件编辑 个人邮箱开通SMTP服务(进入个人邮箱,点击设置–>账户):  点击了账户后,往下拉可以看到SMTP服务选项,默认情况下这个选项是不开启的.点击开启腾讯会进行身份验证,身份验证通过以后,会收到一个用于使用SMTP的16位口令,验证身份的过程中把收到的口令保存下来,因为后面要使用SMTP功能必须要用到这个口令.  具体实现代码:     public static void main(String args[]) {        // 邮件内容