Finding and sending e-mail templates in Odoo

In this tutorial I will teach you how to send e-mail templates in Odoo from the Python code. You’ll learn how to find e-mail templates, how to call them and how to send them to the user. In this tutorial I will continue with the e-mail template that I’ve made in my other tutorial, which you can find here. We’ll create a ‘send e-mail’ button on the contact form and after clicking on this button we will send out the e-mail template.
The result after this tutorial:
Example result e-mail templates

If you just want to follow this tutorial please download and install the sample module from my previous tutorial. You can find the module here.
If you’d like to send out your own e-mail template you can continue reading without using the sample module.

Updated tutorial available on Oocademy

1. Create the send e-mail button

First of all we have to add a button to the existing view. Create a new XML file and inherit the existing contact form:

Now that we’ve inherited the view we should create an xpath in the view in order to add in the button on the form. Write an xpath expression that inserts content before the ‘sheet’ of the form, wrap it in header tags and add a button:

So, what does this code do? It will inherit the existing contact form and will add a button at the top of the form. If you’d install this module right now you would get this as a result:
Contact form example

Now have a closer look at the XML code for the button:

This button will be named ‘send_mail_template’, has the text ‘Send e-mail’ on it and is of the type object. The type ‘object’ tells Odoo that we want to trigger Python code after clicking on the button.

2. Catch the button click

Now that you’ve created the view (XML) side it is time to code the Python side. First of all create a new Python file, create a class in it and inherit the ‘res.partner’ model. Why? Because we will need to execute Python code on the ‘res.partner’ model. Without this inheritance Odoo will not know where to execute our code. Your code should look like this:

Now that you’ve inherited the model ‘res.partner’ we have to add a function that goes off when the user clicks on the button ‘send e-mail’.
The name of your function should be the same as the name of your button because Odoo uses this to execute the Python code. Go ahead and create a function named ‘send_mail_template’:

3. Finding and sending e-mail templates

The final step is to find the e-mail template and send it to the end user.
To find the template you should use self.env.ref to search the template in the database. In this tutorial I’m looking for the e-mail template with the name ‘example_email_template’, which is in the module ‘mail_template_demo’:

It is important to first name the module where the template is in followed by a dot (.) and then the name of the e-mail template. Otherwise Odoo will not find your template.
As a result we will get the variable which contains the link to our e-mail template. Because we only have a ‘pointer’ to this e-mail template we should still find the record itself in the database and trigger the function ‘send_mail’ to push the e-mail out. Your code should look like this:

The self.env will make sure we’re searching on the model ‘mail.template’ (where all e-mail templates are stored) and with browse it can find the correct template. At this point we have the e-mail template but we still need to render it and ‘push’ it to the user. This is exactly what the function ‘send_mail’ does. Since the function ‘send_mail’ needs to know which record it should get data from (to parse it in the e-mail template with jinja2) we will pass along the ID of the current record with
That’s it! The result of the Python function looks like this:

3.1 The result

You’re all done now! Save all the files, update your modules list and install the module. When you go to the contact form and click on the button ‘Send e-mail’ you’ll see an e-mail in your inbox within a few minutes:
Send e-mail result

4. Conclusion

Finding and sending out e-mail templates in Odoo is actually really easy. It only requires a few lines of Python code and all the rest is handled by Odoo itself.

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!
Tutorial sponsored by Oocademy


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.
Updated tutorial available on Oocademy

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 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!
Tutorial sponsored by Oocademy