Python工具

Posted xzqpy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python工具相关的知识,希望对你有一定的参考价值。

邮箱首发

import os,sys
import smtplib
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
from backend import core
import os
import poplib,email,telnetlib
import datetime,time,sys,traceback
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import logging
class down_email():

    def __init__(self,user,password,eamil_server):
        # 输入邮件地址, 口令和POP3服务器地址:
        self.user = user
        # 此处密码是授权码,用于登录第三方邮件客户端
        self.password = password
        self.pop3_server = eamil_server

    # 获得msg的编码
    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 get_content(self,msg):
        content=‘‘
        content_type = msg.get_content_type()
        # print(‘content_type:‘,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

    # 字符编码转换
    # @staticmethod
    def decode_str(self,str_in):
        value, charset = decode_header(str_in)[0]
        if charset:
            value = value.decode(charset)
        return value

    # 解析邮件,获取附件
    def get_att(self,msg_in, str_day,filename1,path):
        attachment_files = []
        for part in msg_in.walk():
            # 获取附件名称类型
            file_name = part.get_param("name")  #如果是附件,这里就会取出附件的文件名

            # file_name = part.get_filename() #获取file_name的第2中方法
            # contType = part.get_content_type()
            if file_name:
                h = email.header.Header(file_name)
                # 对附件名称进行解码
                dh = email.header.decode_header(h)
                filename = dh[0][0]
                if dh[0][1]:
                    # 将附件名称可读化
                    filename = self.decode_str(str(filename, dh[0][1]))
                    # print(filename)
                    # filename = filename.encode("utf-8")
                # 下载附件
                data = part.get_payload(decode=True)
                # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
                filename_ok=filename.replace(‘zip‘,‘ok‘)
                if os.path.exists(path+filename_ok):
                    print(‘文件已存在‘)
                    break
                print("写入的文件路径",path+‘/‘+filename)
                att_file = open(path + filename, ‘wb‘)

                att_file.write(data)  # 保存附件
                att_file.close()
                attachment_files.append(filename)
            else:
                # 不是附件,是文本内容
                print(self.get_content(part))
                # # 如果ture的话内容是没用的
                # if not part.is_multipart():
                #     # 解码出文本内容,直接输出来就可以了。
                #     print(part.get_payload(decode=True).decode(‘utf-8‘))

        return attachment_files

    def send_mail(self ,msg_obj,to_addr_list):
        try:
            # smtp协议的默认端口是25,QQ邮箱smtp服务器端口是465,第一个参数是smtp服务器地址,第二个参数是端口,第三个参数是超时设置,这里必须使用ssl证书,要不链接不上服务器
            server = smtplib.SMTP_SSL(self.pop3_server, 465, timeout=2)
            # 登录邮箱
            server.login(self.user, self.password)
            # 发送邮件,第一个参数是发送方地址,第二个参数是接收方列表,列表中可以有多个接收方地址,表示发送给多个邮箱,msg.as_string()将MIMEText对象转化成文本
            server.sendmail(self.user, to_addr_list, msg_obj.as_string())
            server.quit()
            print("success")
        except Exception as  e:
            logging.exception(e)
            print(‘Faild:%s‘)

    def run_ing(self,path):
        str_day = str(datetime.date.today())# 日期赋值
        # 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSL
        try:
            telnetlib.Telnet(self.pop3_server, 995)
            self.server = poplib.POP3_SSL(self.pop3_server, 995, timeout=10)
        except:
            time.sleep(5)
            self.server = poplib.POP3(self.pop3_server, 110, timeout=10)

        # server.set_debuglevel(1) # 可以打开或关闭调试信息
        # 打印POP3服务器的欢迎文字:
        print("?",self.server.getwelcome().decode(‘utf-8‘))
        # 身份认证:
        self.server.user(self.user)
        self.server.pass_(self.password)
        # 返回邮件数量和占用空间:
        # list()返回所有邮件的编号:
        resp, mails, octets = self.server.list()
        # 可以查看返回的列表类似[b‘1 82923‘, b‘2 2184‘, ...]
        index = len(mails)
        for i in range(index, 0, -1):# 倒序遍历邮件
        # for i in range(1, index + 1):# 顺序遍历邮件
            resp, lines, octets = self.server.retr(i)
            # lines存储了邮件的原始文本的每一行,
            # 邮件的原始文本:
            msg_content = b‘
‘.join(lines).decode(‘gbk‘)
            # 解析邮件:
            msg = Parser().parsestr(msg_content)
            #获取邮件的发件人,收件人, 抄送人,主题
            # hdr, addr = parseaddr(msg.get(‘From‘))
            # From = self.decode_str(hdr)
            # hdr, addr = parseaddr(msg.get(‘To‘))
            # To = self.decode_str(hdr)
            # 方法2:from or Form均可
            From = parseaddr(msg.get(‘from‘))[1]
            To = parseaddr(msg.get(‘To‘))[1]
            Cc=parseaddr(msg.get_all(‘Cc‘))[1]# 抄送人
            Subject = self.decode_str(msg.get(‘Subject‘))
            print(‘from:%s,to:%s,Cc:%s,subject:%s‘%(From,To,Cc,Subject))
            # 获取邮件时间,格式化收件时间
            date1 = time.strptime(msg.get("Date")[0:24], ‘%a, %d %b %Y %H:%M:%S‘)
            # 邮件时间格式转换
            date2 = time.strftime("%Y-%m-%d",date1)

            if date2 < str_day:
                print("停止循环 不是今天的邮件",str_day,date2)
                break # 倒叙用break
                # continue # 顺叙用continue
            else:
                # 获取附件
                print("获取附件", str_day, date2)
                attach_file=self.get_att(msg,str_day,str(Subject),path)
                print(">",attach_file)

        # 可以根据邮件索引号直接从服务器删除邮件:
        # self.server.dele(7)
        self.server.quit()
def analysis_file(have_zip_path):
    import subprocess
    dir_list=subprocess.getoutput(f‘find {have_zip_path} -type f  -iname "*.zip"    ‘) #寻找这个路径下所有的zip文件
    # dir_list=subprocess.getoutput(f‘unzip {dir_list}  ‘)
    dir_list=dir_list.split(‘
‘)
    dir_list=[i for i in dir_list  if i ]
    for file_path in dir_list: #/data/loop/ada.zip
        #对这个文件解压大 loop
        unzip_path=file_path.replace(‘loophole‘,‘loophole_dir‘)
        unzip_path=unzip_path.replace(‘.zip‘,‘‘)#创建一个 /data/loop_dir/ada 目录
        print("文件路径:"+file_path)
        print("解压路径:"+unzip_path)
        if not os.path.exists(unzip_path):
            os.mkdir(unzip_path)
        subprocess.getoutput(f‘unzip -o {file_path} -d  {unzip_path} ‘) #把zip 文件 解压到 /data/loop_dir/ada下
        print(‘解压成功‘)
        #打开 /data/loophole_dir/ada/index.html
        f=open(f‘{unzip_path}/index.html‘)
        index_str=f.read()
        f.close()
        detail_host=core.process_loop(index_str,unzip_path)
        file_ok_path=file_path.replace(‘zip‘,‘ok‘) #替换成ok
        subprocess.getoutput(f‘mv {file_path}  {file_ok_path} ‘)
        try:
            core.process_loop_data(detail_host)  #数据入库
        except Exception as f :
            logging.error(‘严重错误 :解析失败‘)
            logging.exception(f)

def  give_email(path):
    ‘‘‘下载邮箱附件‘‘‘
    try:
        # 输入邮件地址, 口令和POP3服务器地址:
        # path = ‘test/‘
        from_addr = ‘yuno_upport@yunochina.net‘
        password = ‘kWFb463ccU54dwgr‘
        eamil_server = ‘smtp.exmail.qq.com‘
        email_class = down_email(user=from_addr, password=password, eamil_server=eamil_server)
        email_class.run_ing(path)
        return email_class
    except Exception as e:
        logging.error(‘严重错误 : 获取邮件错误‘)
        logging.exception(e)
        pass
def send_email(email_class):
    #取出所有未发送的消息
    #对负责人进行聚合
    from backend.models import Loophole, Manage_user
    unsend_query_list = Loophole.objects.filter(is_send=0).values(‘fx_id‘)  # 查出这台主机的fx_id
    unsend_query_list = list(set([i[‘fx_id‘] for i in unsend_query_list]))
    # print(unsend_query_list)
    manage_user_list = Manage_user.objects.filter(server__server__uuid__in=unsend_query_list)  # 筛选出有关于漏洞所有的服务责任
    for manage_user in manage_user_list:
        # manage_user.ywfx_set.all().first()
        ywfx_id_list = manage_user.server.all()
        ywfx_id_list = [i.server_id for i in ywfx_id_list]
        all_loop_for_the_manage = Loophole.objects.filter(fx_id__in=ywfx_id_list)  # 这个负责人所有的漏洞
        msg = []
        for loop in all_loop_for_the_manage:
            loop.is_send=1
            loop.save()
            msg.append(f‘漏洞名称:[{loop.loophole_name}]  漏洞详情[{loop.loophole_detail}] 漏洞级别【{loop.risk_level}】  CEV编号[{loop.CEV_num}]
‘)
        import base64
        from email.mime.text import MIMEText
        # 构造邮件,内容为hello world
        msg=‘
‘.join(msg)
        msg = MIMEText(msg)
        # 设置邮件主题
        today_day=datetime.datetime.now().strftime(‘%Y-%m-%d‘)
        msg["Subject"] = f"{today_day}:资管系统-自动化漏洞检测服务-最新漏洞"
        # 寄件者
        msg["From"] = ‘资管系统-自动化漏洞检测服务‘
        # 收件者
        msg["To"] = ‘责任人‘
        email_class.send_mail(msg,[manage_user.email])
def job():
    zip_path=‘/data/loophole/‘
    if not os.path.exists(zip_path):
        os.mkdir(zip_path)
    email_class=give_email(zip_path)  #返回email对象供下次调用
    analysis_file(zip_path)
    send_email(email_class) #读取所有未发送的漏洞 并发送

if __name__ == ‘__main__‘:
    TEST=‘1‘
    if TEST:
        job()
    else :
        from apscheduler.schedulers.blocking import BlockingScheduler  #
        scheduler = BlockingScheduler()
        scheduler.add_job(job, ‘interval‘,minutes=5)
        try:
            scheduler.start()
        except (KeyboardInterrupt, SystemExit):
            pass

  

以上是关于Python工具的主要内容,如果未能解决你的问题,请参考以下文章

python代码补全工具Kite

python调试之pdb调试工具

PHP代码-psysh调试代码片段工具

微信小程序代码片段

Word 文档的优秀代码片段工具或插件?

前端开发工具vscode如何快速生成代码片段