import smtplib
import ssl
import imaplib
import email
import threading
import time
import random
import os
from concurrent.futures import ThreadPoolExecutor
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from queue import Queue
from colorama import init, Fore
import socks
import socket

init(autoreset=True)

print(Fore.CYAN + "Ai by Revo")

def load_smtp_servers(filename):
    with open(filename, 'r') as f:
        return [line.strip().split('|') for line in f if line.strip() and len(line.strip().split('|')) == 4]

def load_proxies(filename):
    with open(filename, 'r') as f:
        return [line.strip() for line in f if line.strip()]

def set_proxy(proxy_type, proxy_str):
    ip, port = proxy_str.split(':')
    port = int(port)
    types = {
        'http': socks.HTTP,
        'https': socks.HTTP,
        'socks4': socks.SOCKS4,
        'socks5': socks.SOCKS5
    }
    socks.setdefaultproxy(types[proxy_type], ip, port)
    socket.socket = socks.socksocket

def reset_socket():
    socket.socket = socket._socketobject

def send_email(smtp_info, to_email, subject, content, use_proxy, proxy_type, proxy_list, success_queue):
    host, port, user, password = smtp_info
    port = int(port)
    message = MIMEMultipart()
    message['From'] = user
    message['To'] = to_email
    message['Subject'] = subject
    message.attach(MIMEText(content, 'plain'))

    if use_proxy:
        proxy = random.choice(proxy_list)
        set_proxy(proxy_type, proxy)

    try:
        context = ssl.create_default_context()
        server = None
        if port == 465:
            server = smtplib.SMTP_SSL(host, port, timeout=30, context=context)
        else:
            server = smtplib.SMTP(host, port, timeout=30)
            server.starttls(context=context)
        server.login(user, password)
        server.sendmail(user, to_email, message.as_string())
        server.quit()
        print(Fore.GREEN + f"[+] Email sent using: {host}|{port}|{user}|{password}")
        success_queue.put('|'.join(smtp_info))
    except Exception as e:
        print(Fore.RED + f"[-] Failed: {host}|{port}|{user}|{password} -> {str(e)}")
    finally:
        if use_proxy:
            reset_socket()

def imap_check(server, user, password, subject, duration_minutes, success_queue):
    found_senders = set()
    try:
        mail = imaplib.IMAP4_SSL(server)
        mail.login(user, password)
        print(Fore.GREEN + "[+] Logged in to recipient mailbox successfully.")
        mail.select("inbox")
        duration_seconds = duration_minutes * 60
        last_check = 0
        for elapsed in range(duration_seconds):
            remaining = duration_seconds - elapsed
            print(Fore.BLUE + f"[i] Time left to check inbox: {remaining} sec", end='\r')
            if elapsed - last_check >= 10 or elapsed == 0:
                result, data = mail.search(None, f'(SUBJECT "{subject}")')
                if result == 'OK':
                    ids = data[0].split()
                    for msg_id in ids:
                        result, msg_data = mail.fetch(msg_id, '(RFC822)')
                        if result == 'OK':
                            msg = email.message_from_bytes(msg_data[0][1])
                            from_addr = msg['From']
                            if from_addr not in found_senders:
                                print(Fore.YELLOW + f"[+] Found email from: {from_addr}")
                                found_senders.add(from_addr)
                                success_queue.put(from_addr)
                last_check = elapsed
            time.sleep(1)
        mail.logout()
        print(Fore.GREEN + "\n[+] Logged out of recipient mailbox.")
    except Exception as e:
        print(Fore.RED + f"[-] IMAP login failed: {e}")

def main():
    smtp_file = input("Enter SMTP servers filename: ")
    threads = int(input("Enter number of threads: "))
    to_email = input("Enter recipient email: ")
    subject = input("Enter email subject: ")
    content = input("Enter email content: ")
    use_proxy = input("Use proxy? (y/n): ").lower() == 'y'

    proxy_list = []
    proxy_type = ''
    if use_proxy:
        proxy_file = input("Enter proxy list filename: ")
        proxy_type = input("Enter proxy type (http/https/socks4/socks5): ").lower()
        proxy_list = load_proxies(proxy_file)

    smtp_servers = load_smtp_servers(smtp_file)
    success_queue = Queue()
    smtp_success_map = {}

    with ThreadPoolExecutor(max_workers=threads) as executor:
        for smtp in smtp_servers:
            if len(smtp) != 4:
                continue
            smtp_key = '|'.join(smtp)
            smtp_success_map[smtp[2]] = smtp_key  # Map sender (user) to full SMTP info
            executor.submit(send_email, smtp, to_email, subject, content, use_proxy, proxy_type, proxy_list, success_queue)

    print(Fore.CYAN + "[i] All emails sent. Starting IMAP check.")
    imap_server = input("Enter recipient IMAP server: ")
    imap_user = input("Enter recipient IMAP user: ")
    imap_pass = input("Enter recipient IMAP password: ")
    duration = int(input("How many minutes to check inbox for replies? "))

    imap_check(imap_server, imap_user, imap_pass, subject, duration, success_queue)

    good_file = 'good.txt'
    good_set = set()
    while not success_queue.empty():
        sender = success_queue.get()
        if sender in smtp_success_map:
            good_set.add(smtp_success_map[sender])
    with open(good_file, 'w') as f:
        for smtp in good_set:
            f.write(smtp + '\n')

    print(Fore.GREEN + f"[+] Saved {len(good_set)} working SMTP servers to good.txt")
    print(Fore.CYAN + "Ai by Revo")

if __name__ == '__main__':
    main()
