home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/python
-
- #
- # $Id: mailto,v 1.3 2003/01/02 17:59:19 gurubert Exp $
- #
-
- #
- # This is a mailto backend for CUPS (www.cups.org)
- #
- # (C) 2002 Robert Sander <robert.sander@epigenomics.com>
- #
- # Released under GPL
- #
- # NO WARRANTY AT ALL
- #
-
- import sys, os, tempfile, MimeWriter, mimetools, mimetypes
-
- log = "\nLog:\n"
-
- def guess_type(file):
- global log
-
- type, enc = mimetypes.guess_type(file)
- if (not type) or (type == 'application/octet-stream'):
- enc = None
- try:
- type = os.popen("/usr/bin/file -bi %s 2> /dev/null" % file).read().rstrip()
- if type == "" or type == "data":
- type = "application/octet-stream"
- except:
- type = "application/octet-stream"
- if log:
- log = "%stype is %s\n" % (log, type)
- return (type, enc)
-
- def guess_extension(mimetype):
- return(mimetypes.guess_extension(mimetype))
-
- argc = len(sys.argv)
-
- if argc == 1:
- print "network mailto \"Unknown\" \"SMTP\""
- sys.exit(0)
-
- sys.stderr.write("INFO: mailto argv[%s] =" % argc)
- if log:
- log = "%smailto argv[%s] =" % (log, argc)
- for arg in sys.argv[1:]:
- sys.stderr.write(" '%s'" % arg)
- if log:
- log = "%s '%s'" % (log, arg)
- sys.stderr.write("\n")
- if log:
- log = "%s\n" % log
-
- if argc < 6 or argc > 7:
- sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
- sys.exit(1)
-
- jobid = sys.argv[1]
- user = sys.argv[2]
- title = sys.argv[3]
- opts = sys.argv[5].split(" ")
-
- if argc == 7:
- sys.stderr.write("INFO: file is %s\n" % sys.argv[6])
- if log:
- log = "%sfile is %s\n" % (log, sys.argv[6])
- infilename = sys.argv[6]
- else:
- infilename = tempfile.mktemp(".mailto")
- try:
- infile = open(infilename, "w")
- except:
- sys.stderr.write("ERROR: unable to create tmp file %s\n" % infilename)
- sys.exit(1)
- sys.stderr.write("INFO: file is stdin\n")
- try:
- infile.write(sys.stdin.read())
- except:
- sys.stderr.write("ERROR: unable to copy into tmpfile\n")
- sys.exit(1)
- infile.close()
- if log:
- log = "%scopied stdin to %s\n" % (log, infilename)
-
- infile = open(infilename, "r")
-
- sys.stderr.write("INFO: creating tmp mail file\n")
-
- try:
- mimemailfile = tempfile.TemporaryFile()
- mimemail = MimeWriter.MimeWriter(mimemailfile)
- except:
- sys.stderr.write("ERROR: unable to create tmp file for MIME_MAIL\n")
- sys.exit(1)
-
- mailto = None
- mailfrom = None
- for opt in opts:
- if log:
- log = "%sopt = '%s'\n" % (log, opt)
- if opt[:7] == "mailto=":
- mailto = opt[7:]
- if log:
- log = "%smailto = '%s'\n" % (log, mailfrom)
- if opt[:9] == "mailfrom=":
- mailfrom = opt[9:]
- if log:
- log = "%smailfrom = '%s'\n" % (log, mailfrom)
- if not mailto:
- if user:
- mailto = user
- else:
- mailto = mailfrom
- else:
- if not mailfrom:
- if user:
- mailfrom = user
- if not mailfrom:
- mailfrom = "lp"
-
- # Essential lines to put into the header of a MIME mail.
- mimemail.addheader("From", mailfrom)
- mimemail.addheader("To", mailto)
- mimemail.addheader("Subject", title)
- mimemail.addheader("MIME-Version", "1.0")
- if mailto != user and mailfrom != user:
- mimemail.addheader("X-CUPS-mailto-started-by", user)
-
- mimemail.startmultipartbody("mixed")
-
- body = mimemail.nextpart()
-
- body.addheader("Content-Transfer-Encoding", "8bit")
-
- body.startbody("text/plain").write("You printed %s with jobid %s\n%s" % (title, jobid, log))
-
- attachment = mimemail.nextpart()
- type, enc = guess_type(infilename)
- ext = guess_extension(type)
- if not ext:
- ext = ""
- attachment.addheader("Content-Transfer-Encoding", "base64")
- att = attachment.startbody('%s; name="%s%s"' % (type, os.path.basename(title), ext))
- mimetools.encode(infile, att, "base64")
- mimemail.lastpart()
-
- mimemailfile.seek(0)
-
- os.popen("/usr/sbin/sendmail -t -f%s" % mailfrom, "w").write(mimemailfile.read())
-
- att.close()
- infile.close()
- mimemailfile.close()
-
- if argc == 6:
- os.unlink(infilename)
-
- sys.exit(0)
-