Пытаюсь реализовать поиск корректных imap url по адресу мыла. Может кто сталкивался? Просьба подсказать. Желательно чтобы это возможно было делать в командной строке либо скриптом.
def is_listening(ip, port):
try:
port = int(port)
socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET
s = socket.socket(socket_type, socket.SOCK_STREAM)
s.settimeout(3)
s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s
s.connect((ip, port))
s.close()
return True
except:
return False
def guess_smtp_server(domain):
global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains
domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain]
try:
mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1]...
def is_listening(ip, port):
try:
port = int(port)
socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET
s = socket.socket(socket_type, socket.SOCK_STREAM)
s.settimeout(3)
s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s
s.connect((ip, port))
s.close()
return True
except:
return False
def guess_smtp_server(domain):
global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains
domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain]
try:
mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1]
domains_arr += [mx_domain]
except:
raise Exception('no MX records found for: '+domain)
if is_ignored_host(mx_domain) or re.search(dangerous_domains, mx_domain) and not re.search(r'\.outlook\.com$', mx_domain):
raise Exception(white('skipping domain: '+mx_domain+' (for '+domain+')',2))
if re.search(r'protection\.outlook\.com$', mx_domain):
return domain_configs_cache['outlook.com']
for host in domains_arr:
try:
ip = get_rand_ip_of_host(host)
except:
continue
for port in [2525, 587, 465, 25]:
debug(f'trying {host}, {ip}:{port}')
if is_listening(ip, port):
return ([host+':'+str(port)], default_login_template)
raise Exception('no connection details found for '+domain)
Вот подобный конфиг как раз искал. Спасибо большое. а то я пока только смог вот такое нагородить:Без проблем переделаешь для IMAP (домены и порт). И вот в атаче стаааарые (нужно перечекать) конфиги для доменов из какого-то говночекера.Python:def is_listening(ip, port): try: port = int(port) socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET s = socket.socket(socket_type, socket.SOCK_STREAM) s.settimeout(3) s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s s.connect((ip, port)) s.close() return True except: return False def guess_smtp_server(domain): global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain] try: mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1] domains_arr += [mx_domain] except: raise Exception('no MX records found for: '+domain) if is_ignored_host(mx_domain) or re.search(dangerous_domains, mx_domain) and not re.search(r'\.outlook\.com$', mx_domain): raise Exception(white('skipping domain: '+mx_domain+' (for '+domain+')',2)) if re.search(r'protection\.outlook\.com$', mx_domain): return domain_configs_cache['outlook.com'] for host in domains_arr: try: ip = get_rand_ip_of_host(host) except: continue for port in [2525, 587, 465, 25]: debug(f'trying {host}, {ip}:{port}') if is_listening(ip, port): return ([host+':'+str(port)], default_login_template) raise Exception('no connection details found for '+domain)
import os
import re
import json
import requests
def get_email_settings(email):
url = f'https://emailsettings.firetrust.com/settings?q={email}'
response = requests.get(url)
if response.status_code == 200:
source = response.json()
data = source
for i in range(len(data["settings"])):
if data["settings"][i]["protocol"] == "IMAP":
imap_server = data["settings"][i]["address"]
imap_port = data["settings"][i]["port"]
return imap_server, imap_port
return 'N/A', 'N/A'
with open('emails2.txt', 'r') as email_file:
email_addresses = email_file.readlines()
email_addresses = [email.strip() for email in email_addresses]
for email in email_addresses:
imap_server, imap_port = get_email_settings(email)
if imap_server != 'N/A':
print(f'{email}: {imap_server}:{imap_port}')
else:
print(f'No IMAP server found for {email}')
import subprocess
import socket
def get_mx_record(domain):
cmd = f"dig {domain} MX"
output = subprocess.run(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output_str = output.stdout.decode("utf-8").strip()
lines = output_str.split("\n")
mx_records = []
for line in lines:
if "MX" in line:
mx_records.append(line.split()[-1][:-1])
return mx_records
def get_imap_url(email):
email_parts = email.split("@")
domain = email_parts[-1]
imap_hosts = []
imap_hosts.append(f"imap.{domain}")
mx_records = get_mx_record(domain)
for mx_record in mx_records:
imap_hosts.append(f"imap.{mx_record}")
ip_hosts = []
for host in imap_hosts:
try:
ip = socket.gethostbyname(host)
try:
reverse_host = socket.gethostbyaddr(ip)[0]
ip_hosts.append(f"imap.{reverse_host}")
except socket.herror:
pass
except socket.gaierror:
pass
imap_hosts.extend(ip_hosts)
for host in imap_hosts:
for port in (993, 143):
try:
s = socket.create_connection((host, port), timeout=3)
s.close()
return f"{host}:{port}"
except socket.error:
pass
return None
results = {}
with open("emails.txt", "r") as f:
for email in f:
email = email.strip()
results[email] = get_imap_url(email)
with open("imap_urls.txt", "w") as f:
for email, imap_url in results.items():
if imap_url:
f.write(f"{email}: {imap_url}\n")
else:
f.write(f"{email}: Not found\n")