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 from http://code.activestate.com/recipes/473810/ with very
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to