You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.2 KiB
Python

#!/usr/bin/python3
from string import ascii_lowercase
from random import choices
from argparse import ArgumentParser
from smtplib import (
SMTP,
SMTPSenderRefused,
SMTPRecipientsRefused,
)
def check_clear(domain, port, orgin_domain, from_addr, to_addr, log_level):
with SMTP(host=domain, port=port, local_hostname=orgin_domain) as smtp:
smtp.set_debuglevel(log_level)
try:
smtp.sendmail(
from_addr=from_addr,
to_addrs=[to_addr],
msg="test_cleartextmail"
)
except SMTPSenderRefused as error:
code = error.smtp_code
error = error.smtp_error.decode()
if code == 530 and "STARTTLS" in error:
return False
else:
raise
except SMTPRecipientsRefused:
pass
return True
def color(string, color_name):
color_code = ""
if color_name == "green":
color_code = "\033[92m"
elif color_name == "red":
color_code = "\033[91m"
elif color_name == "orange":
color_code = "\033[93m"
end_color = "\033[1m"
return f"{color_code}{string}{end_color}"
def main():
parser = ArgumentParser(
description=(
"Script to check wether or not the target mail server accepts "
"cleartext connections and email from other smtp relay"
)
)
parser.add_argument(
'domain',
type=str,
help="domain to check"
)
parser.add_argument(
'-p',
'--port',
type=int,
default=25,
help="port for STARTTLS (usually 25)",
)
parser.add_argument(
'-f',
'--from_addr',
type=str,
default="foo@example.com",
help="address to use to check the server (default foo@example.com)"
)
parser.add_argument(
'-t',
'--to_addr',
type=str,
default="",
help="address of the recipient (default [random]@[domain])"
)
parser.add_argument(
"-v",
"--verbose",
action="store_true",
help="Activate verbose mode an display all smtp trafic"
)
args = parser.parse_args()
origin_domain = args.from_addr.split("@")[-1]
rand_char = ''.join(choices(ascii_lowercase, k=64))
to_addr = args.to_addr if args.to_addr else f"{rand_char}@{args.domain}"
print(
"Testing if the server support clear text email delivery:",
end=' '
)
try:
result = check_clear(
domain=args.domain,
port=args.port,
orgin_domain=origin_domain,
from_addr=args.from_addr,
to_addr=to_addr,
log_level=2 if args.verbose else 0
)
except Exception as exception:
print(color("Unknown", "orange"))
print(
"got unknown exception run the command again with -v for more "
"details"
)
print(exception)
else:
if result:
print(color("True", "green"))
else:
print(color("False", "red"))
if __name__ == "__main__":
main()