#!/usr/bin/env python

import sys
import smtplib
import dns.resolver

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

# Lookup a domain and get its mailserver
def get_mx_record(domain):
    hosts = []
    try:
        records = dns.resolver.query(domain, "MX")
        for rdata in records:
            hosts.append(str(rdata.exchange).rstrip('.'))
        return hosts
    except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.exception.Timeout) as e:
        print e

    if (hosts):
        return hosts[0]
    else:
        return None

def send_email_direct(email_from, email_to, subject, body):
    # find the appropiate mail server
    domain = email_to.split('@')[1]
    remote_server = get_mx_record(domain)
    if (remote_server is None):
        print "No valid email server could be found for [%s]!" % (email_to)
        return

    # connect to remote mail server and forward message on
    server = smtplib.SMTP(remote_server, 25)

    msg = MIMEMultipart()
    msg['From'] = email_from
    msg['To'] = email_to
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    smtp_sendmail_return = ""
    try:
        smtp_sendmail_return = server.sendmail(email_from, email_to, msg.as_string())
    except Exception, e:
        print 'SMTP Exception:\n' + str( e) + '\n' + str( smtp_sendmail_return)
    finally:
        server.quit()

def loademails(filename):
    with open(filename, 'r') as f:
        return f.read().splitlines()

def loadbody(filename):
    with open(filename, 'r') as f:
        return f.read()

if __name__ == "__main__":
    def usage():
        print "%s <from emailaddress> <subject> <to emailaddress file> <email body file>" % (sys.argv[0])
    if (len(sys.argv) <> 5):
        usage()
        sys.exit(0)

    fromemail = sys.argv[1]
    subject = sys.argv[2]
    emailfile = sys.argv[3]
    bodyfile = sys.argv[4]

    body = loadbody(bodyfile)

    for toemail in loademails(emailfile):
        send_email_direct(fromemail, toemail, subject, body)