admin管理员组

文章数量:1529446

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

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

项目代码:
我把项目命名为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,总入口文件



以下是各文件的源代码:
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"
  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', '762193719@qq', 'sizhe@staff.sina'],  可以在此添加收件人
  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.  原文地址:http://blog.sina/s/blog_78c913e30102x6i5.html
  86.  

本文标签: 发送邮件文件夹附件邮箱Python