#!/usr/bin/python3
import smtplib
import ssl
import argparse
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formatdate
import sys

# Create argument parser
parser = argparse.ArgumentParser(description="Sends an email via the given settings.")

# Add arguments for parsing
parser.add_argument(
    "-p",
    "--port",
    dest="port",
    help="Port to send on (default 587)",
    required=False,
    default=587,
)
parser.add_argument("-U", "--username", dest="username", help="Username", required=True)
parser.add_argument("-P", "--password", dest="password", help="Password", required=True)
parser.add_argument(
    "-t",
    "--timeout",
    dest="timeout",
    help="Timeout before aborting in seconds",
    default=30,
)
parser.add_argument(
    "-H", "--emailto", dest="email_to", help="Email to send to", required=True
)
parser.add_argument(
    "-F", "--emailfrom", dest="email_from", help="Email to send from", default=None
)
parser.add_argument(
    "-S", "--server", dest="server", help="SMTP server to use", required=True
)
parser.add_argument("-s", "--subject", dest="subject", help="Subject of the email")
parser.add_argument(
    "-b", "--body", dest="body", help="Body of the email", required=True
)
parser.add_argument(
    "-i", "--insecure", dest="insecure", help="Disable verification of certificates", action="store_true"
) 

# Parse arguments
args = parser.parse_args()

# If no email_from, use username.
if args.email_from is None:
    args.email_from = args.username

# Create multipart MIME message
message = MIMEMultipart("alternative")
message["Subject"] = args.subject  # set subject
message["From"] = args.email_from  # set recipient
message["To"] = args.email_to  # set sender
message["Date"] = formatdate()
message.attach(MIMEText(args.body, "plain"))  # attach body to message


# Create default SSL context
if args.insecure:
    context = ssl._create_unverified_context()
else:
    context = ssl.create_default_context()

try:
    # Create server connection
    server = smtplib.SMTP(args.server, args.port, None, args.timeout)
    server.starttls(context=context)  # init starttls
    server.login(args.username, args.password)  # login to server
    server.sendmail(args.email_from, args.email_to, message.as_string())  # send email
    return_val = 0  # set return value
    return_text = "OK - Succeeded sending email to " + args.email_to  # set return text
    # Quit the server
    server.quit()

except Exception as e:
    # If exception caught, set return value to 2 (crit) and message to critical with error
    return_val = 2
    return_text = "CRITICAL - " + str(e)

finally:
    # Print return text and exit with value
    print(return_text)
    sys.exit(return_val)

