Enviar mail (sin plantilla) desde Odoo 15

Es un ejemplo sencillo de como:

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

- Al hacer click enviar un email sin usar plantilla.

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.

Nos creamos una vista con el código del botón. El fichero lo podemos llamar view_partner_form.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">
<!-- Añade un botón en la cabecera de la vista -->
<xpath expr="//sheet" position="before">
<header>
<button name="fh_send_email" string="Enviar correo" type="object" class="oe_highlight"/>
</header>
</xpath>
</field>
</record>
</data>
</odoo>
Markup

Nos creamos un modelo que podemos llamar models.py y lo depositamos en la carpeta de los modelos :

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

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

def fh_send_email(self):
mail_mail = self.env['mail.mail']

email_to = self.email # your object Mail ID

subject = "Prueba Envio de Correo"
body = """Hola,

desde Odoo. Ignora este mensaje

Atentamente.
"""
mail_id = mail_mail.create({
'email_to': email_to,
'subject': subject,
'body_html': '<pre>%s</pre>' % body,
})

mail_mail.send([mail_id])
Markup

Si quisieramos enviar un adjunto, ponemos el adjunto en este caso en la carpeta static con nombre text.txt y puedes poner :

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

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

def fh_send_email(self):
mail_mail = self.env['mail.mail']

email_to = self.email # your object Mail ID

subject = "Test Send Email"
body = """Hola,

desde Odoo. Ignora este mensaje

Atentamente.
"""

path = Path(__file__).parent
module_path = path.parent
print(module_path)
data_value = open(str(module_path) + "/static/test.txt", 'rb').read()
data_record = base64.encodebytes(data_value)

attachment = {
'name': "test.txt",
'type': 'binary',
'datas': data_record,
'store_fname': data_record,
'create_uid': self.env.uid,
'res_model': self._name,
'res_id': self.id,
'mimetype': 'text/csv',
}

attachment_id = self.env['ir.attachment'].create(attachment)

mail_id = mail_mail.create({
'email_to': email_to,
'subject': subject,
'body_html': '<pre>%s</pre>' % body,
'attachment_ids':(4, attachment_id.id)
})

mail_mail.send([mail_id])

Si quieres enviar el mail con formato HTML basta con que cambies el body y pongas por ejemplo:

body = """
<h1>Buenos días</h1>

<p>Este es un mensaje de <b>prueba</b></p>

<p>Gracias
<b>Flash</b> Team.</p>
"""
Markup