项目需求:爬取邮箱
代码:
# -*- coding: utf-8 -*-
import csv
import time
import re
import smtplib
import datetime
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
def get_origin_text(nowtime): # 获取邮件原始文本
# 连接到POP3服务器
pop_server = poplib.POP3("邮箱")
# pop_server = poplib.POP3("pop.163.com")
print("连接pop3服务器成功")
# 邮箱号
pop_server.user("##########")
# 授权码
pop_server.pass_("##########") #
#stat()返回(邮件数,邮件尺寸)
print('邮件数: %s 邮件尺寸: %s' % pop_server.stat())
print("---开始更新---")
print("更新时间:{}".format(nowtime.replace('T',' ')))
# list()返回所有邮件的编号列表,默认返回20个元素
resp, mails, octets = pop_server.list() # 编号最大的为最新的一封
# print(mails)
# 获取最新的一封邮件(索引号从1开始)
index = len(mails)
for i in range(1,index+1):
# print(i)
resp, lines, octets = pop_server.retr(i) # 返回(状态信息,邮件,邮件尺寸)
# lines存储了邮件的原始文本的每一行,可以获得整个邮件的原始文本
msg_content = b'\r\n'.join(lines).decode('utf-8') # b表示:后面字符串是bytes类型。
msg = Parser().parsestr(msg_content)
parse_msg(msg,nowtime) # 第二步:用 email 解析原始文本,还原为邮件对象。
# return info_list
pop_server.quit() # 退出连接
def decode_str(s): # 解码字符串
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def set_charset(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_msg(msg,nowtime):
# 解析邮件头
pattern_dn = r"***********" #正则1
pattern_time = r"************" #正则2
times = r"**************" #正则3
for header in ['From', 'To', 'Subject']: # 遍历获取发件人,收件人,主题的相关信息
value = msg.get(header, '') # 获取邮件头的内容
if value:
if header == 'Subject': # 获取主题的信息,并解码
value = decode_str(value) # 解码字符串
else:
hdr, addr = parseaddr(value) # 解析字符串中的邮件地址
name = decode_str(hdr) # 解码字符串
value = '%s <%s>' % (name, addr)
# print('邮件名称: %s' % (value))
# info_list.append(value)
# 解析邮件正文
if (msg.is_multipart()): # 如果消息由多个部分组成,则返回True
parts = msg.get_payload() # 返回一个包含邮件所有的子对象的列表
for n, part in enumerate(parts): # 枚举,遍历各个对象
# print('part %s' % (n))
parse_msg(part,nowtime)
else:
content_type = msg.get_content_type() # 获取邮件信息的内容类型
if content_type == 'text/plain' or content_type == 'text/html': # 如果是纯文本或者html类型
content = msg.get_payload(decode=True) # 返回一个包含邮件所有的子对象(已解码)的列表
charset = set_charset(msg) # 设置字符集
if charset: # 字符集不为空
content = content.decode(charset) # 解码
# print('Text: %s' % (content))
if "统一云防御检测" in content:
DN = re.findall(pattern_dn,content)[0]
DN = DN.replace("(","").replace(")","")
Time = re.findall(pattern_time,content)[0]
Time = Time.split(" ")
Times = re.findall(times,content)[0]
start_time = Time[0]+' '+Time[1]
end_time = Time[0]+' '+Time[3]
info = DN + "|" + start_time + ":00" + "|" + end_time + ":00" + "|" + Times + "\n"
with open("path1(自己设置)", "a+") as file2:
file2.seek(0)
history = file2.read()
# print(history)
if info not in history:
with open("path2(自己设置)".format(today), "a+") as file1:
file1.write(nowtime + "|" + info)
file2.write(nowtime + "|" + info)
# info_list.append(['、web应用攻击提醒邮件',DN,start_time+":00",end_time+":00",Times])
else:
print('Attachment: %s' % (content_type)) # 附件
if __name__ == "__main__":
nowtime = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime(time.time()))
info_list = []
msg = get_origin_text(nowtime) # 第一步:用 poplib 获取邮件的原始文本。
# 写入csv
# with open(r'C:\Users\admin\Desktop\email.csv', 'w', newline='', encoding="gbk") as fp:
# writer = csv.writer(fp)
# headers = ["邮件名称", "域名", "开始时间","结束时间","攻击次数"]
# writer.writerow(headers)
# for i in msg:
# writer.writerow(i)
print("==================")
print("---更新完成---")