Enviar email (con plantilla) desde un botón en odoo 15

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.

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.

El módulo tienes que llamarlo send_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">Ejemplo de e-mail template</field>
<field name="email_from">"{{ object.company_id.name }}" &lt;{{ (object.company_id.email or user.email) }}&gt;</field>
<field name="subject">Saludos</field>
<field name="email_to">{{ object.email_formatted }}</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 <strong t-out="object.name or ''" />,<br/><br/>
Buen trabajo acabas de crear tu primera plantilla de email<br/><br/>
Saludos,<br/>
<p><strong>Mi empresa</strong></p>.
]]>
</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)