Enviar email (con plantilla) desde un botón de Odoo 14

Es un ejemplo sencillo de como:

- Poner un botón en el formulario de contactos.

- Al hacer click enviar un email ya estandarizado usando mail.template.

Antes de empezar asegurate de que:

- Tienes configurado el correo de salida y te funciona.

- Mira cada cuanto tiempo se enviarn los mails en Odoo (normalmente es una hora... pero para pruebas bájalo a 1 minuto en Técnico/Acciones planificadas.

El ejemplo completo te lo puedes bajar de: https://github.com/FoxOdoo/example_send_email/archive/refs/heads/main.zip

Una vez instalado, te vas a un contactos y entras en unos de ellos  y verás un magnifico botón nuevo para enviar tu email

Nos creamos una vista con el código del botón. El fichero lo podemos llamar views.xml y lo depositamos en carpeta views :

<odoo>
<data>
<record id="send_mail_partner_form_inherit" model="ir.ui.view">
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<!-- Add a header with button to the existing view -->
<xpath expr="//sheet" position="before">
<header>
<button name="send_mail_template" string="Enviar e-mail" type="object" class="oe_highlight"/>
</header>
</xpath>
</field>
</record>
</data>
</odoo>
Markup

Nos creamos la plantilla del correo que vamos a enviar:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="example_email_template" model="mail.template">
<field name="name">Example e-mail template</field>
<field name="email_from">${object.company_id and object.company_id.email or ''}</field>
<field name="subject">Saludos ${object.name}</field>
<field name="email_to">${object.email|safe}</field>
<field name="lang">${object.lang}</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="auto_delete" eval="True"/>
<field name="body_html">
<![CDATA[
<p>Estimado ${(object.name)},<br/><br/>
Impresionante. Has creado la primera plantilla de correo!<br/></p>
Saludos,<br/>
${(object.company_id.name)}
]]>
</field>
</record>
</data>
</odoo>
Markup
Nos creamos el modelo que realiza la acción:

# -*- encoding: utf-8 -*-
from odoo import models, fields, api

class res_partner(models.Model):
_inherit = 'res.partner'

def send_mail_template(self):
# Busca la plantilla del correo
template = self.env.ref('send_email.example_email_template')
# También puedes usar algo como esto:
# template = self.env['ir.model.data'].get_object('mail_template_demo', 'example_email_template')
# Envias el correo
self.env['mail.template'].browse(template.id).send_mail(self.id)