Enviar E-mail desde un wizard basado en plantilla 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 asegúrate 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_wizard.

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="action_send_email" 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>
<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><t t-out="object.company_id.name"/></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 action_send_email(self): ''' Esta función abre una ventana para escribir un email, con la plantilla por defecto. ''' self.ensure_one() ir_model_data = self.env['ir.model.data'] try: template_id = \ ir_model_data.check_object_reference('send_email_wizard', 'example_email_template')[1] except ValueError: template_id = False try: compose_form_id = ir_model_data.check_object_reference('mail', 'email_compose_message_wizard_form')[1] except ValueError: compose_form_id = False ctx = { 'default_model': 'res.partner', 'default_res_id': self.ids[0], 'default_use_template': bool(template_id), 'default_template_id': template_id, 'default_composition_mode': 'comment', } return { 'name': ('Compose Email'), 'type': 'ir.actions.act_window', 'view_mode': 'form', 'res_model': 'mail.compose.message', 'views': [(compose_form_id, 'form')], 'view_id': compose_form_id, 'target': 'new', 'context': ctx, }