Massimo, Feel free to stick it in the new version of the book. I'll see if I can't test it over the weekend with your Mail() function. I might even try to make it so you can attach multiple images/files by passing a list of files & what you want to refer to them by in the html? So maybe something like:
attachment1 = dict(f='image1.jpg',cid='image1') attachment2 = dict(f='logo.png',cid='image2') attach_files = [attachment1, attachment2] message = _multipart_email(sender, recipient, subject, message_text, message_html, attach_files) ~Brian On Jul 16, 10:31 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > Thanks Brian. I may include your example in the new book since this is > very useful. > > Massimo > > On Jul 16, 10:27 pm, Brian M <bmere...@gmail.com> wrote: > > > Yes, using web2py's Mail() as you described probably works too. To be > > honest I just didn't bother trying but I suppose your Mail helper is > > likely just using smtplib in the background. The sending part is > > easy, it's building the multi-part MIME message that I suspect has > > been tricky for people. > > > I'll try to get this added to AlterEgo over the weekend. > > > On Jul 16, 9:59 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > This is useful. > > > In principle you could just use: > > > > mail=Mail() > > > mail.send(to..., subject,..., message=message.as_string()) > > > > or am I missing something? > > > Would you post an entry in AlterEgo? > > > > Massimo > > > > On Jul 16, 9:53 pm, Brian M <bmere...@gmail.com> wrote: > > > > > I've found a solution for sending multi-part emails (text & html) and > > > > even embedded images. > > > > > In your controller (or a custom module) > > > > > from email.MIMEMultipart import MIMEMultipart > > > > from email.MIMEText import MIMEText > > > > from email.MIMEImage import MIMEImage > > > > > #helper function to build a multi-part mime email > > > > def _multipart_email(sender, recipient, subject, message_text, > > > > message_html, attach_image): > > > > #Taken fromhttp://code.activestate.com/recipes/473810/withvery > > > > minor changes > > > > > # Define these once; use them twice! > > > > strFrom = sender > > > > strTo = recipient > > > > > # Create the root message and fill in the from, to, and subject > > > > headers > > > > msgRoot = MIMEMultipart('related') > > > > msgRoot['Subject'] = subject > > > > msgRoot['From'] = strFrom > > > > msgRoot['To'] = strTo > > > > msgRoot.preamble = 'This is a multi-part message in MIME format.' > > > > > # Encapsulate the plain and HTML versions of the message body in > > > > an > > > > # 'alternative' part, so message agents can decide which they want > > > > to display. > > > > msgAlternative = MIMEMultipart('alternative') > > > > msgRoot.attach(msgAlternative) > > > > > msgText = MIMEText(message_text) > > > > msgAlternative.attach(msgText) > > > > > # We reference the image in the IMG SRC attribute by the ID we > > > > give it below > > > > msgText = MIMEText(message_html, 'html') > > > > msgAlternative.attach(msgText) > > > > > if attach_image: > > > > # This example assumes the image is in the current directory > > > > or you've passed the full path > > > > fp = open(attach_image, 'rb') > > > > msgImage = MIMEImage(fp.read()) > > > > fp.close() > > > > > #you can refer to this image as <img src="cid:image1"> in your > > > > html message. > > > > # Define the image's ID as referenced above > > > > msgImage.add_header('Content-ID', '<image1>') > > > > msgRoot.attach(msgImage) > > > > return msgRoot > > > > > In your controller: > > > > > #visit this page and you'll get an email > > > > def email(): > > > > host = 'smtp.gmail.com' #your mail server > > > > port = 587 #port if non-standard > > > > username = 'your_username' > > > > password = 'your_password' > > > > > import smtplib > > > > server = smtplib.SMTP(host, port) > > > > server.ehlo() > > > > server.starttls() > > > > server.ehlo() > > > > server.login(username, password) > > > > > context=dict(name='John Doe', ship_date='July 15, > > > > 2009',amount_owed=25.50,num_items=2) > > > > > #use web2py views to get an html and plain text version of the > > > > message > > > > message_html=response.render('default/ > > > > email_template.html',context) #template for the html version > > > > message_text = response.render('default/ > > > > email_template.txt',context) #template for the text only version > > > > > sender = 'y...@notspamming.com' > > > > recipient = 'custo...@host.com' > > > > > subject = "We've shipped your order" > > > > > #build the multi-part MIME message > > > > message = _multipart_email(sender, recipient, subject, > > > > message_text, message_html, 'image.jpg') > > > > > #and send it > > > > server.sendmail(sender, recipient, message.as_string()) > > > > server.quit() > > > > > print message > > > > return dict(status='email > > > > sent',to=recipient,subject=subject,message=message.as_string()) > > > > > Perhaps someone else here can use this and maybe even integrate it > > > > into web2py in a more standard way. > > > > > ~Brian > > > > > On Jul 11, 3:22 am, kralin <andrea.pierle...@gmail.com> wrote: > > > > > > yes, I've already tryed this way, after looking at tools.py > > > > > maybe I'm doing something wrong, I'm going to recheck... > > > > > > thanks > > > > > > On 11 Lug, 00:46, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > > > > import smtplib > > > > > > server = smtplib.SMTP(host, port) > > > > > > server.ehlo() > > > > > > server.starttls() > > > > > > server.ehlo() > > > > > > server.login(username, password) > > > > > > server.sendmail(sender, to, msg) > > > > > > server.quit() > > > > > > > look into the docs for datils. Mind that the docs say .ehlo and > > > > > > .helo > > > > > > are the same. They are not. The latter does not work with starttls > > > > > > > On Jul 10, 4:46 pm, kralin <andrea.pierle...@gmail.com> wrote: > > > > > > > > ok, so smtplib should work instead of Mail? > > > > > > > > On 10 Lug, 23:39, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > > > > > > Here is the problem. The current implementation of Mail is > > > > > > > > designed to > > > > > > > > be cross platform, i.e. work on GAE. It has the same API as GAE. > > > > > > > > Unless we figure out how to send MIMEemailmessages on GAE, if > > > > > > > > you > > > > > > > > want to send MIME you should not use Mail native SMTP. > > > > > > > > > On Jul 10, 4:31 pm, kralin <andrea.pierle...@gmail.com> wrote: > > > > > > > > > > I've also tried to use MIME to encode both thehtml, and an > > > > > > > > > alternative text/htmlmessage, however all the encoding goes > > > > > > > > > after > > > > > > > > > the double newline > > > > > > > > > and is not interpreted as an header. > > > > > > > > > > so Yarko are you saying that by doing send(message='hello > > > > > > > > > message') > > > > > > > > > instead of send(to=['....@me.com'], message='hello message') > > > > > > > > > it should worrk by including the correct headers in the > > > > > > > > > message? > > > > > > > > > > On 10 Lug, 22:15, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > > > > > > > > While this can be and something like this can be added it > > > > > > > > > > is my > > > > > > > > > > understanding that you do not need to change the header to > > > > > > > > > > sendhtml > > > > > > > > > > emails. You need to use the MIME encoding and that should be > > > > > > > > > > transparent to what mail.send does now. If I am wrong > > > > > > > > > > please provide > > > > > > > > > > an example of how to change the headers to send a MIME > > > > > > > > > > encoded > > > > > > > > > > message. > > > > > > > > > > > On Jul 10, 1:31 pm, kralin <andrea.pierle...@gmail.com> > > > > > > > > > > wrote: > > > > > > > > > > > > I spent the whole afternoon trying to send > > > > > > > > > > > anHTMLformattedemail > > > > > > > > > > > with web2py. > > > > > > > > > > > while I cannote use smtplib directly, cause it seems not > > > > > > > > > > > to work, and > > > > > > > > > > > I think this should be "normal" in the framework. > > > > > > > > > > > however in the current release (Version 1.65.0 > > > > > > > > > > > (2009-07-01 12:16:25)) > > > > > > > > > > > it is not possible to alter the content-type, or any > > > > > > > > > > > other header for > > > > > > > > > > > theemailusing the gluon.tools.Mail class. > > > > > > > > > > > this happens because anu message that is passed to the > > > > > > > > > > > mail=Mail() > > > > > > > > > > > object is attached to this string before beeing sent: > > > > > > > > > > > > msg = '''From: %s\r > > > > > > > > > > > To: %s\r > > > > > > > > > > > Subject: %s\r > > > > > > > > > > > \r > > > > > > > > > > > %s'''\ > > > > > > > > > > > > and the double newlines close the headers. > > > > > > > > > > > > so it would be very useful to also set at least something > > > > > > > > > > > link this: > > > > > > > > > > > > def send( > > > > > > > > > > > self, > > > > > > > > > > > to, > > > > > > > > > > > subject='None', > > > > > > > > > > > message='None', > > > > > > > > > > > headers='\r\n' > > > > > > > > > > > ): > > > > > > > > > > > > msg = '''From: %s\r > > > > > > > > > > > To: %s\r > > > > > > > > > > > Subject: %s\r > > > > > > > > > > > \r > > > > > > > > > > > %s'''\ > > > > > > > > > > > % (self.settings.sender, ', > > > > > > > > > > > '.join(to), > > > > > > > > > > > subject,headers, > > > > > > > > > > > message) > > > > > > > > > > > > so that it will be possible to pass directly some header > > > > > > > > > > > strings or > > > > > > > > > > > pass an empty string as headers, and put them in the > > > > > > > > > > > message. > > > > > > > > > > > this way they can be correctly recognized. > > > > > > > > > > > > hope this helps > > > > > > > > > > > cheers > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---