最近刚开学,班里的事也挺多,大多都涉及到excel的使用。本来我excel用得不是很熟,很多高级的操作都不会。比如给两列的交赋值等。在网上搜了下,发现这些操作的实现都涉及到excel内部的一些命令,而不是简单的鼠标操作。Oh NO!这一套规范又不知得学到什么时候了。所以,一直在想有没有别办法。记得python能操作excel,似乎可以用python写个脚本啥的。

正好,昨天用excel查信息时,发现表里的同学的生日和邮箱信息,似乎这两者可以有一定的关联... 对!可以写个python脚本,先判断日期,然后给过生日的同学发一封祝福邮件。Hmmmmm,有点意思,正好可以体现班长我对大家的关怀(逃...)

有了初步的想法,还需要进一步的确定程序的功能细节。要实现自动发送邮件程序,最好该程序能开机自动执行,开机一般没网,需要程序实现联网,联网后才能发邮件...

一番思考后,发现程序需要完成的功能有:

设置程序开机启动

检查开机后网络是否连接,没有的话,须先连接上网络

从excel里面读出同学的日期和邮箱信息

判断日期,如果有同学今天过生日,就发送祝福邮件

1. 设置程序开机启动

我的系统是win10,设置开机启动程序有一个特别简单的方法。直接通过“运行-》输入‘shell:Common Startup’”打开启动项文件夹,将可运行文件或其快捷方式放入该文件夹中,系统每次启动后都会检查该文件夹,并执行里面的文件。更多设置方式见Win10启动项修改技巧

启动文件夹

直接将我们最终的python脚本程序放入启动文件夹即可。

2. 检查网络情况

由于校园网需要登录,所以开机之后,可能需要登录后才能发邮件。

首先需要判断是否需要登录。大家知道,没登录校园网之前,访问其他网站都会被重定向到10.3.8.211,所以直接通过返回的URL判断即可。

如果没有登录,则需要通过校园网账户密码登录。通过谷歌浏览器的开发者工具,查询登录表单所需要的数据,如下图:

浏览器开发者工具

由图可以知,POST有三个数据项DDDDD、upass、0MMKey,前两个分别是校园网账户和密码,最后一个不知道啥玩意...

直接用python强大的requests库的post函数提交,简直方便得不行!

gate_ip = '10.3.8.211'

r0 = requests.get('http://www.baidu.com')

print('url:%s' % r0.url)

if gate_ip in r0.url:

print(u'网络没连上...\n正在连接...')

account = {'DDDDD': '你的学号',

'upass': '你的密码',

'0MKKey': ''}

r = requests.post(

url='http://10.3.8.211/',

data=account

)

print(u'已连接上网络!')

ok,成功连上网络!

3. 从excel读入信息

一开始写这个脚本的目的是熟悉python的excel库,本以为通过python操作excel可能会很麻烦,用过才发现,接口特别简单,直接看代码吧。

data = xlrd.open_workbook('person_info.xlsx')#打开excel文件

table = data.sheets()[0] #读取第一个sheet

nrows = table.nrows #获得表的总行数

source = [table.row_values(i) for i in range(1, nrows)] #读取每行的信息

这里只用到了最简单的读取excel库的方法,以后有需要再研究其他高级的操作。

4. 发送邮件

在网上查了下,python发送邮件的流程大致是:首先选择一个账号,确保该账号开通了SMTP服务,没开通的话,可以在网页版邮箱的设置界面开通;然后在程序中引入SMTP库,并确定邮箱的邮箱服务器,比如163邮箱的邮件服务器是 smtp.163.com,端口是25,不知道的话,可以上网查。最后登录账号,确定邮件内容和收件人,发送邮件。

具体代码如下:

import smtplib

server = smtplib.SMTP('smtp.163.com', 25) #确定邮箱的邮件服务器

server.login(from_addr, password) #from_addr和password分别是我的邮箱的账号和密码

登录之后,就可以通过该账号给其他人发邮件了。

def send(server, name, addr):

str1 = 'hello %s, this is from xiebo\nHappy birthday\nBest Wishes!' % (name) # 邮件正文内容

msg = MIMEText(str1, 'plain', 'utf-8')

msg['from'] = from_addr

msg['to'] = addr

msg['Subject'] = 'Happy Birthday!' #邮件主题

server.sendmail(from_addr, addr, msg.as_string()) #发送邮件

最终效果:

最终效果

注意,邮件可能会被识别为垃圾邮件,收件箱里没有的话,留意下垃圾箱。

5. 总结

总的来说,这脚本的实现比较简单,大多数时间都用于上网查询资料上,但这些都是很有用的功能,涉及到了用python模拟POST请求、操作excel、发送邮件等,以后会经常遇到。

当然,这个脚本也可以引出很多“高级”的玩法,比如记下你喜欢的女生的各种特殊日子,到时间自动发邮件或其他的,这可比日程表好用多了。具体怎么玩,还得各位充分发挥想象(逃...)。

附:完整代码

#auto_login_campus_net.py

# coding:utf-8

import sys

import requests

import re

import datetime

from send_mail import try_send_mail

import time

print(u'准备检查网络及邮箱...')

time.sleep(8)

gate_ip = '10.3.8.211'

# 尝试登陆打开百度,如果没连上网的话,

# 会重定向到 10.3.8.211

# 可以据此判断是否连上网

r0 = requests.get('http://www.baidu.com')

print('url:%s' % r0.url)

if gate_ip in r0.url:

print(u'网络没连上...\n正在连接...')

account = {'DDDDD': '我的账号',

'upass': '我的密码',

'0MKKey': ''}

r = requests.post(

url='http://10.3.8.211/',

data=account

)

print(u'已连接上网络!')

# 再次打开 10.3.8.211 查看当前流量使用情况

try:

r2 = requests.get('http://10.3.8.211')

re1 = re.search(r'time=\'(\d+)', r2.text)

re2 = re.search(r'flow=\'(\d+)', r2.text)

print(u'\n已用时间:%s Min\n已用流量:%s MB\n' %

(re1.group(1), str(int(re2.group(1)) / 1024)))

except Exception,e:

print(e)

print(u'不能访问10.3.8.211')

# print(r2.text.encode('gbk','ignore'))

# print(u'')

# with open('flag.conf','w') as f:

# f.write(datetime.date.today().__str__())

# 判断今天是否已经启动过这个程序

with open('flag.conf', 'r') as f:

date = f.read()

today = datetime.date.today().__str__()

if today == date:

print(u'今天已经运行过此程序了')

else:

try_send_mail()

with open('flag.conf', 'w') as f:

f.write(datetime.date.today().__str__())

# 让终端停一下,方便查看

time.sleep(10)

#send_mail.py

# coding:utf-8

import xlrd

from email.mime.text import MIMEText

import datetime

import time

from mail_config import from_addr, password

def try_send_mail():

print(u'检查是否有人今天过生日...')

def send(server, name, addr):

# 邮件内容

str1 = 'hello %s, this is from xiebo\nHappy birthday\nBest Wishes!' % (

name)

msg = MIMEText(str1, 'plain', 'utf-8')

msg['from'] = from_addr

msg['to'] = addr

msg['Subject'] = 'Happy Birthday!'

server.sendmail(from_addr, addr, msg.as_string())

# 打开excel文件

data = xlrd.open_workbook('person_info.xlsx')

table = data.sheets()[0]

nrows = table.nrows

source = [table.row_values(i) for i in range(1, nrows)]

# 根据excel表中的日期信息确定今天是否有人过生日

# 将excel表中的日期变为字符串,方便判断。

send_list = []

today = datetime.date.today().__str__()[4:]

for i in range(nrows - 1):

source[i][1] = xlrd.xldate.xldate_as_datetime(

source[i][1], 0).__str__()

if today in source[i][1]:

send_list.append(source[i])

print(u'有人过生日!邮箱: %s' % (source[i][2]))

if send_list:

import smtplib

server = smtplib.SMTP('smtp.163.com', 25)

server.login(from_addr, password)

server.set_debuglevel(1)

for item in send_list:

send(server, item[0], item[2])

print('Send an e-mail to %s, the address is %s' %

(item[0], item[2]))

server.quit()

python制作生日祝福_python自动发送生日祝福邮件相关推荐

  1. python 制作抽奖_python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...

  2. python制作五子棋_python制作简单五子棋游戏

    python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...

  3. python制作剪刀石头布_Python制作简单的剪刀石头布游戏

    关于程序相关的 您可以反复玩游戏,直到选择停止为止. 该程序跟踪获胜情况. 大小写无关紧要(即rock与rock相同). 如果您输入的内容无效,程序会一直提示您,直到您输入有效的内容. 对项目进行编码 ...

  4. python制作字典_python如何制作英文字典

    本文实例为大家分享了python制作英文字典的具体代码,供大家参考,具体内容如下 功能有添加单词,多次添加单词的意思,查询,退出,建立单词文件. keys=[] dic={} def rdic(): ...

  5. python制作图画_Python也能绘制艺术画?这里有一个完整教程

    介绍 我们知道Python作为一个程序语言,讲究的是严谨和逻辑:而艺术画似乎处于另一个维度,更多是无规则和随心所欲.然而我们却可以找到两者的交汇点.今天我们将学习如何用Python制作艺术图.一旦我们 ...

  6. python生日祝福短信_python自动发送生日祝福邮件

    最近刚开学,班里的事也挺多,大多都涉及到excel的使用.本来我excel用得不是很熟,很多高级的操作都不会.比如给两列的交赋值等.在网上搜了下,发现这些操作的实现都涉及到excel内部的一些命令,而 ...

  7. python发送带表格的邮件_PYTHON自动发送报表邮件

    要实现上述的功能的话我们需要以下几步:1.做好报表模板 2.更新报表数据 3.发送报表邮件 下面我们就用一个例子来给大家演示一下: 1.报表模板 我们选用一份保险公司每天完成保单的数据进行模板制作,要 ...

  8. python发送邮件脚本_python-发邮件脚本

    折腾nagios发邮件好几天,终于完成,我的系统环境是ubuntu12.04,安装postfix服务,先贴上脚本,如下: #!/usr/bin/env python #-*- coding:utf-8 ...

  9. python制作日历_Python如何绘制日历图和热力图

    本文以2019年全国各城市的空气质量观测数据为例,利用matplotlib.calmap.pyecharts绘制日历图和热力图.在绘图之前先利用pandas对空气质量数据进行处理. 数据处理 从网站下 ...

最新文章

  1. 47%德国企业认为人工智能较大的优势是提高生产效率
  2. php使用curl库进行ssl双向认证
  3. js 定时器的用法和清除
  4. 编译安装 PHP 扩展 - 含 swoole 扩展安装和升级
  5. 错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决办法】...
  6. 开发到底喜欢看怎样的需求文档
  7. 终于来了!全球首发联发科天玑1000+手机入网
  8. Mac OS X: launchd plist在线编辑器
  9. Mysql 分片,大数据量时扩容方案
  10. Java获取当前年份,计算当前月有多少自然日、有多少工作日、有几周
  11. 2021年中国遗嘱人群画像情况(附子女情况、婚姻状况、学历、年龄、性别及各学历段人数分布)[图]
  12. 用canvas让美女沉浸在音符的海洋里
  13. 【软件工程实践】Pig项目1-什么是Pig
  14. 侯捷-C++面向对象高级开发(操作符重载与临时对象)
  15. Android入门教程 (一) Android简介和android studio安装
  16. java 进制转换工具_进制转换工具(JAVA)
  17. BlackBerry简单计数器
  18. java iqq_iQQ 基于WebQQ3.0协议Java开发 跨平台QQ客户端
  19. Linux中IP地址的配置
  20. Unity随记(七) shader实现石像石化效果

热门文章

  1. Android 设置背景之layer-list,层叠多个背景
  2. 不规则三角网(TIN)与 数字高程模型(DEM)
  3. 区块链推文@2019.2.15
  4. KB5022282 0x800F0922 安装更新失败
  5. 白剽,2020年最牛AI技术,各个都有代码
  6. html各种加载动画
  7. 什么是java的标识符_java什么是标识符
  8. Type interface com.msy.dao.IAccountDao is not known to the MapperRegistry.
  9. 使用aws搭建一个区块链(私有链)-- 搭建篇B
  10. android 快盘接口,金山快盘Android版自动备份功能详解