SPAM Schleuder :)

Hier mal wieder ein kleines Tool, entstanden aus aktuellem Anlass.
Wer kennt nicht das Problem, mal schnell eine email an eine Liste von Empfängern zu schreiben, ohne deren emailadressen allgemein publik zu machen und gleichzeitig ein wenig individuell zu wirken ?
Sicher, man kann die email an einen virtuellen Empfänger (oder an sich selbst) adressieren und alle andern auf BCC setzen, aber da fehlt dann halt die persönliche Note in Form einer individuellen Anrede (Hallo XYZ,).
Also schnell mal nach ’smtp send email python‘ gegoogelt und gleich alle notwendigen Tips gefunden (python gefällt mir immer besser, muss ich sagen..).
Ergebnis ist das hier veröffentlichte script, das gleich mal praktische Verwendung zum Versand einer aktuellen Einladung fand 😀
Und ja, es ist natürlich auch hervorragend als SPAM-Schleuder zu gebrauchen 😉
(Für eine solche Verwendung lehne ich nat. jede Verantwortung ab).
Quelltext:

#!/usr/bin/python
#	bulkmail.py: send bulk email to recipients in RecListFileName
#	Message is from MsgFileName, preceeded by 'Hallo <Name>,\n'
#	RecListFileName must contain one Recipient per line in the form 'Vorname Name <email>'
# Default Subject may be overridden in MsgFile (line starting with 'Subject:')

import os, sys

def send_email(TO, SUBJECT, TEXT):
    import smtplib
    import datetime

    date = datetime.datetime.now().strftime( "%d %b %Y %H:%M" )

    # Prepare actual message
    message = """From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, date, TEXT)
    try:
        server = smtplib.SMTP(smtp_server, 25)    # be sure to use correct port (25 for std smtp, )
        server.ehlo()
        server.starttls()
        server.login(user, pwd)
        server.sendmail(FROM, TO, message)
        server.close()
    except:
        print "failed to send mail to %s" % (TO)

#  Config (global variables - use your own valid credentials instead :):
FROM = 'George Bush <ghwbush@whitehouse.gov>'
smtp_server = "srv1.whitehouse.gov"
user = "ghwbush"
pwd = "obama"
            
#	Defaults:                
TO = [FROM] #must be a list
SUBJECT = "Test bulk email"
TEXT = "Testing sending mail using whitehouse servers"
RecListFileName = "Recipients.lst"

NumArgs = len(sys.argv)
if (NumArgs < 2):
  print 'usage: %s RecListFileName MsgFileName' % (sys.argv[0])
  sys.exit()

RecListFileName = sys.argv[1] 
MsgFileName = sys.argv[2] 

# read message (and subject) from MsgFile
Msg = ''
try:
  MsgFile = open(MsgFileName, 'r')
  line = MsgFile.readline(); # read 1st line
  while (line):
    sline = line.strip()
    if (sline.startswith('Subject:')):
        # extract Subject
        SUBJECT = sline.replace('Subject:',  '')
    else:
        Msg += line
    line = MsgFile.readline()
        
  LogMsg = 'Message:\n' + Msg + '\nhas been sent to:\n'
  MsgFile.close()
except:
  print 'could not read %s - exiting' % (MsgFileName)
  sys.exit()

# process RecListFile, send emails to each recipient
try:
  RecListFile = open(RecListFileName, 'r')
  line = RecListFile.readline(); # read 1st line
  while (line):
    line = line.strip()
    if ((len(line) > 0) and not (line.startswith('#'))):
      TO = []
      TO.append(line)
      parts = TO[0].split(" ")
      Vorname = parts[0]
      TEXT = "Hallo %s,\n%s " % (Vorname, Msg)
      #print '%s' % (TEXT)
      send_email(TO, SUBJECT, TEXT)
      print 'Message from %s has been sent to: %s' % (MsgFileName, line)
      LogMsg += line
      LogMsg += '\n'
    line = RecListFile.readline()
except:
  print 'could not read %s - exiting' % (RecListFileName)
  sys.exit()
RecListFile.close()

# Log Message as email to Sender
TO = [FROM]
send_email(TO, SUBJECT, LogMsg)