码迷,mamicode.com
首页 > 其他好文 > 详细

薪资表自动拆分和发送功能(二)

时间:2015-05-30 00:43:45      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

        上一篇文章讲了薪资表的拆分功能,这里讲发送功能。《薪资表自动拆分和发送功能(一)》点击打开链接

        发送功能是用python的email模块实现的,代码如下。运行环境是active python2.7

# -*- coding: cp936 -*-
import smtplib
from email.mime.text import MIMEText  
import email.mime.multipart
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
import glob
import win32api
import os, sys


######################################################################################


mail_subject = ""                        # 邮件主题,例如“4月薪资明细”
mail_host = "smtp.163.com"    # 设置服务器
mail_user = "myname@163.com"  # 我的邮箱地址
mail_pass = "mypwd"               # 我的邮箱密码 
mail_postfix = "xxxx.xxx"          # 发件箱的后缀
mail_content = ""                       #邮件正文,可以写“请注意查收,有问题及时联系”之类
mail_from = "<" + mail_user + ">"  # 这里的hello可以任意设置,收到信后,将按照设置显示
mail_lists = {}
xls_list = []
CD_TIME = 5                             #两封邮件之间的间隔时间,秒


######################################################################################


def get_mail_list(config_file):   # 读取maillist.csv,每行记录是 人名,邮箱地址,比如  张三,zhangsan@163.com。
        global mail_lists                 # csv文件可用excel编辑,注意间隔符是英文逗号“,”,不是中文逗号“,”
        f = open(config_file, "rb")
        l = f.readlines()
        f.close()

        for i in l:
                t = i.split(‘,‘)
                mail_lists[t[0]] = t[1].rstrip()


def get_xls_list(filter):       #遍历当前目录下的xls文件,作为邮件附件,文件名是人名,其它xls不要放到该目录,比如总表
        global xls_list
        xls_list = glob.glob(filter)


def dump_list():                #打印两个列表,以便核对
        print ‘mail list:‘
        for k, v in mail_lists.iteritems():
                print ‘    ‘, k, ‘\t‘, v
        print

        print ‘excel list:‘
        for v in xls_list:
                print ‘    ‘, v
        print


def precheck_mail_list():       #检查邮件列表有没有错误
        global mail_lists, xls_list
        for xls in xls_list:
                name = xls[:-4]
                if name not in mail_lists:
                        print ‘error: 此人的邮箱地址没有配置,‘, xls, ‘,删除该文件,或在邮件列表中增加配置‘
                        print
                        raise


def get_mail_subject():         #获取邮件主题,需要输入月份数字,后面会自动加‘月薪资明细‘,比如输入4,邮件主题就是‘4月薪资明细‘
        print ‘输入发送月份:‘,
        this_month = raw_input()
        if int(this_month) < 1 or int(this_month) > 12:
                print ‘没有这个月份,亲爱的!‘
                raise

        global mail_subject
        mail_subject = this_month + ‘月薪资明细‘
        print ‘确认邮件主题: %s\n(y/n)‘ % mail_subject
        confirm = raw_input()
        if confirm.lower() != ‘y‘:
                print ‘取消发送‘
                raise


######################################################################################


def send_mail():                   #发送邮件
        s = smtplib.SMTP()  
        s.connect(mail_host)  # 连接smtp服务器
        s.login(mail_user, mail_pass)  # 登陆服务器

        send_count = 0
        skip_mail = []
        global mail_lists, xls_list, mail_subject
        for idx, xls in enumerate(xls_list):    #遍历附件列表
                print

                name = xls[:-4]      #后缀名.xls占4个字符,去掉后缀名,取人名
                mail_address = mail_lists[name]     #根据人名取他的邮箱地址
                if ‘@‘ not in mail_address:
                        print ‘邮箱没有配置, 无法发送:‘, name
                        skip_mail.append(name)
                        continue

                print ‘【正在准备邮件】: %s --> %s‘ % (xls, mail_address)

                mail_to = [mail_address,]      # 收件人
                msg = MIMEMultipart()
                body = MIMEText(mail_content, _subtype=‘html‘, _charset=‘gb2312‘)  # 创建一个实例,这里设置为html格式邮件
                msg.attach(body)
                msg[‘Subject‘] = mail_subject      # 设置主题
                msg[‘From‘] = mail_from  
                msg[‘To‘] = ";".join(mail_to)  

                #附件内容,若有多个附件,就添加多个part, 如part1,part2,part3
                part = MIMEBase(‘application‘, ‘octet-stream‘)
                # 读入文件内容并格式化,此处文件为当前目录下,也可指定目录 例如:open(r‘/tmp/123.txt‘,‘rb‘)
                part.set_payload(open(xls,‘rb‘).read())
                Encoders.encode_base64(part)
                # 设置附件头
                part.add_header(‘Content-Disposition‘, ‘attachment; filename="%s"‘ % xls)
                msg.attach(part)

                #interrupt?这里设计了一个倒计时的功能,万一检查到人名、邮箱配对错误,马上可以中断,防止工资条发到别人邮箱
                for cd in xrange(CD_TIME, 0, -1):
                        print ‘准备发送, 按Ctrl + C可中断, 倒计时%2d‘ % cd
                        win32api.Sleep(1000)

                s.sendmail(mail_from, mail_to, msg.as_string())  # 发送邮件
                send_count = send_count + 1
                print ‘【邮件发送成功】: %s --> %s‘ % (xls, mail_address)

                #删除已发送的附件,这样的话,万一中间出错,只需要重新执行脚本就行了,已发送过的人的附件不会再出现、也不会被发送
                win32api.DeleteFile(xls)

                #all complete?
                if idx < len(xls_list) - 1:
                        for cd in xrange(CD_TIME, 0, -1):
                                print ‘准备下一封, 按Ctrl + C可中断, 倒计时%2d‘ % cd
                                win32api.Sleep(1000)

        s.close()

        print
        print ‘所有邮件发送成功!总共 %d 封‘ % send_count
        if len(skip_mail) > 0:
                print ‘另有 %d 封邮件无法发送‘ % len(skip_mail)

def do_work():
        get_mail_list(‘maillist.csv‘)
        get_xls_list(‘*.xls‘)
        dump_list()
        precheck_mail_list()
        get_mail_subject()
        send_mail()


######################################################################################


if __name__ == ‘__main__‘:
        do_work()


PS: 以上代码工作前,需要几个准备工作:

1. 你新建个目录,比如G:\xls_auto_mail,作为你的工作目录

2. 把上述代码拷贝到一个文本文件中,另存为比如salary_mail.py,保存在刚才的工作目录下。

3. 在工作目录中建立一个邮件列表,maillist.csv,比如这样:

技术分享

代码的工作机制是这样:遍历当前工作目录下的所有.xls文件,根据.xls文件的文件名,去邮件列表中查找对应的邮箱地址,向这个邮箱发送邮件,并把这个.xls文件作为附件。邮件标题的形式目前是“X月薪资明细”,邮件内容为空,这两项都可自行修改。maillist.csv中没有配置邮箱的人,不会向他发送邮件,即使有他的附件存在。



#参考资料
#http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html
#http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343463.html


薪资表自动拆分和发送功能(二)

标签:

原文地址:http://blog.csdn.net/unknowm/article/details/46242445

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!