#!/bin/env python
# Copyright 2007 Jon Dubovsky (jon@dubovsky.com)
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
"""Command-line program to send email via an SMTP server."""
strLicense = """Copyright 2007 Jon Dubovsky (jon@dubovsky.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see ."""
strVersion = "%%prog 0.01 %s" % strLicense
from optparse import OptionParser
import smtplib, sys
def main():
strUsage = """%prog [options]
Reads the body of the email from stdin unless --body or --body-file are
given and sends the resulting email via SMTP to the given server.
This program comes with ABSOLUTELY NO WARRANTY. This is free software, and
you are welcome to redistribute it under certain conditions; run with
--version for details."""
parser = OptionParser(usage=strUsage, version=strVersion)
parser.add_option('-v', '--verbose', dest="verbosity", action="count", help='output information about our running')
#parser.add_option('-a', '--attach', dest='file', action='append', help='attach the given file to the message (may be used multiple times)')
parser.add_option('-u', '--smtp-user', dest='smtpuser', help='username for SMTP server (if it requires login)')
parser.add_option('-p', '--smtp-pass', dest='smtppass', help='password for SMTP server (if it requires login)')
parser.add_option('-t', '--to', help='additional \'To\' addresses (may be used multiple times)')
parser.add_option('-b', '--body', dest='bodytext', help='provide the body of the message (rather than reading it from stdin)')
parser.add_option('-f', '--body-file', dest='bodyfile', help='use a file\'s content for the body of message (rather than reading it from stdin)')
(options, args) = parser.parse_args()
# must have all the positional args
if len(args) != 4:
parser.error("missing required arguments")
smtpserver = args[0]
sender = args[1]
recip = [ args[2] ]
if options.to:
recip.extend(options.to)
message = ""
for addr in recip:
message += "To: %s\n" % addr
message += "From: %s\n" % sender
message += "Subject: %s\n" % args[3]
message += "\n" # end of email header
if options.bodytext:
message += options.bodytext
elif options.bodyfile:
message += open(options.bodyfile, 'r').read()
else:
# read body from stdin
try:
while 1:
# warning: this will always append a newline to the last message line (at EOF)
message += raw_input() + "\n"
except EOFError:
pass
if options.verbosity:
print "server: %s" % smtpserver
print "sender: %s" % sender
print "recipients: %s" % repr(recip)
print "message follows:\n%s" % message
session = smtplib.SMTP(smtpserver)
# log in, if required
if options.smtpuser or options.smtppass:
if options.verbosity:
print "logging in to the SMTP server as %s" % options.smtpuser
session.login(options.smtpuser, options.smtppass)
# send the message
smtpresult = session.sendmail(sender, recip, message)
if smtpresult:
for recip in smtpresult.keys():
print "* error: could not delivery mail to: %s (%s: %s)" % (recip, smtpresult[recip][0], smtpresult[recip][1])
return 1
return 0
if __name__ == '__main__':
sys.exit( main() )