爬虫登录之 手机验证码转发(二) python读取邮箱
接上一篇爬虫登录获取验证码转发,现在邮箱中已经有验证码了,但是怎么样快速的把验证码读取并写入呢?
一个方法是对QQ邮箱进行自动化,但是想到一个问题,如果QQ邮箱也要验证码呢? 所以我们可以直接使用QQ邮箱的 POP3服务,这个服务允许我们直接从后端读取到邮件,前提是开启POP3/SMTP 服务,如下图

开启之后,就可以开始写代码了
读取代码如下:
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import poplib
import smtplib
from email.mime.text import MIMEText
class ReceiveEmail:
'''
接收信息
'''
# 输入邮件地址, 口令和POP3服务器地址:
EMAIL = '110@qq.com' # 这里填写你自己的邮箱
PASSWORD = '' # 这个密码不是邮箱登录密码,是pop3服务密码
POP3_SERVER = 'pop.qq.com'
def guess_charset(slef, 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 decode_str(self, s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
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)
result = '%s%s: %s' % (' ' * indent, header, value)
# print(result)
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)
return content
else:
print('%sAttachment: %s' % (' ' * indent, content_type))
def qe_main(self):
# 连接到POP3服务器:
server = poplib.POP3_SSL(self.POP3_SERVER, 995)
# 可以打开或关闭调试信息:
server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
# print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(self.EMAIL)
server.pass_(self.PASSWORD)
# stat()返回邮件数量和占用空间:
# print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
# print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
# print('未读邮件的数量', index)
resp, lines, octets = server.retr(1)
# # lines存储了邮件的原始文本的每一行,
# # 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# # 稍后解析出邮件:
msg = Parser().parsestr(msg_content)
content = self.print_info(msg)
print(content)
# 可以根据邮件索引号直接从服务器删除邮件:
server.dele(1)
# 关闭连接:
server.quit()
return content
以上代码是读取最后一封邮箱,然后拿到最后一封邮件之后立马删除。拿到验证码后根据自己的需要做一个 re 匹配就行了

目前效果挺好

随便把python发送邮件的也放上来好了。
class SendEmail():
'''
发送短信
'''
def main(self):
msg_from = '110@qq.com' # 发送方邮箱
passwd = '' # 填入发送方邮箱的授权码
msg_to = '120@qq.com' # 收件人邮箱
subject = "python邮件测试" # 主题
content = "这是我使用python smtplib及email模块发送的邮件" # 正文
msg = MIMEText(content)
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = msg_to
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
print("发送成功")
except smtplib.SMTPException as e:
print("发送失败", e)
到此结束!
因为经常熬夜,所以我的肝好像不太好,你可以叫我小心肝吗?

浙公网安备 33010602011771号