from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from lxml import etree
import requests
import poplib
class PopMail:
def __init__(self, email, password):
# 输入邮件地址, 口令和POP3服务器地址:
self.email = email
self.password = password
self.pop3_server = "mail.recolte-cn.cn"
self.header = {
'User-Agent': 'Apipost client Runtime/+https://www.apipost.cn/',
'Content-Type': 'application/x-www-form-urlencoded',
}
def connect(self):
# 连接到POP3服务器:
self.server = poplib.POP3(self.pop3_server)
# 可以打开或关闭调试信息:
self.server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(self.server.getwelcome().decode('utf-8'))
# 身份认证:
self.server.user(self.email)
self.server.pass_(self.password)
def get_msg(self):
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % self.server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = self.server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = self.server.retr(index)
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍后解析出邮件:
self.msg = Parser().parsestr(msg_content)
# 可以根据邮件索引号直接从服务器删除邮件:
# server.dele(index)
# 关闭连接:
self.server.quit()
# indent用于缩进显示:
def print_info(self, msg, indent=0):
if indent == 0:
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject':
value = self.decode_str(value)
else:
hdr, addr = parseaddr(value)
name = self.decode_str(hdr)
value = u'%s <%s>' % (name, addr)
print('%s%s: %s' % (' ' * indent, header, value))
if (msg.is_multipart()):
parts = msg.get_payload()
for n, part in enumerate(parts):
print('%spart %s' % (' ' * indent, n))
print('%s--------------------' % (' ' * indent))
self.print_info(part, indent + 1)
else:
content_type = msg.get_content_type()
if content_type == 'text/plain' or content_type == 'text/html':
content = msg.get_payload(decode=True)
charset = self.guess_charset(msg)
if charset:
content = content.decode(charset)
print('%sText: %s' % (' ' * indent, content + '...'))
self.content = content
else:
print('%sAttachment: %s' % (' ' * indent, content_type))
def decode_str(self, s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def guess_charset(self, msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
def parse_xml(self,html,xpath_bds):
parse_html = etree.HTML(html)
r_list = parse_html.xpath(xpath_bds)
return r_list
def get_html(self):
self.connect() # 连接邮箱
self.get_msg() # 获取邮件
self.print_info(self.msg) # 邮件内容转成html格式
return self.content
# 激活邮箱
def activate(self):
html = self.get_html()
xpath_bds = "//a/@href"
urls = self.parse_xml(html,xpath_bds) # 解析出激活链接
for url in urls:
if "https://member-m.withhive.com" in url:
# 请求链接
if url:
response = requests.get(url,headers=self.header)
print(response.text)
return True
# 获取邮箱验证码
def get_code(self):
html = self.get_html()
xpath_bds = "//a/@href" # pass
code = self.parse_xml(html, xpath_bds) # 解析出激活链接
return code
class CreateMail:
def __init__(self, num):
self.num = num # 创建邮箱数量
def set_cookie(self, cookie):
cookies = {}
for line in cookie.split(";"):
if line.find("=") != -1:
name, value = line.strip().split("=")
cookies[name] = value
print("cookies", cookies)
return cookies
def add_mail(self, cookie, user, __pass, username, ):
"""
:param cookie: 登录后在获取浏览器cookie
:param user: 邮箱账号
:param __pass: 密码
:param username: 角色名称
:return:
"""
url = "http://mail.recolte-cn.cn:8010/Users/edit"
cookies = self.set_cookie(cookie)
header = {
'User-Agent': 'Apipost client Runtime/+https://www.apipost.cn/',
'Content-Type': 'application/x-www-form-urlencoded',
}
data = {
"email": user,
"uname": username,
"tel": '',
"active": 1,
"password": __pass,
"password2": __pass,
"_method": "put",
"_forward": "2FUsers",
}
r = requests.post(url, data=data, headers=header, cookies=cookies)
with open("test.html", "w", encoding="utf-8") as fp:
fp.write(r.text)
if __name__ == '__main__':
PopMail("0001@-cn.cn", "").activate()
版权属于:CuteKitty
本文链接:https://blog.cutekitty.cn/index.php/archives/12/
作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可