Commit 834651de authored by Wallen姚文辉's avatar Wallen姚文辉

新增邮件回复功能

parent ffa65ccf
import email.parser
import re import re
import time import time
import uuid import uuid
...@@ -17,6 +18,10 @@ from flask_socketio import emit,send ...@@ -17,6 +18,10 @@ from flask_socketio import emit,send
from sqlalchemy.sql import alias from sqlalchemy.sql import alias
from sqlalchemy import func from sqlalchemy import func
import yagmail import yagmail
import email
from imapclient import IMAPClient
import datetime
from base64 import b64decode
db=server.db db=server.db
tool = Blueprint("tools", __name__, url_prefix='/tool') tool = Blueprint("tools", __name__, url_prefix='/tool')
...@@ -35,7 +40,26 @@ def getheader(id_): ...@@ -35,7 +40,26 @@ def getheader(id_):
} }
return headers return headers
def decode_mime(msg): #此处封装的目的是在循环处理MIME数据块时重复利用代码(找不到这段代码的出处了,日后找到再补上出处。)
res=''
if msg.is_multipart(): #如果 MIME数据的格式是multi-part
parts = msg.get_payload()
for part in parts: #则遍历挨个解析
res+=decode_mime(part) #拆分出的单个数据块再次传入自定义函数decode_mime(相当于创建了一个新的实例,与当前的循环不冲突)
return res
else: #处理每一个MIME数据块
str_content_type = msg.get_content_type() #当前数据块的Content-Type
#print('str_content_type=%s'%str_content_type)
str_charset = msg.get_content_charset(failobj=None) #当前数据块的编码信息
#print('str_charset=',str_charset)
if str_content_type in ('text/plain', 'text/html'): #这里只处理纯文本、html两类数据,关于附件和其他类型数据的处理方法,请继续询问度娘
bytes_content = msg.get_payload(decode=True) #读取当前数据块中的正文内容,返回bytes
return res+bytes_content.decode(str_charset) #解码
else:
return ''
@tool.route('/testport/sendport', methods=["POST"]) @tool.route('/testport/sendport', methods=["POST"])
def sendport(): def sendport():
data=request.json data=request.json
...@@ -85,14 +109,59 @@ def iteration(view): ...@@ -85,14 +109,59 @@ def iteration(view):
else: else:
return jsonify({"code": 402, "message": "未找到相关项目,请确认jira信息是否正确"}),402 return jsonify({"code": 402, "message": "未找到相关项目,请确认jira信息是否正确"}),402
@tool.route('/testport/getMail', methods=["GET"])
def getMail():
date_=request.args.get('date')
imap=IMAPClient('imap.exmail.qq.com')
myinfo=db.session.query(User).filter_by(id=session.get("id")).first()
db.session.close()
# print(my)
try:
imap.login(myinfo.email_address,myinfo.email_password)
except:
return jsonify({"code": 501, "message": "请打开当前账户绑定邮箱的imap功能"}),501
my_date=datetime.datetime.date(datetime.datetime.strptime(date_,"%Y-%m-%d"))
my_date_1=datetime.datetime.date(datetime.datetime.strptime(date_,"%Y-%m-%d"))+datetime.timedelta(days=1)
imap.select_folder("INBOX")
messages_ids = imap.search([u'SINCE',my_date,u'BEFORE',my_date_1])
result=[]
for i in messages_ids:
info=imap.fetch(i,['ENVELOPE'])
sub=str(b64decode(info[i][b'ENVELOPE'].subject.decode('utf-8').replace('=?GBK?B?','').replace('?=','')),'GBK')
from_=str(b64decode(info[i][b'ENVELOPE'].from_[0].name.decode('utf-8').replace('=?GBK?B?','').replace('?=','')),'GBK')
date_=info[i][b'ENVELOPE'].date
date_=datetime.datetime.strftime(date_,'%Y-%m-%d %H:%M:%S')
result.append({"id":i,"sub":sub,"from":from_,"receive_time":date_})
imap.logout()
return jsonify({"code": 200, "data": result}),200
@tool.route('/testport/getMailDeatil/<id_>', methods=["GET"])
def getMailDeatil(id_):
imap=IMAPClient('imap.exmail.qq.com')
myinfo=db.session.query(User).filter_by(id=session.get("id")).first()
db.session.close()
try:
imap.login(myinfo.email_address,myinfo.email_password)
except:
return jsonify({"code": 501, "message": "请打开当前账户绑定邮箱的imap功能"}),501
imap.select_folder("INBOX")
print(id_)
info=email.parser.Parser().parsestr(imap.fetch(int(id_),'BODY[]')[int(id_)][b'BODY[]'].decode('utf-8'))
result=''
for i in info.walk():
# print(i["content-type"])
if ('text/html' in i["content-type"]):
result=i.get_payload(decode=True).decode(i.get_content_charset())
if ('text/plain' in i["content-type"]) and not result:
result=i.get_payload(decode=True).decode(i.get_content_charset())
imap.logout()
return jsonify({"code": 200, "data": result}),200
@tool.route('/testport/reportinfo', methods=["GET"]) @tool.route('/testport/reportinfo', methods=["GET"])
def reportinfo(): def reportinfo():
# project=request.args.get("project") # project=request.args.get("project")
iteration=request.args.get("iteration") iteration=request.args.get("iteration")
id_=request.args.get("view") id_=request.args.get("view")
print
headers=getheader(session.get("id")) headers=getheader(session.get("id"))
# id_=requests.request("get",jiraAddress+"/rest/agile/1.0/board?projectKeyOrId="+project,headers=headers).json().get("values")[0].get("id") # id_=requests.request("get",jiraAddress+"/rest/agile/1.0/board?projectKeyOrId="+project,headers=headers).json().get("values")[0].get("id")
result=requests.request("get",jiraAddress+"/rest/greenhopper/1.0/xboard/plan/backlog/data.json?rapidViewId="+str(id_),headers=headers).json() result=requests.request("get",jiraAddress+"/rest/greenhopper/1.0/xboard/plan/backlog/data.json?rapidViewId="+str(id_),headers=headers).json()
...@@ -296,7 +365,7 @@ def runstart(app,file_name,project,view,upid,user_id): ...@@ -296,7 +365,7 @@ def runstart(app,file_name,project,view,upid,user_id):
requests.request("post",jiraAddress+"/secure/CreateTestSuite.jspa?projectId="+str(projectId),data={"inline":True,"decorator":"dialog","testSuiteName":suiteName},headers=headers) requests.request("post",jiraAddress+"/secure/CreateTestSuite.jspa?projectId="+str(projectId),data={"inline":True,"decorator":"dialog","testSuiteName":suiteName},headers=headers)
text=requests.request("get",jiraAddress+"/secure/ShowLinkTestSuiteInPanel.jspa",params=params,headers=headers).content text=requests.request("get",jiraAddress+"/secure/ShowLinkTestSuiteInPanel.jspa",params=params,headers=headers).content
soup=BeautifulSoup(text,"html.parser") soup=BeautifulSoup(text,"html.parser")
suiteId=soup.find("strong",string=suiteName).parent.find("input").attrs.get("value") suiteId=soup.find("strong",string=suiteName.strip()).parent.find("input").attrs.get("value")
if type=="name": if type=="name":
string=each.get("title") string=each.get("title")
if "tc:" in each.get("title") or "tc:" in each.get("title") or "tc:" in each.get("title"): if "tc:" in each.get("title") or "tc:" in each.get("title") or "tc:" in each.get("title"):
...@@ -319,9 +388,10 @@ def runstart(app,file_name,project,view,upid,user_id): ...@@ -319,9 +388,10 @@ def runstart(app,file_name,project,view,upid,user_id):
"name": "测试用例" "name": "测试用例"
}, },
} }
},headers=headers).json()["id"] },headers=headers).json().get("id")
requests.request("post",jiraAddress+"/rest/synapse/1.0/testStep/addTestStep",json={"tcId":testId,"step":oldinfo.get("step"),"expectedResult":oldinfo.get("expect"),"sequenceNumber":None},headers=headers) if testId:
requests.request("post",jiraAddress+"/rest/synapse/latest/testSuite/addTestCaseMemberToTestSuites",json={"testSuiteIds":[suiteId],"testCaseId":testId},headers=headers) requests.request("post",jiraAddress+"/rest/synapse/1.0/testStep/addTestStep",json={"tcId":testId,"step":oldinfo.get("step"),"expectedResult":oldinfo.get("expect"),"sequenceNumber":None},headers=headers)
requests.request("post",jiraAddress+"/rest/synapse/latest/testSuite/addTestCaseMemberToTestSuites",json={"testSuiteIds":[suiteId],"testCaseId":testId},headers=headers)
sums=sums+1 sums=sums+1
return sums return sums
...@@ -347,6 +417,7 @@ def runstart(app,file_name,project,view,upid,user_id): ...@@ -347,6 +417,7 @@ def runstart(app,file_name,project,view,upid,user_id):
db.session.commit() db.session.commit()
server.socketio.emit("infoupdate",room=a.id) server.socketio.emit("infoupdate",room=a.id)
content= xmindparser.xmind_to_dict(par_path+"/uploadfile/"+file_name) content= xmindparser.xmind_to_dict(par_path+"/uploadfile/"+file_name)
sums=0
try: try:
sums=up(None,None,content,{},"name") sums=up(None,None,content,{},"name")
requests.request("delete",jiraAddress+"/rest/api/2/issue/"+globalcaseId,headers=headers) requests.request("delete",jiraAddress+"/rest/api/2/issue/"+globalcaseId,headers=headers)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment