1,问题背景
#如何接收邮件,分类定制,邮件转发 #假如客户小张有这么一个工作,每天要从公司邮件系统下载邮件(来自于国家局通知邮件), #然后分类邮件通知,然后再按照不同的归属,把邮件转发给不同的客户。甚是繁琐,可自动化。
2,开发核算
开发流程:需求分析,详细设计,设计评审,代码开发,代码评审,测试用例,软件部署,附加测试(稳定性,压力,边界值) #自动化思路:接收邮件(依赖接口)--->分类定制(依赖表单)--->发送邮件 #预计工作量:10day(simple,without UI),标量计算:500?/50行代码量/平均每人天,熟人可打折
3,邮件协议
#SMTP协议SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 源地址到目的地址传送邮件的规则, #由它来控制信件的中转方式。SMTP协议属于TCP / IP协议簇, SMTP协议可以把E - mail寄到指定的服务器 #POP是指邮局协议,目的是让用户可以访问邮箱服务器中的邮件,允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上, #同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。 #后来又出现了IMAP协议(Interactive Mail Access Protocol), 即交互式邮件访问协议, # 与POP3的不同在于:开启了IMAP后,#在电子邮件客户端收取的邮件仍然保留在服务器上,客户端上的操作都会反馈到服务器上。
4,自动邮件收发示例代码
import os import sys import logging import traceback logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') #https://www.liaoxuefeng.com/wiki Python 2.7 import poplib def recv_mail(server, username, password): pop3_server = server email = username password = password server = poplib.POP3(pop3_server) # server.set_debuglevel(1) print(server.getwelcome()) server.user(email) server.pass_(password) print('Messages: %s. Size: %s' % server.stat()) resp, mails, octets = server.list() #all mail num print(mails) index = len(mails) #index from 1 resp, lines, octets = server.retr(index) msg_content = '\r\n'.join(lines) #msg = Parser().parsestr(msg_content) server.quit() import getpass, imaplib def recv_mail_imap(): M = imaplib.IMAP4() M.login(getpass.getuser(), getpass.getpass()) M.select() typ, data = M.search(None, 'ALL') for num in data[0].split(): typ, data = M.fetch(num, '(RFC822)') print 'Message %s\n%s\n' % (num, data[0][1]) M.close() M.logout() import smtplib def send_email(server, fromAddr, togoAddr, subject, msg, password): server = smtplib.SMTP('localhost') # stmp defualt port 25 server.set_debuglevel(1) message = ("From: %s\r\nTo: %s\r\n"% (fromAddr, togoAddr)) message = ("Subject: %s\r\nContent: %s\r\n"% (subject, msg)) server.sendmail(fromAddr, list(togoAddr), message) server.quit() from email.mime.text import MIMEText msg = MIMEText("mail", 'html', 'utf-8') msg['From'] = u'<%s>' % fromAddr msg['To'] = u'<%s>' % togoAddr msg['Subject'] = subject smtp = smtplib.SMTP_SSL('smtp.xxx.com', 465) # smtplib.SMTP(server, 25) smtp.set_debuglevel(1) smtp.ehlo("smtp.xxx.com") smtp.login(fromAddr, password) smtp.sendmail(fromAddr, [togoAddr], msg.as_string()) smtp.quit() def main(argv): try: #接收邮件 #分类邮件 #发送邮件 except: print(traceback.format_exc()) return True if __name__ == '__main__': if (True == main(sys.argv)): print("SUCCESS") else: print("FAILURE")
5,自动excel表格读写示例代码:
import os import sys import xlwt import xlrd print(sys.path) print(xlwt.__VERSION__) workbook = xlwt.Workbook() name_sheet1 = workbook.add_sheet('sheet1') name_sheet1.write(0, 0, 123.456) workbook.save('example.xls') print(xlrd.info.__VERSION__) workbook = xlrd.open_workbook('example.xls') name_sheets = workbook.sheet_names() name_sheet1 = workbook.sheet_by_index(0) name_sheet1 = workbook.sheet_by_name('sheet1') print(name_sheet1.cell(0, 0).value) print(name_sheet1.cell(0, 0).ctype) print('ctype: 0empty 1string 2number 3date 4boolean 5error') #https://pypi.python.org/simple/xlrd/ #https://pypi.org/simple/xlrd/ #https://pypi.python.org/simple/xlwt/ #https://pypi.org/simple/xlwt/
6,读取ini配置文件和json文件
import os import sys import time import traceback import json import ConfigParser # ConfigParser class : RawConfigParser, ConfigParser, SafeConfigParser # ConfigParser、SafeConfigParser support %(value)s parser use var value class iniConfigParser(ConfigParser.ConfigParser): def __init__(self, defaults=None): ConfigParser.ConfigParser.__init__(self, defaults=defaults) def optionxform(self, optionstr): return optionstr iniConfig = iniConfigParser() curFile = os.path.basename(os.path.abspath(__file__)) absPath = os.path.dirname(os.path.abspath(__file__)) print(curFile) print(absPath) #write config.ini iniConfig.add_section('book') iniConfig.set("book","Author","and") iniConfig.set("book","Version","one") iniConfig.add_section('food') iniConfig.set("food","Dinner","eat") iniConfig.write(sys.stdout) iniConfig.write(open(os.path.join(absPath, 'config.ini'), 'w')) #read config.ini iniConfig.read(os.path.join(absPath, 'config.ini')) sectionsList = iniConfig.sections() sectionkeysList = iniConfig.options(sectionsList[0]) sectionkeyValList = iniConfig.items(sectionsList[0]) print(sectionsList) print(sectionkeysList) print(sectionkeyValList) print(os.listdir(absPath)) #read package.json jsonStrs = '{"key":"val"}' jsonDict = json.loads(jsonStrs) jsonDictRd = json.load(open(os.path.join(absPath, 'package.json'), 'r')) print(jsonDict) print(jsonDictRd) #write package.json jsonDict = {'key':'val'} jsonStrs = json.dumps(jsonDict) jsonDictRd['time'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) json.dump(jsonDictRd, open(os.path.join(absPath, 'package.json'), 'w')) print(jsonStrs)