🍬 博主介绍

👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
网络钓鱼不仅是一种网络攻击技术同时也是一项最常见的社会工程技术,更是红队选手和网络犯罪分子的惯用伎俩。
本文我们探讨收集整理目标邮箱自动化脚本。

1.4.5 邮件爬取

1.4.5.1 文本文件中提取邮箱

1.收集来源

从txt文本文件中提取邮箱信息。

2.脚本内容

import re

f = open('test.txt', 'r', encoding='utf-8')  # 读取文件
strings = f.read()  # 获取文件内容,到内存
f.close()  # 读关闭

match = re.findall(r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,8}\b', strings)  # 正则匹配

f1 = open('test1.txt', 'a', encoding='utf-8')  # 打开新的文件
list2 = list(set(match))  # 去重

list_nums = len(list2)  # 列表的数量,长度

# 循环写入文件,并换行
for line in range(list_nums):
    f1.writelines(list2[line] + "\n")
# 关闭流
f1.close()

3.脚本内容解析

这个脚本的主要功能是从一个名为 test.txt 的文件中提取所有的电子邮件地址,并将这些唯一的电子邮件地址写入到另一个名为 test1.txt 的文件中。

以下是对代码的详细解释:

1.导入模块
re:正则模块

2.读取文件内容。
打开名为 test.txt 的文件,以只读模式 (‘r’) 和 UTF-8 编码读取文件内容。
使用 read() 方法将文件内容全部读取到字符串变量 strings 中。
关闭文件流,释放资源。

3.正则表达式匹配电子邮件地址。
使用 re.findall() 函数在 strings 中查找所有符合指定正则表达式模式的子串。
正则表达式 r’\b[a-zA-Z0-9._%±]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,8}\b’ 用于匹配标准的电子邮件地址格式。
\b 表示单词边界。
[a-zA-Z0-9._%+-]+ 匹配电子邮件用户名部分,可以包含字母、数字、点、下划线、百分号、加号和减号。
@ 匹配 @ 符号。
[a-zA-Z0-9.-]+ 匹配域名部分,可以包含字母、数字、点和减号。
\.[a-zA-Z]{2,8} 匹配顶级域名部分,要求长度为2到8个字母。

4.去重并写入新文件
打开名为 test1.txt 的文件,以追加模式 (‘a’) 和 UTF-8 编码。如果文件不存在,会自动创建。
使用 set(match) 去除重复的电子邮件地址,并将其转换为列表 list2。
计算去重后的电子邮件地址列表的长度,存储在 list_nums 变量中。
使用 for 循环遍历 list2 中的每个元素。
每次循环将当前元素(即一个电子邮件地址)加上换行符 \n,然后写入到 test1.txt 文件中。

5.关闭文件流
关闭文件流,确保数据被正确写入并释放资源。

4.脚本使用介绍

使用示例:

python .\从文本文件中提取邮箱.py

在这里插入图片描述

1.4.5.2 邮箱整理排序去重

1.去重整理邮箱

将收集道德邮箱进行优化,如去重、格式调整等。

2.脚本内容

import os
import re
from collections import defaultdict

def read_txt_files(file_paths):
    emails = []
    for file_path in file_paths:
        try:
            with open(file_path, 'r') as f:
                emails.extend([line.strip() for line in f.readlines()])
        except Exception as e:
            print(f"读取文件 {file_path} 时发生错误: {e}")
    return emails

def remove_duplicates(emails):
    unique_emails = list(set(emails))
    return unique_emails

def sort_emails(emails):
    sorted_emails = sorted(emails, key=lambda x: (re.search('@[\w.]+', x).group(), x))
    return sorted_emails

def main():
    import argparse
    parser = argparse.ArgumentParser(description="处理邮箱文件")
    parser.add_argument("-t", "--single_file", help="输入单个文件")
    parser.add_argument("-c", "--batch_file", help="输入存放批量文件路径的文件")
    parser.add_argument("-f", "--save_to_file", action="store_true", help="保存到文件")
    parser.add_argument("-o", "--output_file", help="指定文件路径")
    args = parser.parse_args()

    if args.single_file:
        file_paths = [args.single_file]
    elif args.batch_file:
        try:
            with open(args.batch_file, 'r') as f:
                file_paths = [line.strip() for line in f.readlines()]
        except Exception as e:
            print(f"读取批量文件 {args.batch_file} 时发生错误: {e}")
    else:
        input_folder = input("请输入存放txt文件路径的文件夹:")
        file_paths = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith('.txt')]

    emails = read_txt_files(file_paths)
    total_count = len(emails)
    unique_emails = remove_duplicates(emails)
    unique_count = len(unique_emails)
    sorted_emails = sort_emails(unique_emails)
    removed_count = len(emails) - len(unique_emails)
    print("总计邮箱个数:", total_count)
    print("去除重复邮箱个数:", removed_count)
    print("剩余邮箱个数:", len(sorted_emails))
    print("排序并去重后的邮箱列表:")
    for email in sorted_emails:
        print(email)

    if args.save_to_file:
        if args.output_file:
            output_file = args.output_file
        else:
            output_file = "output.txt"
        try:
            with open(output_file, 'a') as f:
                for email in sorted_emails:
                    f.write(email + '\n')
        except Exception as e:
            print(f"写入文件 {output_file} 时发生错误: {e}")

if __name__ == "__main__":
    main()

3.脚本内容解析

这个Python脚本的主要功能是处理和整理电子邮件地址,包括读取多个文本文件中的电子邮件地址、去重、排序,并将结果保存到指定的输出文件中。

以下是对代码的详细解释:

1.导入模块
os: 用于与操作系统进行交互,例如文件路径操作。
re: 正则表达式模块,用于匹配和处理字符串。
defaultdict: 来自collections模块,用于创建带有默认值的字典。

2.定义函数 read_txt_files
打开名为 test.txt 的文件,以只读模式 (‘r’) 和 UTF-8 编码读取文件内容。
该函数接受一个文件路径列表,并尝试读取每个文件中的内容。
使用with open语句打开文件,确保文件在读取后自动关闭。
将每行内容去除首尾空白字符后添加到emails列表中。
如果读取过程中出现异常,会捕获并打印错误信息。

3.定义函数 remove_duplicates
该函数接受一个包含电子邮件地址的列表,并返回一个去重后的列表。
使用set数据结构来自动去重,然后转换回列表。

4.定义函数 sort_emails
打开名为 test1.txt 的文件,以追加模式 (‘a’) 和 UTF-8 编码。如果文件不存在,会自动创建。
该函数接受一个包含电子邮件地址的列表,并返回一个排序后的列表。
使用sorted函数对列表进行排序,排序依据是电子邮件地址中的域名部分(通过正则表达式提取)和整个电子邮件地址。

5.主函数 main
使用argparse模块解析命令行参数。
支持以下参数:
-t 或 --single_file: 输入单个文件路径。
-c 或 --batch_file: 输入存放批量文件路径的文件。
-f 或 --save_to_file: 是否保存结果到文件。
-o 或 --output_file: 指定输出文件路径。

6.根据参数确定文件路径列表
根据不同的参数情况,确定要处理的文件路径列表。
如果提供了单个文件路径,直接使用该路径。
如果提供了批量文件路径文件,读取该文件并获取所有文件路径。
如果未提供任何参数,提示用户输入文件夹路径,并获取该文件夹下所有以.txt结尾的文件路径。

7.读取、去重、排序电子邮件地址并输出结果
调用前面定义的函数读取、去重和排序电子邮件地址。
打印总的邮箱个数、去重后的邮箱个数、剩余邮箱个数以及排序后的邮箱列表。

8.保存结果到文件(如果需要)
如果指定了保存结果到文件,并且提供了输出文件路径,则将结果写入该文件。
如果没有提供输出文件路径,默认为output.txt。
使用with open语句打开文件,确保文件在写入后自动关闭。
将排序后的邮箱列表逐行写入文件。

9.运行主函数
确保脚本作为主程序运行时执行main函数。

4.脚本使用介绍

参数说明:

  -h, --help            show this help message and exit
  -t SINGLE_FILE, --single_file SINGLE_FILE
                        输入单个文件
  -c BATCH_FILE, --batch_file BATCH_FILE
                        输入存放批量文件路径的文件
  -f, --save_to_file    保存到文件
  -o OUTPUT_FILE, --output_file OUTPUT_FILE
                        指定文件路径

使用示例:

python .\邮箱整理排序去重.py -h
python .\邮箱整理排序去重.py -t 1.txt -f -o 2.txt

在这里插入图片描述

相关资源

[ 提升篇 ] 钓鱼实战系列
[ 钓鱼实战系列-基础篇-4 ] 一篇文章教会你用红队思维收集目标邮箱信息-1(附邮箱收集自动化脚本)
[ 钓鱼实战系列-基础篇-4 ] 一篇文章教会你用红队思维收集目标邮箱信息-2(附邮箱收集自动化脚本)

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐