MIME attachments and SMTP
Max Møller Rasmussen
maxm at normik.dk
Tue Sep 12 07:18:38 EDT 2000
here is another one that can be used. Some of the code is taken from
somebody elses program, and changed.
----------------------------------------
import string,sys,types,os,tempfile,time
import mimetypes,mimetools,MimeWriter
import smtplib
class mxmMail:
"""
mxm_mail is an e-mail client that makes it possible to send e-mail in
the
same way as using simple e-mail client software like outlook express or
the netscape
mail client.
License: TIUISICIIDC (Take it, use it, sell it, change it. I dont care.)
contact: maxm at normik.dk, maxmcorp at worldonline.dk, maxm at mxm.dk
"""
def __init__(self, fromName='', fromAddress='', subject='', message='',
SMTPServer='localhost'):
self.fromName = fromName
self.fromAddress = fromAddress
self.subject = subject
self.message = message
self.recipients = []
self.attachments = []
self.SMTPServer = SMTPServer
def __str__(self):
return self.message
def prepend(self, text):
"""
Prepends a string to the body.
"""
self.message = text + self.message
def append(self, text):
"""
Appends a string to the body.
"""
self.message = self.message + text
def prependFile(self, fileName):
"""
This method prepends the content of a text file before the body of
the message.
One use is to add a common header file in the beginning of the
message.
It can be done severaself.fromAddressl times to prepend different
textfiles in a specific order.
If the file cannot be opened it wil fail silently without telling.
This behavior is chosen so automated mailings will not be stopped by
a missing
header/footer file
"""
try:
file = open(fileName)
self.prepend(file.read())
except:
pass # Just fail silently
def appendFile(self, fileName):
"""
This method appends the content of a text file to the body of the
message.
One use is to add a signature file to the end of the message.
It can be done several times to append different textfiles in a
specific order.
If the file cannot be opened it wil fail silently without telling.
This behavior is chosen so automated mailings will not be stopped by
a missing
header/footer file
"""
try:
file = open(fileName)
self.append(file.read())
except:
pass # Just fail silently
def recipientAppend(self, toName, toAddress):
"""
Adds one more receipient to the message
"""
self.recipients.append({'toName':toName, 'toAddress':toAddress})
def setRecipients(self, recipients=[]):
self.recipients = recipients
def attachmentAppend(self, fileName):
"""
Appends an attachment to the message. It is automatically converted
to a mime type.
"""
self.attachments.append(fileName)
def send(self):
"""
This sends the message.
"""
tempFileName = tempfile.mktemp()
tempFile = open(tempFileName,'wb')
message = MimeWriter.MimeWriter(tempFile)
message.addheader("From", self.fromAddress)
recipientList = []
for recipient in self.recipients:
recipientList.append(recipient['toAddress'])
adressList = string.join(recipientList, '; ')
message.addheader("To", adressList)
message.addheader("Subject", self.subject)
message.flushheaders()
if len(self.attachments) == 0:
fp = message.startbody('text/plain')
fp.write(self.message)
else:
message.startmultipartbody('mixed')
submessage = message.nextpart()
fp = submessage.startbody('text/plain')
fp.write(self.message)
for attachFile in self.attachments:
# encodes the attached files
if type(attachFile) == types.StringType:
fileName = attachFile
filePath = attachFile
elif type(attachFile) == types.TupleType and len(attachFile)
== 2:
filePath,fileName = attachFile
else:
raise "Attachments Error: must be pathname string or
path,filename tuple"
submessage = message.nextpart()
submessage.addheader("Content-Disposition", "attachment;
filename=%s" % fileName)
ctype,prog = mimetypes.guess_type(fileName)
if ctype == None:
ctype = 'unknown/unknown'
if ctype == 'text/plain':
enctype = 'quoted-printable'
else:
enctype = 'base64'
submessage.addheader("Content-Transfer-Encoding",enctype)
fp = submessage.startbody(ctype)
afp = open(filePath,'rb')
mimetools.encode(afp,fp,enctype)
message.lastpart()
tempFile.close()
# properly formatted mime message should be in tmp file
tempFile = open(tempFileName,'rb')
msg = tempFile.read()
tempFile.close()
os.remove(tempFileName)
try:
server = smtplib.SMTP(self.SMTPServer)
server.sendmail(self.fromAddress, recipientList, msg)
finally:
server.quit()
## def save(self, fileName):
## """
## Saves the message to a file. Including attachements and
pre/appended files.
## """
## file = open(fileName, 'w')
## file.write(str(self))
##myMsg = mxmMail('Max M', 'maxm at normik.dk', 'Here is the file you
requested', 'Just open the attached filed', 'mail.somewhere.dk')
##myMsg.prependFile('C:/root/desktop/head.txt')
##myMsg.appendFile('C:/root/desktop/sig.txt')
##myMsg.recipientAppend('Some Dude', 'maxmcorp at worldonline.dk')
##myMsg.recipientAppend('Max M', 'maxm at normik.dk')
##
##myMsg.attachmentAppend('c:/temp/file.zip')
###myMsg.attachmentAppend('C:/root/temp/cdiaz1.jpg')
###myMsg.setRecipients([{'toName':'fghdfg',
'toAddress':'fghdfg at slkdhf.com'}, {'toName':'xcvxcv',
'toAddress':'xcvxcv at cvxv.dk'}])
##
##myMsg.send()
##
###myMsg.save('C:/root/desktop/saved.txt')
##
##print myMsg
##
##print "done"
More information about the Python-list
mailing list