python自动发送生日祝福邮件

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

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

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

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

  1. 设置程序开机启动
  2. 检查开机后网络是否连接,没有的话,须先连接上网络
  3. 从excel里面读出同学的日期和邮箱信息
  4. 判断日期,如果有同学今天过生日,就发送祝福邮件

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容