diff options
Diffstat (limited to '04-CustomLibrary/Pop3Library')
| -rw-r--r-- | 04-CustomLibrary/Pop3Library/__init__.py | 200 | ||||
| -rw-r--r-- | 04-CustomLibrary/Pop3Library/__pycache__/__init__.cpython-36.pyc | bin | 0 -> 4589 bytes | |||
| -rw-r--r-- | 04-CustomLibrary/Pop3Library/readme.txt | 26 |
3 files changed, 226 insertions, 0 deletions
diff --git a/04-CustomLibrary/Pop3Library/__init__.py b/04-CustomLibrary/Pop3Library/__init__.py new file mode 100644 index 0000000..66219ac --- /dev/null +++ b/04-CustomLibrary/Pop3Library/__init__.py @@ -0,0 +1,200 @@ +import poplib +import base64 +import time +from email.parser import Parser +# 用来解析邮件主题 +from email.header import decode_header +# 用来解析邮件来源 +from email.utils import parseaddr + +from robot.api.deco import keyword +from robot.api import logger + + +class AcceptEmail(object): + + def __init__(self, user_email, password, pop3_server='serverDemon'): + self.user_email = user_email + self.password = password + self.pop3_server = pop3_server + + self.connect_email_server() + + def connect_email_server(self): + self.server = poplib.POP3(self.pop3_server) + # 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器 + # print('连接成功 -- ', self.server.getwelcome().decode('utf8')) + # +OK QQMail POP3 Server v1.0 Service Ready(QQMail v2.0) + + # 开始进行身份验证 + self.server.user(self.user_email) + self.server.pass_(self.password) + + def __del__(self): + # 关闭与服务器的连接,释放资源 + self.server.close() + + def get_email_count(self): + # 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可 + email_num, email_size = self.server.stat() + # print("消息的数量: {0}, 消息的总大小: {1}".format(email_num, email_size)) + return email_num + + def receive_email_info(self, now_count=None): + # 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可 + email_num, email_size = self.server.stat() + # print("消息的数量: {0}, 消息的总大小: {1}".format(email_num, email_size)) + self.email_count = email_num + self.email_sumsize = email_size + + # 使用list()返回所有邮件的编号,默认为字节类型的串 + rsp, msg_list, rsp_siz = self.server.list() + # print(msg_list, '邮件数量',len(msg_list)) + # print("服务器的响应: {0},\n消息列表: {1},\n返回消息的大小: {2}".format(rsp, msg_list, rsp_siz)) + # print('邮件总数: {}'.format(len(msg_list))) + self.response_status = rsp + self.response_size = rsp_siz + + # 下面获取最新的一封邮件,某个邮件下标(1开始算) + # total_mail_numbers = len(msg_list) + + # 动态取消息 + total_mail_numbers = now_count + + rsp, msglines, msgsiz = self.server.retr(total_mail_numbers) + # rsp, msglines, msgsiz = self.server.retr(1) + # print("服务器的响应: {0},\n原始邮件内容: {1},\n该封邮件所占字节大小: {2}".format(rsp, msglines, msgsiz)) + + # 从邮件原内容中解析 + msg_content = b'\r\n'.join(msglines).decode('utf-8')#gbk + msg = Parser().parsestr(text=msg_content) + self.msg = msg + # print('解码后的邮件信息:\n{}'.format(msg)) + + def recv(self, now_count=None): + self.receive_email_info(now_count) + self.parser() + + def get_email_title(self): + subject = self.msg['Subject'] + value, charset = decode_header(subject)[0] + if charset: + value = value.decode(charset) + # print('邮件主题: {0}'.format(value)) + self.email_title = value + + def get_sender_info(self): + hdr, addr = parseaddr(self.msg['From']) + # name 发送人邮箱名称, addr 发送人邮箱地址 + name, charset = decode_header(hdr)[0] + if charset: + name = name.decode(charset) + self.sender_qq_name = name + self.sender_qq_email = addr + # print('发送人邮箱名称: {0},发送人邮箱地址: {1}'.format(name, addr)) + + def get_email_content(self): + content = self.msg.get_payload() + # 文本信息 + content_charset = content[0].get_content_charset() # 获取编码格式 + text = content[0].as_string().split('base64')[-1] + text_content = base64.b64decode(text).decode(content_charset) # base64解码 + self.email_content = text_content + # print('邮件内容: {0}'.format(text_content)) + + # 添加了HTML代码的信息 + content_charset = content[1].get_content_charset() + text = content[1].as_string().split('base64')[-1] + # html_content = base64.b64decode(text).decode(content_charset) + + # print('文本信息: {0}\n添加了HTML代码的信息: {1}'.format(text_content, html_content)) + + def parser(self): + self.get_email_title() + self.get_sender_info() + #self.get_email_content() + + +def get_new_mail(user_name, pwd, pop3_server, second=5): + t = AcceptEmail(user_name, pwd, pop3_server) + now_count = t.get_email_count() + #print('开启的时候的邮件数量为:%s' % now_count) + logger.info("开启的时候的邮件数量为:"+str(now_count)) + # 每次需要重新连接邮箱服务器,才能获取到最新的消息 + # 默认每隔5秒看一次是否有新内容 + num = 0 + while True: + obj = AcceptEmail(user_name, pwd, pop3_server) + count = obj.get_email_count() + if count > now_count: + new_mail_count = count - now_count + #print('有新的邮件数量:%s' % new_mail_count) + logger.info("有新的邮件数量:"+str(new_mail_count)) + now_count += 1 + obj.recv(now_count) + + yield {"title": obj.email_title, "sender": obj.sender_qq_name, "sender_email": obj.sender_qq_email} + #yield {"title": obj.email_title, "sender": obj.sender_qq_name, "sender_email": obj.sender_qq_email, + # "email_content": obj.email_content} + if new_mail_count > 0: + return + # print('-' * 30) + # print("邮件主题:%s\n发件人:%s\n发件人邮箱:%s\n邮件内容:%s" % ( + # obj.email_title, obj.sender_qq_name, obj.sender_qq_email, obj.email_content)) + # print('-' * 30) + + #else: + #print('没有任何新消息.') + #logger.info("没有任何新消息.") + time.sleep(second) + num += 1 + if num == 36:#等待时间粒度,一个粒度是5s,如果num=10意思就是等待接收邮件50s,若没有邮件就返回;36是等待3min + return + + +@keyword('Recv Email') +def recv_email(user_name, pwd, pop3_server, send_user, subj): + ''' + 参数说明: + [user_name]:用户名 + [pwd]:密码,第三方登入密码 + [pop server]:pop服务器 + [sender]:发送者邮箱,注意全称 + [subj_sub]:主题的部分内容,这里是测主题是否包含该参数 + [return]:返回值,成功返回success,失败返回n其他 + 其他问题请阅读该库的readme.txt + ''' + dic = {} + logger.info("正在监听邮件服务器端是否有新消息---") + #print('正在监听邮件服务器端是否有新消息---') + try: + iterator = get_new_mail(user_name, pwd, pop3_server) + except TypeError: + #print('监听的内容有误,有图片数据等,无法解析而报错,不是纯文本内容') + logger.info("监听的内容有误,有图片数据等,无法解析而报错,不是纯文本内容") + return "fail" + else: + for dic in iterator: + #print("邮件主题:%s\n发件人:%s\n发件人邮箱:%s\n邮件内容:%s" % ( + # dic["title"], dic["sender"], dic["sender_email"], dic["email_content"])) + #logger.info("邮件主题: " + str(dic["title"]) + " 发件人: " + str(dic["sender"])+"发件人邮箱:"+str(dic["sender_email"])) + if dic["sender"] == send_user: + #logger.info("发送者一样") + if subj in dic["title"]: + #logger.info("主题也包含") + return "success" + else: + #logger.info("主题不包含") + return "fail" + else: + return "fail" + + +#if __name__ == '__main__': +# user = '[email protected]' +# pwd = 'xxxx' +# pop3_server = 'pop.qq.com' +# send_user = '[email protected]' +# subj = 'or2020' +# result = recv_email(user, pwd, pop3_server, send_user, subj) +# print(result)
\ No newline at end of file diff --git a/04-CustomLibrary/Pop3Library/__pycache__/__init__.cpython-36.pyc b/04-CustomLibrary/Pop3Library/__pycache__/__init__.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..ecd3bf5 --- /dev/null +++ b/04-CustomLibrary/Pop3Library/__pycache__/__init__.cpython-36.pyc diff --git a/04-CustomLibrary/Pop3Library/readme.txt b/04-CustomLibrary/Pop3Library/readme.txt new file mode 100644 index 0000000..42c7c9b --- /dev/null +++ b/04-CustomLibrary/Pop3Library/readme.txt @@ -0,0 +1,26 @@ +导入方法: +1.将该目录放到....\Python\Lib\site-packages 下 +2.在测试夹具里面要根据绝对路径导入此包 + + +注意: +1.使用该包的关键字时不要用qq邮箱,qq邮箱测试发现时长会失灵现象,最好用163邮箱等 +2.注意关闭邮箱的加密传送方式SSL协议 +3.注意邮箱是否支持POP3的协议以及不同邮箱pop服务器的写法 + + +关键字: +[return] Recv Email [user_name] [pwd] [pop server] [sender] [subj_sub] +参数说明: +[user_name]:用户名 +[pwd]:密码,第三方登入密码 +[pop server]:pop服务器 +[sender]:发送者邮箱,注意全称 +[subj_sub]:主题的部分内容,这里是测主题是否包含该参数 +[return]:返回值,成功返回success,失败返回n其他 +该关键字默认等待3min,3min内每5s检测邮箱是否收到邮件, +若收到邮件与[sender]参数进行完全匹配,与[subj_sub]部分主题内容参数进行是否包含匹配,匹配成功则返回success; +若收到邮件匹配失败或者超时则返回其他, + + +若修改等待时间,可查找源码中的num变量将36改为其他值即可,注意时间粒度是5s,若num=3,则您修改的等待时间是15s |
