前言
人生苦短,我用Python。这句话证明现在Python有多火。大约2年前我就开始接触了Python,因工作需求要自学Python ,后续的SDK打包脚本就是用Python编写的。对于Python的理解基本停留在会用阶段,深入的话就拉垮了。最近忙里偷闲,用之前自学过的知识点组合一下,搞一点有意思的事情。
你能学到的知识
-
Python中的JSON解析
-
Python中SMTP发送邮件
-
Python中字典的概念
文章中所用的编译器为Mac Pycharm 社区版,演示代码为Python 2.7版本
制定一个需求
获取中国天气网指定城市的天气,例如我在北京。然后获取北京天气数据等状态信息,通过邮件发送给女朋友,就这么简单。
环境配置
为了照顾一下新手同学,从零给大家演示下,环境的配置和安装。有python基础的可以忽略此块往下看。新手同学看过来啊、看过来!!!
本文演示的编译器为Mac Pycharm社区版,Python环境是mac上自带的不需要单独装(这也是我喜欢用mac原因很多环境都自带)。打开终端输出python直接能展示出python版本。我的版本为2.7.16。
倒叙说一下,如果之前没有安装过对应的库直接running我的小例子会直接报错,报错原因入下图所示,这个错误简单说就是没有找到requests这个库。在安装requests库 之前你的有一个包管理工具,用来管理第三方库的安装、卸载、更新,没错它就是pip.
1.pip简介和安装
pip是什么:首先要给它定义一下,pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。你可以通过以下命令来判断是否已安装:
pip --version # Python2.x 版本命令
pip3 --version # Python3.x 版本命令
当然了正常情况下, 你肯定是没安装过。那么我演示一下,mac里怎么安装配置的。mac里面python自带easy_install,在终端里面执行sudo easy_install pip
用sudo(超级管理员)命令的时候需要输入密码,这个密码是你自己电脑的密码,输入的时候采取了“安全措施”,你看不到自己输入的字符,完整的输入进去以后,回车就可以了。如果输出错误会有提示的,你重新输入即可。对应的命令展示看下图。完成后输入 pip -v 显示20.3.1说明安装是没问题的。
2.requests简介和安装
接着上面的继续说,pip包管理工具安装完成了,该进行下一步安装requests。那么什么是Requests : requests是python编写,基于urllib,采用Apache2 Licensed 开源协议Http库。它用起来比urllib更加方便,可以满足我们工作中很多有关于http的需求。
终端直接运行 pip install requests即可安装,这是python2.x的命令,如果你用的和我不是一个版本,用的python3.x的话需要更改下命令:pip3 install requests 。安装成功的标志能看到Successfully,如下图所示喽。
网络解析
根据上面的需求得知我们需要一个天气数据来填充邮件。中国天气网有一个免费天气Api地址:点击直达,通过城市名字获得天气数据,json数据格式,如下图所示,为了看着舒服格式化json数据。
{
"data": {
"yesterday": {
"date": "15日星期二",
"high": "高温 0℃",
"fx": "北风",
"low": "低温 -8℃",
"fl": "<![CDATA[1级]]>",
"type": "多云"
},
"city": "北京",
"forecast": [{
"date": "16日星期三",
"high": "高温 2℃",
"fengli": "<![CDATA[2级]]>",
"low": "低温 -8℃",
"fengxiang": "北风",
"type": "晴"
}, {
"date": "17日星期四",
"high": "高温 4℃",
"fengli": "<![CDATA[2级]]>",
"low": "低温 -6℃",
"fengxiang": "北风",
"type": "晴"
}, {
"date": "18日星期五",
"high": "高温 1℃",
"fengli": "<![CDATA[2级]]>",
"low": "低温 -8℃",
"fengxiang": "北风",
"type": "晴"
}, {
"date": "19日星期六",
"high": "高温 2℃",
"fengli": "<![CDATA[1级]]>",
"low": "低温 -7℃",
"fengxiang": "北风",
"type": "晴"
}, {
"date": "20日星期天",
"high": "高温 5℃",
"fengli": "<![CDATA[1级]]>",
"low": "低温 -6℃",
"fengxiang": "北风",
"type": "晴"
}],
"ganmao": "感冒高发期,尽量避免外出,外出戴口罩防护。",
"wendu": "1"
},
"status": 1000,
"desc": "OK"
}
我们用 python 代码对这个url进行解析,我写一个小例子。如下图所示。是不是代码很少python就四行搞定。而java进行一次get请求,少说都要写一两百行代码,创建流,发请求,解析数据,关闭流等等。当然了我也不是说java不好,每个语言的诞生总是有它应用的场景。
邮件相关的配置
接着上面说数据有了,得发邮件呀。Python中SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
-
host: SMTP 服务器主机,这是一个可选参数。
-
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
-
local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数说明:
-
from_addr: 邮件发送者地址。
-
to_addrs: 字符串列表,邮件发送地址
-
msg: 发送消息
这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。
既然要使用SMTP协议,对应的邮箱我们需要开启对应服务才能使用。我拿QQ邮箱演示(其它邮箱基本都是一个套路不做多说) 邮箱设置——账户——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务打开前两项。
开启前两项后,会出现下图所示,点击生成授权码。生成完授权码一定要保存好不要外泄涉及到安全问题不可忽视。代码中授权码我用字符串“p123ffsasasa1”代替。为了正常跑通流程需要换成你的邮箱还有授权码,不然发不了邮件。
完整的代码
该说该注意的都已经说了,直接上代码,注释基本都加上了。不难理解,代码需要注意对齐和空格问题。
代码中用到字典,字典是另一种可变容器模型,且可存储任意类型对象。字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的。
sendEmail.py
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests, json,smtplib
from email.mime.text import MIMEText
from email.header import Header
'''
# 获取城市天气
#参数1 传城市信息
#参数2 传url链接
#例如今日天气 : '+response['data']['forecast'][0]['type'] ,这个获取forecast字段下type字段文字
'''
def getCityWhether(city,linkUrl):
url = linkUrl+ city #拼接字符串 实际url就是 http://wthrcdn.etouch.cn/weather_mini?city=北京
response = requests.get(url).json() #把返回的数据解析成json
msg = '\r\n今日天气 : '+response['data']['forecast'][0]['type'] + '\r\n温度 :'+response['data']['forecast'][0]['high'] + ' -- '+response['data']['forecast'][0]['low'] + '\r\n风力:'+response['data']['forecast'][0]['fengli'][9:-3] +' -- '+response['data']['forecast'][0]['fengxiang']+'\r\n注意事项 : '+response['data']['ganmao']+'\r\n'
return str(msg)
# python 字典类型转换为json对象
dataSource = {
'linkUrl':'http://wthrcdn.etouch.cn/weather_mini?city=',
'city':'北京', #你所在的城市,假如你在上海,可以写上海
'title':'帅气的男朋友上线喽!\r\n',
'end':'\r\n ———python测试呦~~~~~~~'
}
# 构造邮件的文本数据
msg = dataSource['title'] +getCityWhether(dataSource['city'],dataSource['linkUrl'])+dataSource['end']
message=MIMEText(msg,'plain','utf-8')
message['From']=Header('北京朝阳区精神病院长 <北京朝阳区精神病院长@qq.com>','utf-8') #邮件展示发件人信息
message['To']=Header('小仙女 <小仙女@qq.com>','utf-8') #邮件展示收件人信息
message['Subject']=Header("小仙女专属邮件,请点击查收!",'utf-8') #接收邮件主题内容
sender='精神病@qq.com' #真实的邮箱地址,一定要填你自己的邮箱
receiverMail='院长@qq.com' #真实的收件邮箱,你要发邮件的邮箱地址
try:
# 发送邮件构造
smtp = smtplib.SMTP()
smtp.connect('smtp.qq.com',25) #qq请求方式 参数2 为端口号
smtp.login('精神病@qq.com', 'p123ffsasasa1') #参数1 你自己的真实邮箱地址 参数2 为 smtp的授权码,需要自己生成
smtp.sendmail(sender, receiverMail, message.as_string()) #发送邮件
smtp.quit()
print "发送邮件成功请耐心等候..........."
except smtplib.SMTPException:
print "Error:无法发送邮件请检查代码"
如何运行程序? 在编译器右键run,或者 控制台 python sendEmail.py。代码展示效果如下图
代码后续优化和改善
抛砖引玉,功能可以继续往下写,获取天气的基础上可以套用免费或者收费的接口加入小笑话 黄历 等功能,通知上不一定要用邮箱的方式,可以以短信 微信(之前python是有个免费插件后来被和谐了)等方式发给你女朋友。如此关心你女朋友。她一感动是不是今天不用跪搓衣板了
结尾
别问,问就是单身 。好好工作,努力赚钱。爱情依靠相互喜欢相互吸引,勿做舔狗。加油吧打工人。