标签:
上一篇文章讲了薪资表的拆分功能,这里讲发送功能。《薪资表自动拆分和发送功能(一)》点击打开链接
发送功能是用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