Das E-Mail-Template in XML erstellen
Zuerst definierst du das Aussehen und den Inhalt deiner E-Mail. Für dynamische und strukturierte Inhalte nutzen wir ein QWeb2 Template innerhalb des body_html-Feldes deines mail.template Datensatzes. Dieses Template speicherst du typischerweise in einer XML-Datei in deinem Modul, z.B. unter data/mail_template.xml
<odoo>
<data noupdate="1">
<record id="email_template_custom_notification" model="mail.template">
<field name="name">Benutzerdefinierte Benachrichtigung (QWeb2)</field>
<field name="model_id" ref="dein_modul.model_dein_modell"/>
<field name="subject">Ihre Anfrage wurde erfolgreich bearbeitet! (#{{ object.name }})</field>
<field name="email_to">{{ object.partner_id.email }}</field>
<field name="body_html" type="html">
<![CDATA[
<div style="font-family: 'Arial', sans-serif; font-size: 14px;">
<p>Sehr geehrte/r <t t-out="object.partner_id.name or 'Kunde'"/>,</p>
<p>
Vielen Dank für Ihre Bestellung/Anfrage <strong>#<t t-out="object.name"/></strong>.
Sie wurde erfolgreich verarbeitet und wird nun weiter bearbeitet.
</p>
<t t-if="object.details_available">
<h3>Details Ihrer Anfrage:</h3>
<ul>
<li>Referenz: <t t-out="object.reference_number"/></li>
<li>Betrag: <t t-out="object.amount" t-options='{"widget": "monetary", "display_currency": object.currency_id}'/></li>
</ul>
</t>
<p>
Bei Fragen kontaktieren Sie uns gerne.
</p>
<p>Mit freundlichen Grüßen,</p>
<p>Ihr Team</p>
</div>
]]>
</field>
<field name="auto_delete" eval="True"/>
</record>
</data>
</odoo>
Den Versand im Python-Code auslösen
Nun benötigst du den Python-Code, der den E-Mail-Versand basierend auf einem Ereignis in deinem Odoo-Modul auslöst. Dies geschieht in einer Methode deines Modells (z.B. bei einem Statuswechsel).
from odoo import api, fields, models
class DeinModell(models.Model):
_name = 'dein_modul.dein_modell'
_description = 'Ein benutzerdefiniertes Odoo-Modell'
name = fields.Char(string="Referenz")
partner_id = fields.Many2one('res.partner', string="Kunde")
status = fields.Selection([('draft', 'Entwurf'), ('done', 'Erledigt')], default='draft')
details_available = fields.Boolean(string="Details vorhanden", default=False)
reference_number = fields.Char(string="Interne Referenz")
amount = fields.Monetary(string="Betrag")
currency_id = fields.Many2one('res.currency', string="Währung", default=lambda self: self.env.company.currency_id)
def action_send_notification_mail(self):
"""Versendet die E-Mail, z.B. sobald der Status auf 'done' gesetzt wird."""
# Hole die ID des E-Mail-Templates
template = self.env.ref('dein_modul.email_template_custom_notification')
# Die E-Mail pro Record in der Recordset (self) versenden
for record in self:
if record.status == 'done' and record.partner_id.email: # Sicherstellen, dass eine E-Mail-Adresse existiert
try:
# Sende das Template. Der Record wird als Kontextobjekt übergeben (object)
template.send_mail(
record.id,
force_send=True, # E-Mail sofort versenden, nicht in der Queue lassen
raise_exception=True # Exception werfen, falls etwas schief geht
)
except Exception as e:
record.message_post(body=f"Fehler beim Senden der E-Mail an {record.partner_id.email}: {e}")
self.env.cr.rollback() # Optional: Rollback bei Fehler
return True
Fazit: Die volle Macht der Odoo E-Mail-Automatisierung
Die Kombination aus einem dedizierten QWeb2-Template in XML und dem Aufruf per Python-Code ist die Best Practice in Odoo, insbesondere wenn du:
-
Komplexe Layouts oder dynamische Inhalte basierend auf Geschäftslogik benötigst.
-
Odoo-Widgets zur korrekten Formatierung von Daten (z.B. Datumsangaben, Währungen) nutzen möchtest.
-
Übersichtlichkeit im Code beibehalten und das E-Mail-Design von der Versandlogik trennen willst.
Mit QWeb2 hast du die volle Kontrolle über den E-Mail-Inhalt und kannst ansprechende, datengesteuerte Nachrichten direkt aus deinem Odoo-System versenden.
