| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1393 人关注过本帖
标题:求救,新手!不知道错在哪
取消只看楼主 加入收藏
roskys
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-8-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
求救,新手!不知道错在哪
运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册
代码如下:
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


代码如下:
程序代码:
#!/usr/bin/python
# -*- coding: cp936 -*-

import smtplib
from email.mime.text import MIMEText
import email.mime.multipart
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import Encoders
import glob
import win32api
import os, sys

###############################################
mail_subject = ""  # 邮件主题
mail_host = "smtp."  # 设置服务器
mail_user = "******"  # 填入个人的邮箱地址
mail_pass = "*******"  # 填入个人邮箱的密码
mail_postfix = "XXX.XX"  # 发件箱的后缀
mail_content = ""  # 邮件正文,可以写“请注意查收,有问题及时联系”之类的
mail_from = "<" + mail_user + ">"  # 这里的hello可以任意设置,收到信后,讲按照设置显示
mail_list = {}
xls_list = []
CD_TIME = 5  # 两封邮件之间的间隔时间为 5秒


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

def get_mail_list(config_file):    # 读取mailist.csv,每行记录是人名,邮件地址 比如张三,zhangsan@
    global mail_list              # csv 文件可用excel编辑
    f = open(config_file, "rb")
    l = f.readline()
    f.close()

    for i in l:
        t = i.split(',')
        mail_list[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_list.iteritems():
        print " ", k, "\t", v
    print

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


def precheck_mail_list():       # 检查邮件列表有没错误
    global mail_list, xls_list
    for xls in xls_list:
        name = xls[:-4]
        if name not in mail_list:
            print 'error:此人的邮箱地址没有配置,', xls, ',删除该文件,或在邮件列表中增加配置'
            print
            raise()           # 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_list, xls_list, mail_subject
    for idx, xls in enumerate(xls_list):  # 遍历附件列表
        print

        name = xls[:-4]                   # 后缀名.XLS占4个字符,去掉后缀名,取人名
        mail_address = mail_list[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
        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)

        # 这里设计了一个倒时的功能,万一检查到人名、邮箱配对的错误,马上可以中断,防止工资条发到别人邮箱

        for cd in xrange(CD_TIME, 0, -1):
            print '准备发送,按CTR+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)

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

    # all complete?
    if idx < len(xls_list) - 1:
        for cd in xrange(CD_TIME, 0, -1):
            print '准备下一封信,按Ctr+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('maillit.csv')
    get_xls_list('*.xls')
    dump_list()
    precheck_mail_list()
    get_mail_subject()
    send_mail()

############################################
if __name__ == '__main__':
    do_work()



搜索更多相关主题的帖子: import 邮件 xls print 发送 
2018-08-23 11:05
快速回复:求救,新手!不知道错在哪
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036280 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved