Email attachments
Max M
maxm at mxm.dk
Wed Jan 24 14:52:06 EST 2007
Steve Holden skrev:
> I'm having some trouble getting attachments right for all recipients,
> and it seems like Apple's mail.app is the pickiest client at the moment.
> It doesn't handle attachments that both Thunderbird and Outlook find
> perfectly acceptable.
>
> Since the code I'm using is currently ugly and embedded, before I trim
> it down for posting could anyone who's successfully generated emails
> with attachments received by mail.app let me know if they had any
> problems along the way? Google hasn't given me much on this, but I'm not
> feeling very creative today.
This method is used in one of my Plone products, and there is also a bit
of imap in there. But it is probably simple enough to extract the
attachment relevant parts....
security.declareProtected(EDIT_CONTENTS_PERMISSION, 'sendMessage')
def sendMessage(self, to=None, cc=None, bcc=None, inReplyTo=None,
subject=None, body='', attachments=None, mode=None,
folderPath=None, uid=None, REQUEST=None):
"Sends a message"
site_encoding = self._site_encoding()
##################
# Create the message
msg = Message()
msg.set_payload(body, site_encoding)
#####################################
# if attachment, convert to multipart
# file fields are posted even if empty, so we need to remove
those :-s
if attachments is None:
attachments = []
attachments = [a for a in attachments if a]
if attachments or (mode == 'Forward'):
mimeMsg = MIMEMultipart()
mimeMsg.attach(msg)
# If mode is Forward we get original message as attachment
if mode == 'Forward' and folderPath and uid:
original = self.fetchMessageFromPath(folderPath, uid)
mimeMsg.attach(original)
for attachment in attachments:
# Add the attachment
tmp = email.message_from_string(str(attachment.headers))
filename = tmp.get_param('filename', 'Attachment',
'Content-Disposition')
# clean up IE paths
filename = filename[max(filename.rfind('/'),
filename.rfind('\\'),
filename.rfind(':')
)+1:]
contentType = tmp['Content-Type']
attach_part = Message()
attach_part.add_header('Content-Type', contentType,
name=filename)
attach_part.add_header('Content-Disposition',
'attachment', filename=filename)
attach_part.set_payload(attachment.read())
Encoders.encode_base64(attach_part)
mimeMsg.attach(attach_part)
msg = mimeMsg
########################
# set headers on message
from_ = self.getEmail()
msg['From'] = from_
msg['Reply-To'] = from_
if to: msg['To'] = to
if cc: msg['Cc'] = cc
if bcc: msg['Bcc'] = bcc
msg['Date'] = self.ZopeTime().rfc822() # needed by some servers
if inReplyTo:
msg['In-Reply-To'] = inReplyTo
msg['Subject'] = Header(subject, site_encoding)
##################
# Send the message
SMTPserver = self._mailhost()
outbox = smtplib.SMTP(SMTPserver)
try:
cleaner = lambda adresses: [adress.strip() for adress in
adresses.split(',') if adress.strip()]
all_receivers = cleaner(to) + cleaner(cc) + cleaner(bcc)
outbox.sendmail(from_, all_receivers, msg.as_string())
success = 1
except:
success = 0
######################################
# append the message to the 'Sent' box
if success:
Sent = self.getSentboxName()
connection = self.getConnection()
try:
connection.append(Sent, msg.as_string(), ('\\Seen',))
except:
# we don't want to not send messages just because the
sentbox isn't set correctly
pass
#################################
# returns a portal status message
if REQUEST:
if success:
message = 'Succes! The message was sent '
else:
message = 'Error! The message could not be sent'
REQUEST.RESPONSE.redirect(self.absolute_url() +
'/mxmImapClient_compose?portal_status_message=%s' % message)
--
hilsen/regards Max M, Denmark
http://www.mxm.dk/
IT's Mad Science
More information about the Python-list
mailing list