Creating e-mail templates in Odoo

In this tutorial I will teach you how to create e-mail templates in Odoo. You will learn how to create e-mail templates in XML and how to add them to the available templates. An example of the result after this tutorial:
E-mail templates example
In this tutorial I will create a new e-mail template to congratulate you on creating your own e-mail template and I will show you how to parse data from the current record in to the template with Jinja2.

1. Adding the dependencies

The first thing that you need to do is add a dependency to other modules that you’ll need. Open up the __manifest.py__ file (or __openerp__.py on Odoo 8 and 9) and find the line ‘depends’. In this list you should add all the modules that you need in your custom developed module. If you want to create a new e-mail template you will need to inherit the mail module in this list. Without this inherit you won’t be able to create your own e-mail templates as Odoo wouldn’t recognize the model. In this tutorial I will create an e-mail template that can be used on the contacts form so you’ll also need the contacts module for this tutorial. Go ahead and add them both in, the result should look like this:

Now save the file and close it, it is time to create the template itself!

2. Creating the e-mail template

Now that you have the correct dependencies it is time to create the e-mail template itself. In Odoo e-mail templates are build in XML and the moment that you would send the e-mail template to somebody the Jinja2 will render your e-mail and fill it up with the corresponding data.
Create yourself a new XML file and add the default tags in the file. Since we’re creating an e-mail template we should use the noupdate=”1″ tag though. So, why do we use this tag? If you wouldn’t use it the e-mail template would be updated (and overridden) every time that you would update the module, which would result in you losing data if you’ve changed something. Your XML file should now look like this:

The next step is to create a new XML record. Just have a look at the following code and try to understand it, I will explain every line in detail under the code.

So, what exactly does this do? The very first line, which holds the record id and record model are very important. Every e-mail template that you ever want to create should be to the model ‘mail.template’. This is where all e-mail templates are saved and you should add yours there too. Now, let us go over it line by the line.

  • The ‘name’ field: This gives your e-mail template a name, which is also shown if you look at all templates under Settings > Technical > Email > Templates.
  • The ’email_from’ field: This will show the e-mail from which this e-mail is sent. This is where Odoo gets interesting! You can use ${} to get data from a record and to use this for filling in the data automatically with Jinja2. I’ll get into detail about this later on in this tutorial (see chapter 3).
  • The ‘subject’ field: This will be the title of the e-mail that is being sent to the user.
  • The ’email_to’ field: This will contain the email address to who the e-mail should be sent.
  • The ‘lang’ field: This field will make sure that the e-mail is being sent in the correct language. This field in combination with translations can be used to create multi-language e-mail templates.
  • The ‘model_id’ field: This field will tell your e-mail template on which model it will be used and where it should get data from. It always starts with ‘model_’ and should then contain the model name. It is important to replace the dots in a model name by underscores. So the model ‘res.partner’ should become ‘res_partner’.
  • The ‘auto_delete’ field: If this field is set to true it will permanently delete the e-mail after sending it, if the field is set to false the e-mail will be kept in Odoo.
  • The ‘body_html’ field: This is where you can design the content of the e-mail. You can use HTML and Jinja2 variables in this part too so you can style the template and pre-fill data before it is being sent. All the content that contains HTML or variables should be within CDATA Click here for more information about CDATA.

There, you now have a functioning e-mail template! Finally we should add some content in it. An example:

That is all, you’ve just created your very first e-mail template! Your template should now look like this:

After saving this file and installing the module you will have the e-mail template available. If you’d like to know what exactly ${} does and how you can use Jinja2 to automatically fill in data just continue reading! If you already know this or don’t want to know you can go to chapter 4.

3. Using jinja2 variables for parsing e-mail templates

Odoo e-mail templates come with jinja2 by default. This means that you can access any value on a record and fill it in on the e-mail automatically. Let us go back to the code from the e-mail template we just made. In the subject field we had the following code:

What exactly does this do? By calling ${} Jinja2 knows that this part of the XML should be parsed. By default ‘object’ will be able to access all values from the existing model, which is in this tutorial the model ‘res.partner’. If we would send out this e-mail template from a contact named ‘Administrator’ the subject would become “Congratz Administrator”:
Example rendered e-mail template

If you would want to get the contact his language for example you can access it by simply doing:

If you’d want to get the value from another model that is connected to ‘res.partner’ (many2one, many2many fields) you can also access the value too:

If you would like to go even further and create dynamic e-mail templates you can do this too. For example if you would only want to send a part of the text if the contact has a website you could do this:

In this example this part of the text would only be added to the e-mail if the contact has a website filled in on his form.
As you can see Jinja2 has quite some options and you can go a lot further. If you’d like to learn more you can find more information about Jinja2 and how it works on their website.

4. Conclusion

Creating e-mail templates in Odoo is quite easy and only requires you to write some XML. There are a lot of abilities for e-mail templates such as if/else statements, content parsing, dynamic content and so on thanks to Jinja2.
While creating e-mail templates is quite easy in Odoo it can get rather complex if you would like to use multiple if statements or dynamic content. It is always wise to test your e-mail templates in detail before placing it in production.

Do you want to try the demo code and see the source code of this tutorial? You can view it on my Github account.
Has this tutorial helped you, do you have any feedback or questions? Post away!




PayPal

6 thoughts on “Creating e-mail templates in Odoo

  1. P.V.Anthony says:

    I need to modify my email template to include the following.
    “This email is copied to the following:
    [odoo followers of document]”

    May I know how to do it?

    Thank you very much for the tutorial. It has been very useful and informative.

    • Yenthe666 says:

      Hi Anthony,

      You can do this by simply adding it in the template, something like this: {object.follower_ids.name}.

  2. P.V.Anthony says:

    One more thing I needed to know is about the paypal button in the email.

    Once the customer clicks on the email paypal button and completes the payment, will odoo be updated with the successful payment? Or do we have to do it manually.

    Does the PayPal IPN work like in the odoo e-commerce also for the email button?

    • Yenthe666 says:

      Hi Anothony,

      First of all, sorry for the delay, I’m a bit behind on the comments. I believe you’d have to handle the validation of your PayPal payments yourself. The payment will be handled by PayPal and will work fine but the feedback to Odoo and the processes that change in Odoo is something you’d have to do yourself. Have a look at the existing examples in Odoo. 😉

Leave a Reply

Your email address will not be published. Required fields are marked *