Posterous
Daniele is using Posterous to post everything online. Shouldn't you?
Unknown35
 

Daniel’strae

Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

Where is the phpMailer php class equivalent for Python?

vote up 2 vote down
star
1

Hi guys, i'm new with python.. Actually, i'm trying to send featured email with python: html body, text alternative body, and attachment.

So, i've found this tutorial and adapted it with the gmail authentication (tutorial found here)

The code i have atm, is that:

def createhtmlmail (html, text, subject):
"""Create a mime-message that will render HTML in popular
  MUAs, text in better ones"""

import MimeWriter
import mimetools
import cStringIO
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os

out = cStringIO.StringIO() # output buffer for our message
htmlin
= cStringIO.StringIO(html)
txtin
= cStringIO.StringIO(text)

writer
= MimeWriter.MimeWriter(out)
#
# set up some basic headers... we put subject here
# because smtplib.sendmail expects it to be in the
# message body
#
writer
.addheader("Subject", subject)
writer
.addheader("MIME-Version", "1.0")
#
# start the multipart section of the message
# multipart/alternative seems to work better
# on some MUAs than multipart/mixed
#
writer
.startmultipartbody("alternative")
writer
.flushheaders()
#
# the plain text section
#
subpart
= writer.nextpart()
subpart
.addheader("Content-Transfer-Encoding", "quoted-printable")
pout
= subpart.startbody("text/plain", [("charset", 'us-ascii')])
mimetools
.encode(txtin, pout, 'quoted-printable')
txtin
.close()
#
# start the html subpart of the message
#
subpart
= writer.nextpart()
subpart
.addheader("Content-Transfer-Encoding", "quoted-printable")
#
# returns us a file-ish object we can write to
#
pout
= subpart.startbody("text/html", [("charset", 'us-ascii')])
mimetools
.encode(htmlin, pout, 'quoted-printable')
htmlin
.close()


#
# Now that we're done, close our writer and
# return the message body
#
writer
.lastpart()
msg
= out.getvalue()
out.close()
return msg

import smtplib
f
= open("/path/to/html/version.html", 'r')
html
= f.read()
f
.close()
f
= open("/path/to/txt/version.txt", 'r')
text
= f.read()
subject
= "Prova email html da python, con allegato!"
message
= createhtmlmail(html, text, subject)
gmail_user
= "thegmailaccount@gmail.com"
gmail_pwd
= "thegmailpassword"
server
= smtplib.SMTP("smtp.gmail.com", 587)
server
.ehlo()
server
.starttls()
server
.ehlo()
server
.login(gmail_user, gmail_pwd)
server
.sendmail(gmail_user, "example@example.com", message)
server
.close()

and that works.. now only miss the attachment.. And i am not able to add the attachment (from this post)

So, why there is not a python class like phpMailer for php? Is it because, for a medium-able python programmer sending a html email with attachment and alt text body is so easy that a class is not needed? Or is because i just didn't find it?

If i'll be able to wrote a class like that, when i'll be enough good with python, would that be useful for someone?

S.Lott
41.7k328104
asked Apr 30 at 14:48
DaNieL
4189

4 Answers

vote up 4 vote down
check

If you can excuse some blatant self promotion, I wrote a mailer module that makes sending email with Python fairly simple. No dependencies other than the Python smtplib and email libraries.

Here's a simple example for sending an email with an attachment:

from mailer import Mailer
from mailer import Message

message
= Message(From="me@example.com",
                 
To=["you@example.com", "him@example.com"])
message
.Subject = "Kitty with dynamite"
message
.Body = """Kitty go boom!"""
message
.attach("kitty.jpg")

sender
= Mailer('smtp.example.com')
sender
.login("username", "password")
sender
.send(message)

Edit: Here's an example of sending an HTML email with alternate text. :)

from mailer import Mailer
from mailer import Message

message
= Message(From="me@example.com",
                 
To="you@example.com",
                  charset
="utf-8")
message
.Subject = "An HTML Email"
message
.Html = """This email uses <strong>HTML</strong>!"""
message
.Body = """This is alternate text."""

sender
= Mailer('smtp.example.com')
sender
.send(message)

Edit 2: Thanks to one of the comments, I've added a new version of mailer to pypi that lets you specify the port in the Mailer class.

answered Apr 30 at 16:56
Ryan Ginstrom
99019

 
 
add in an example of alternate text and you've got a winner! – YHVH Apr 30 at 18:32

Wow, that's great! Does your module allow send mail througt the Gmail smtp? Where should i specify the smtp port (such as server = smtplib.SMTP("smtp.gmail.com", 587) with smtplib) – DaNieL May 4 at 7:50 
 
 
@DaNiel: Very good point, thanks. I've added an updated version that lets you specify the port in the Mailer class (`sender = Mailer('localhost', port=587)') pypi.python.org/pypi/mailer/0.4 – Ryan Ginstrom May 7 at 10:47

Hi Ryan, i tried the 0.4 version with gmail but it raise an error: File "C:\Python26\lib\smtplib.py", line 522, in login raise SMTPException("SMTP AUTH extension not supported by the server") Maybe its becose gmail requires the TLS? – DaNieL May 11 at 7:00 
add comment

vote up 1 vote down
check

Django includes the class you need in core, docs here

from django.core.mail import EmailMultiAlternatives

subject
, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content
= 'This is an important message.'
html_content
= '<p>This is an <strong>important</strong> message.</p>'
msg
= EmailMultiAlternatives(subject, text_content, from_email, [to])
msg
.attach_alternative(html_content, "text/html")
msg
.attach_file('/path/to/file.jpg')
msg
.send()

In my settings I have:

#GMAIL STUFF
EMAIL_USE_TLS
= True
EMAIL_HOST
= 'smtp.gmail.com'
EMAIL_HOST_USER
= 'name@gmail.com'
EMAIL_HOST_PASSWORD
= 'password'
EMAIL_PORT
= 587
answered Apr 30 at 15:22
YHVH
16817


That's what i was looking for! Thanks mate. Last thing: to use that class we must download and install django, obvisiuly.. Cold be fine a class that run without the django framework, but just running the class file (and the natural python modules)) – DaNieL Apr 30 at 15:30 

Fom Stackoverflow.com

Loading mentions Retweet
Filed under  //   Email   Python  
Posted June 5, 2009
// 0 Comments