By blogging about it I can pretty much guarantee that someone will comment and say "Hey, why didn't you use the pypi/alreadyexists package which does the same thing but better". I couldn't find one after a quick search and I felt the hacker mood creeping up on my begging me to (re)invent it. takes a HTML page, finds all CSS blocks and transforms these into style attributes. For example, from this:

    h1, h2 { color:red; }
    strong {

You get this:

    <h1 style="color:red">Hi!</h1>
    <p><strong style="text-decoration:none">Yes!</strong></p>

Why is this useful? When you're writing HTML emails. Like this newsletter app that I'm working on.

I just wrote it late yesterday and it needs lots of work to impress but for the moment it works for me. If I take the time to tidy it up properly I'll turn it into a package. Assuming there isn't one already :)


No available on and as a PyPi package


Two new copy-cats have been released:

  • python-premailer which seems to do the same thing but without lxml (which is sort of the whole point)
  • inline-styler which also uses lxml but I don't know what it does differently or better

Might be worth poking around at these if my premailer isn't good enough.

Walter D√∂rwald - 11 July 2009 [«« Reply to this]
XIST includes a function for doing this. An online version of the CSS inliner is available from
Marius Gedminas - 13 July 2009 [«« Reply to this]
I've been looking for something like this to use as a PyBlosxom plugin to inline styles in the RSS feed. And when I say "looking", I mean "posting a question and waiting for lazyweb to come up with an answer". So, thanks ;-)

What is the licence of your code?
Peter Bengtsson - 13 July 2009 [«« Reply to this]
No licence yet but I'm guessing something very forgiving. I've made a much improved version but haven't uploaded it yet.
I guess I'll stick it on pypi
Lionel Barret - 04 August 2009 [«« Reply to this]
funny I have done the same a few weeks ago. I'll compare with your module if there is anything I can add.
astro - 05 March 2013 [«« Reply to this]
This seems to be exactly what am I looking for. I installed it, but how can I use it? Can you post some instructions or tell us where to find them?
Anonymous - 31 August 2014 [«« Reply to this]
Very nice, thank you.
Alex Hayes - 20 November 2014 [«« Reply to this]
I've created a django template tag that can be used with premailer - see
Peter Bengtsson - 20 November 2014 [«« Reply to this]
That is great!

Your email will never ever be published