玖叶教程网

前端编程开发入门

Python 如何提取邮件内容(python获取邮箱地址)

今日分享主题:

如何使用 Python 从邮件里面提取用户返回的线上问题内容并做解析,通过拿到的数据信息进行分析整理,然后进行封装请求禅道里的接口进行提交,提交请求过程中会对数据库中是否存在进行一次判断处理,如果没有存在的就提交,如果数据库中存在就不用再提交,基于这个思路来看下今天的分享。


基础信息准备

import imaplib, email,re,requests,time,pymysql
imapserver = 'smtp.office365.com'
emailuser = "[email protected]"
emailpasswd = "test123"


#beta环境禅道地址
beta_loginhost="http://zen.beta.com/index.php?m=user&f=login"
beta_add_bughost="http://zen.beta.com/index.php?m=bug&f=create&productID=10&branch=0&extra=moduleID=0"


#live环境禅道地址
live_loginhost="https://zen.live.com/index.php?m=user&f=login"
live_add_bughost="https://zen.live.com/index.php?m=bug&f=create&productID=10&branch=0&extra=moduleID=0"


envs="live" #定义使用的环境


数据库连接信息

#连接数据库相关的信息:
beta_dicts={
 "HOST" : '10.8.2.3',
 "PORT" : 3306,
 "USER": 'zentao',
 "PASSWORD" : 'test123',
 "NAME":"zentao"
}
live_dicts={
 "HOST" : '10.7.1.7',
 "PORT" : 3306,
 "USER": 'zentao',
 "PASSWORD" : 'test123',
 "NAME":"zentao"
}


数据库查询

#数据库查询操作
def executesql(query,envs):
 try:
 if(envs=="beta"):
 conn = pymysql.connect(beta_dicts['HOST'], beta_dicts['USER'], beta_dicts['PASSWORD'], beta_dicts['NAME'], int(beta_dicts['PORT']),charset='utf8')
 print(beta_dicts)
 else:
 conn = pymysql.connect(live_dicts['HOST'], live_dicts['USER'], live_dicts['PASSWORD'], live_dicts['NAME'], int(live_dicts['PORT']),charset='utf8')
 print(live_dicts)
 cursor = conn.cursor()
 cursor.execute(query)
 result =cursor.fetchall()
 print("execute successfully!!!")
 if(len(result)==0):
 return 0
 else:
 return result[0][0]
 except Exception as e:
 print(e)
 print("execute failed")
 finally:
 cursor.close()
 conn.close()


建立连接与检索

#建立连接与检索匹配的邮件
def search():
 print("start to connect")
 conn = imaplib.IMAP4_SSL(imapserver)
 conn.login(emailuser, emailpasswd)
 conn.select('INBOX') # 选择收件箱(默认)
 print(conn)
 now = time.localtime()
 nowt = time.strftime("%d-%b-%Y", now)
 print(nowt)
 results , data = conn.search(None,'(FROM "Liang.Wu")','(ON "'+str(nowt)+'")')
 mailidlist = data[0].split()
 print(mailidlist)
 try:
 for id in mailidlist:
 print(id)
 resultss, data = conn.fetch(id, '(RFC822)') # 通过邮件id获取邮件,data是fetch到的邮件具体内容
 e = email.message_from_bytes(data[0][1])


解释说明与print

 '''
 Header()类:
 email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')
 其中参数的含义理解如下:
 s:标头的值,也就是对应 From、To、Subject 的值; 
 charset:字符集格式,默认是 ASCII,但是一般指定 UTF-8 格式以兼容更多字符; 
 header_name:标头名,就是 From、To、Subject、Time 等;
 '''
 subject = email.header.make_header(email.header.decode_header(e['SUBJECT']))
 mail_from = email.header.make_header(email.header.decode_header(e['From']))
 print("邮件的subject是%s" % subject)
 print("邮件的发件人是%s" % mail_from)
 body = str(get_body(e), encoding='ISO-8859-1') # utf-8 gb2312 GB18030解析中文日文英文
 print("邮件内容是%s" % body)
 parse1(body)
 print("good job")
 except Exception as e:
 print("we catch an error!!!",e)
 finally:
 print("logout is success")
 print("the finally of operation!!!")
 conn.logout()


获取邮件主体信息

#获取邮件主体信息
def get_body(msg):
 if msg.is_multipart ():#Return True if the message’s payload is a list of sub-Message objects, otherwise return False. When is_multipart() returns False, the payload should be a string object.
 return get_body(msg.get_payload(0))
 else:
 '''Return the current payload, which will be a list of Message objects when is_multipart() is True, 
 or a string when is_multipart() is False. If the payload is a list and you mutate the list object,
 you modify the message’s payload in place.'''
 return msg.get_payload(None , decode=True)


解析邮件内容并提交禅道

# 解析邮件内容并调用禅道提交(上一篇文章结合来看)
def parse1(body):
 pattern = re.compile('Dear Colleagues,<br>(.*?)Thanks and Regards,<br>', re.S)
 pattern1 = re.compile('black">(.*?)<o:p>', re.S)
 pattern2=re.compile(';">\r(.*?);\r<',re.S)
 lists = re.findall(pattern, body)
 print("*"*10)
 lists = str(lists[0]).replace("\n", "").split("<br>")
 print(lists)
 resultlist = []
 for i in range(len(lists)):
 if (len(lists[i]) > 1):
 resultlist.append(lists[i])
 print(resultlist)
 id = resultlist[1]
 ids=str(str(resultlist[1]).split(":")[1]).lstrip()
 Subject = resultlist[2]
 Subjects="[FeedBack-"+str(str(resultlist[1]).split(":")[1]).lstrip() + "]--"+str(str(resultlist[2]).split(":")[1])
 Creator = resultlist[3]
 Creators = str(str(resultlist[3]).split(":")[1])
 Category = resultlist[4]
 IssueCategory = resultlist[5]
 if ("Low" in resultlist[6]):
 Severity = "4"
 Severity_desc = "Severity: Low (Limited business impact)"
 if ("Medium" in resultlist[6]):
 Severity = "3"
 Severity_desc = "Severity: Medium (Functional but impact operations)"
 if ("High" in resultlist[6]):
 Severity = "2"
 Severity_desc = "Severity: High (Major system outage)"
 Module = resultlist[7]
 if('black">' in resultlist[8] and '<o:p>' in resultlist[8]):
 Details = str(re.findall(pattern1, resultlist[8])[0]).replace(""", "\"")
 if(';">\r' in resultlist[8] and ';\r<' in resultlist[8]):
 Details = str(re.findall(pattern2, resultlist[8])[0]).replace(""", "\"")
 link = resultlist[9]
 steps = id + "<br>" + Subject + "<br>" + Creator + "<br>" + Category + "<br>" + IssueCategory + "<br>" + Severity_desc + "<br>" + Module + "<br>" + Details + "<br>" + link
 print(steps.replace("<br>", "\n"))
 sql="SELECT * FROM zt_bug WHERE title LIKE \"[FeedBack-"+str(ids)+"%\""
 print(sql)
 if(executesql(sql,envs)>=1):
 print("there is an record exists!!!")
 #add_bug(Subjects, Creators, Severity, steps,envs)
 else:
 add_bug(Subjects,Creators,Severity,steps,envs)


提交bug至禅道

#提交bug到禅道的方法
def add_bug(a,b,c,d,e): #此方法可以与上一遍文章结合在一起提交到禅道
 pass

以上内容就是今天分享的全部内容,这个最后的方法也是空着的,所以这里也就回答了上一篇文章中大家提到的疑问—->自动提交bug到禅道的使用场景会是怎么样的。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言