为了项目方便和代码备份,简单写了一个自动压缩指定文件夹并且作为附件发送邮件到指定邮箱的脚本。

需求:
1、目标文件夹:D:\mydev\python
2、取第1步中的目标文件夹,自动压缩生成压缩文件zip
3、将第2步中生成的zip文件自动以附件的形式发送到指定邮箱,如762193719@qq.com

项目代码:
我把项目命名为codeManager,主要包含两个module:
1、emailManager,作为发送邮件的handler
2、zipManager,作为压缩文件的handler

项目目录结构如下:
1、emailManager
       [1] __init__.py,作为module import的必要文件
       [2] email_manager.py,发送邮件的必要算法
2、zipManager
       [1] __init__.py,作为module import的必要文件
       [2] zip_manager.py,压缩文件的必要算法
3、run.py,总入口文件

python判断邮箱格式是否正确 python从邮箱获取指定邮件_python判断邮箱格式是否正确



以下是各文件的源代码:

email_manager.py 
 
1. # -*- coding: utf-8 -*-  
2. 
3. '''
4. 发送邮件
5. '''
6. 
7. import smtplib  
8. import email.MIMEMultipart
9. import email.MIMEText
10. import email.MIMEBase
11. import os.path  
12. import mimetypes
13. import os  
14. from os.path import join, getsize    
15. import traceback
16. 
17. # 解决乱码问题
18. import sys  
19. reload(sys)  
20. SYS_ENCODING = 'cp936'  # 定义系统编码
21. sys.setdefaultencoding(SYS_ENCODING)  # 设置默认编码
22. 
23. class EmailManager:
24.    '''
25.    send email to the given email address automatically
26.    '''
27. 
28.    def __init__(self, **kw):
29.        ' 构造函数 '
30.        self.kw = kw
31. 
32.        self.smtp_server = "smtp.163.com"
33.        self.MAX_FILE_SIZE = 10 * 1024 * 1024 # 10M
34. 
35.    def run(self):
36.        # 总入口
37.        try:
38.            # 初始化
39.            self.__my_init()
40.            # 登录SMTP服务器,验证授权
41.            server = self.get_login_server()
42.            # 生成邮件主体内容
43.            main_msg = self.get_main_msg()
44.            # 生成邮件附件内容
45.            file_msg = self.get_attach_file_msg()
46. 
47.            if file_msg is not None:
48.                main_msg.attach(file_msg)
49. 
50.            # 得到格式化后的完整文本  
51.            fullText = main_msg.as_string()  
52. 
53.            # 发送邮件
54.            server.sendmail(self.msg_from, self.receiver, fullText)  
55. 
56.        except Exception, e:
57.            print e
58. 
59.            exstr = traceback.format_exc()
60.            print exstr
61. 
62.            server.quit()
63.            exit()
64. 
65.    def get_main_msg(self):
66.        ' 生成邮件主体内容 '
67.        # 构造MIMEMultipart对象做为根容器  
68.        main_msg = email.MIMEMultipart.MIMEMultipart()  
69. 
70.        # 构造MIMEText对象做为邮件显示内容并附加到根容器  
71.        text_msg = email.MIMEText.MIMEText(self.msg_content, _charset="utf-8")  
72.        main_msg.attach(text_msg)  
73. 
74.        # 设置根容器属性  
75.        main_msg['From'] = self.msg_from  
76.        main_msg['To'] = self.msg_to  
77.        main_msg['Subject'] = self.msg_subject
78.        main_msg['Date'] = self.msg_date
79. 
80.        return main_msg
81. 
82.    def get_attach_file_msg(self):
83.        ' 生成邮件附件内容 '
84.        if self.attach_file is not None and self.attach_file != "":
85.            try:
86.                self.validate_file_size()
87. 
88.                data = open(self.attach_file, 'rb')  
89.                ctype,encoding = mimetypes.guess_type(self.attach_file)  
90.                if ctype is None or encoding is not None:  
91.                    ctype = 'application/octet-stream'  
92.                maintype,subtype = ctype.split('/',1)  
93.                file_msg = email.MIMEBase.MIMEBase(maintype, subtype)  
94.                file_msg.set_payload(data.read())  
95.                data.close()  
96. 
97.                email.Encoders.encode_base64(file_msg) #把附件编码  
98. 
99.                ## 设置附件头  
100.                basename = os.path.basename(self.attach_file)  
101.                file_msg.add_header('Content-Disposition','attachment', filename = basename) #修改邮件头
102. 
103.                return file_msg
104.            except Exception, e:
105.                print e
106.                return None
107. 
108.        else:
109.            return None
110. 
111.    def get_login_server(self):
112.        ' 登录SMTP服务器,验证授权信息 '
113.        server = smtplib.SMTP(self.smtp_server)  
114.        server.login(self.server_username, self.server_pwd) #仅smtp服务器需要验证时
115. 
116.        return server  
117. 
118.    def validate_file_size(self):
119.        ' 验证文件大小是否合法 '
120.        if getsize(self.attach_file) > self.MAX_FILE_SIZE:
121.            raise Exception(u'附件过大,上传失败')
122. 
123.    def __my_init(self):
124.        ' 配置初始化 '
125.        # 邮箱登录设置
126.        self.server_username = self.__get_cfg('server_username')
127.        self.server_pwd = self.__get_cfg('server_pwd')
128. 
129.        # 邮件内容设置
130.        self.receiver = self.__get_cfg('msg_to')
131. 
132.        self.msg_from = self.server_username
133.        self.msg_to = ','.join(self.__get_cfg('msg_to'))
134.        self.msg_subject = self.__get_cfg('msg_subject')
135.        self.msg_date = self.__get_cfg('msg_date')
136.        self.msg_content = self.__get_cfg('msg_content')
137. 
138.        # 附件
139.        self.attach_file = self.__get_cfg('attach_file', throw=False)
140. 
141.    def __get_cfg(self, key, throw=True):
142.        ' 根据key从**kw中取得相应的配置内容 '
143.        cfg = self.kw.get(key)
144.        if throw == True and (cfg is None or cfg == ''):
145.            raise Exception(unicode("配置不能为空!", 'utf-8'))
146. 
147.        return cfg
148. 
149. 
 
 
 zip_manager.py 
 
1. #coding=utf-8
2. 
3. '''
4. 压缩文件夹,生成zip文件
5. '''
6. 
7. import os,zipfile
8. from os.path import join 
9. from datetime import date
10. from time import time
11. import traceback
12. 
13. # 解决乱码问题
14. import sys  
15. reload(sys)  
16. SYS_ENCODING = 'cp936'  # 定义系统编码
17. sys.setdefaultencoding(SYS_ENCODING)  # 设置默认编码
18. 
19. class ZipManager:
20.    ''' 
21.    zip the given folder automatically
22.    '''
23. 
24.    def __init__(self):
25.        ' 构造函数 '
26.        pass
27. 
28.    @staticmethod
29.    def zip_dir(dirname,zipfilename):
30.        ' 压缩指定文件夹 '
31.        filelist = []
32.        if os.path.isfile(dirname):
33.            filelist.append(dirname)
34.        else :
35.            for root, dirs, files in os.walk(dirname):
36.                for name in files:
37.                    # hard code,原有压缩文件跳过
38.                    if name.endswith('.zip'):
39.                        continue
40.                    # hard code end
41.                    filelist.append(os.path.join(root, name))
42. 
43.        zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
44.        for tar in filelist:
45.            arcname = tar[len(dirname):]
46.            #print arcname
47.            zf.write(tar,arcname)
48.        zf.close()
49. 
50.    @staticmethod
51.    def unzip_file(zipfilename, unziptodir):
52.        ' 解压缩指定文件夹 '
53.        if not os.path.exists(unziptodir): os.mkdir(unziptodir, 0777)
54.        zfobj = zipfile.ZipFile(zipfilename)
55.        for name in zfobj.namelist():
56.            name = name.replace('\\','/')
57. 
58.            if name.endswith('/'):
59.                os.mkdir(os.path.join(unziptodir, name))
60.            else:            
61.                ext_filename = os.path.join(unziptodir, name)
62.                ext_dir= os.path.dirname(ext_filename)
63.                if not os.path.exists(ext_dir) : os.mkdir(ext_dir,0777)
64.                outfile = open(ext_filename, 'wb')
65.                outfile.write(zfobj.read(name))
66.                outfile.close()
67. 
68. 
69. # 测试函数
70. if __name__ == "__main__":
71.    folder = r'D:\ruansz\code\python\codeManager\zipManager\test'
72.    filename = 'test.zip'
73.    dirbase = r'test'
74.    targetbase = 'D:'+'/'
75. 
76.    ZipManager.zip_folder( folder, filename, dirbase=dirbase)
77. 
 
 
 run.py 
 

1. #coding=utf-8
2. 
3. """
4. 
5. codeManager,自动把本机指定目录下的文件夹打成压缩包,并且作为附件发邮件给指定邮箱,作为备份
6. 2016-06-29 by ruansz
7. 
8. """
9. 
10. # 解决乱码问题
11. import sys  
12. reload(sys)  
13. SYS_ENCODING = 'cp936'  # 定义系统编码
14. sys.setdefaultencoding(SYS_ENCODING)  # 设置默认编码
15. 
16. import email.MIMEBase
17. import time
18. 
19. 
20. # 自定义包导入
21. from zipManager import zip_manager
22. from emailManager import email_manager
23. 
24. # 定义一个log函数
25. def log(msg):
26.    print time.strftime('%Y-%m-%d %H:%M:%S'), ': ', msg
27. 
28. 
29. # run
30. if __name__ == '__main__':
31. 
32. 
33.    log(u'进入run函数')
34. 
35. 
36.    log(u'开始读取压缩配置参数')
37.    # 定义配置参数
38.    # 1、压缩配置
39.    timestr = time.strftime('%Y%m%d%H%M%S')   # 生成日期时间字符串,作为压缩文件的版本号
40.    folder = r'D:\mydev\python'   # 压缩目标文件夹
41.    target = r'D:\mydev\python\python_v'+timestr+r'.zip'   # 压缩后的名称
42. 
43.    log(u'压缩源文件夹:' + folder)
44.    log(u'压缩输出路径:' + target)
45. 
46.    log(u'开始生成压缩文件')
47.    zip_manager.ZipManager.zip_dir(folder, target)
48.    log(u'生成压缩文件结束')
49. 
50. 
51.    log(u'开始读取邮件发送配置参数')
52.    # 2、发送邮件配置
53.    mail_cfg = {

54.        # 邮箱登录设置,使用SMTP登录
55.        'server_username': '你的邮箱', 
56.        'server_pwd': '你的邮箱密码',
57. 
58.        # 邮件内容设置
59.        'msg_to': ['papa0728@163.com', '762193719@qq.com', 'sizhe@staff.sina.com.cn'],  # 可以在此添加收件人
60.        'msg_subject': u'我的python代码备份' + timestr,
61.        'msg_date': email.Utils.formatdate(),
62.        'msg_content': u"我的python代码备份" + timestr,
63. 
64.        # 附件
65.        'attach_file': target
66.        }
67.    log(u'读取邮件发送配置参数:')
68.    log(u'server_username:' + str(mail_cfg.get('server_username')))
69.    log(u'server_pwd:' + str(mail_cfg.get('server_pwd')))
70.    log(u'msg_to:' + str(mail_cfg.get('msg_to')))
71.    log(u'msg_subject:' + str(mail_cfg.get('msg_subject')))
72.    log(u'msg_date:' + str(mail_cfg.get('msg_date')))
73.    log(u'msg_content:' + str(mail_cfg.get('msg_content')))
74.    log(u'attach_file:' + str(mail_cfg.get('attach_file')))
75. 
76. 
77.    # 实例化manager对象
78.    log(u'开始创建EmailManager')
79.    email_manager = email_manager.EmailManager(**mail_cfg)
80.    log(u'开始发送邮件')
81.    email_manager.run()
82.    log(u'发送完成')
83.    log(u'程序结束')
84. 
85. 
86.