Pièces jointes externes dans Odoo

Automatiser l’envoi de documents PDF dans vos emails métiers
14 mai 2025 par
Pièces jointes externes dans Odoo
AUGURIA, Cyrille de LAMBERT

Actualités Auguria

Objectif

Permettre à un module Odoo d’envoyer automatiquement un e-mail à un client en y joignant des pièces jointes externes, comme une étiquette PDF générée par Sendcloud, dans le cadre d’un processus métier. Cela peut concerner un ticket Helpdesk, une commande client, une livraison ou encore une facture.

Cas d’usage

Quelques exemples concrets d’intégration documentaire automatisée :

  • Retour produit via un ticket Helpdesk : envoi d’une étiquette de retour
  • Validation d’une commande : envoi de certificats ou documents contractuels
  • Livraison : ajout d’un bon d’intervention ou d’un procès-verbal
  • Facturation : intégration de justificatifs ou attestations à une facture ou un devis

Étapes de mise en œuvre

1. Génération ou récupération du document externe

Le document à joindre peut être obtenu de plusieurs façons :

  • Génération automatique via une action Odoo (ex : impression de rapport)
  • Récupération via une API tierce comme Sendcloud, DocuSign, etc.
  • Création via une tâche planifiée ou une logique personnalisée

Une fois disponible, le document doit être enregistré dans le système comme une pièce jointe (ir.attachment). Il faut veiller à ce que l’attachement dispose des bonnes informations :

label_attachment = self.env['ir.attachment'].create({ 'name': 'etiquette_retour.pdf', 'type': 'binary', 'datas': base64.b64encode(document_bytes), 'res_model': 'stock.picking', # modèle d’origine 'res_id': picking.id, 'mimetype': 'application/pdf', })

Il est indispensable de s’assurer que le champ datas est bien renseigné et contient le fichier encodé.

2. Copie de l’attachement vers l’objet métier cible

Pour rattacher le document à l’objet métier à partir duquel sera envoyé l’e-mail, il convient de créer une copie de l’attachement :

copied_attachment = label_attachment.copy({ 'res_model': self._name, # ex : helpdesk.ticket, sale.order 'res_id': self.id, 'name': f'document_externe_{self.id}.pdf', })

Cette copie permet d’éviter les conflits entre objets différents liés à une même pièce.

3. Envoi de l’e-mail avec injection des pièces jointes

L’envoi du mail s’effectue via un template, en utilisant le paramètre email_values pour forcer l’ajout du fichier :

template.send_mail( self.id, force_send=True, email_values={ 'attachment_ids': [copied_attachment.id] } )

Il faut veiller à ne pas utiliser uniquement le champ report_template dans le modèle, car cela remplacerait les attachment_ids passés dynamiquement.

4. Configuration du template d’e-mail

Le modèle d’e-mail doit être correctement configuré. Un exemple XML ci-dessous illustre un cas d’envoi d’étiquette de retour :

<record id="return_label_email_template" model="mail.template"> <field name="auto_delete" eval="False"/> <field name="model_id" ref="helpdesk.model_helpdesk_ticket"/> <field name="subject">Your return label</field> <field name="email_from">noreply@example.com</field> <field name="body_html" type="html"> <![CDATA[ <p>Hello <t t-out="object.partner_id.name"/>,</p> <p>Please find your documents attached.</p> ]]> </field> </record>

Le champ auto_delete doit impérativement être à False pour éviter la suppression automatique des fichiers après envoi.

Bonnes pratiques

  • Vérifier la présence de datas dans chaque ir.attachment
  • Journaliser systématiquement les créations et envois de pièces jointes (nom, ID, modèle)
  • Toujours passer par une copie d’attachement pour éviter les conflits de modèle
  • Ne pas envoyer l’e-mail si aucune pièce jointe n’est présente

Exemple de log utile :

_logger.info("Attachment %s (%s) ajouté à l’e-mail du modèle %s", attachment.name, attachment.id, self._name)

Extensions possibles

  • Ajout automatique de documents supplémentaires : devis signés, certificats, attestations
  • Création automatique d’une archive ZIP si plusieurs fichiers doivent être envoyés ensemble
  • Ajout d’un bouton manuel pour déclencher l’envoi depuis la fiche Odoo
  • Journalisation des envois dans un modèle dédié (ex : mail.log)

Conclusion

Odoo offre une architecture particulièrement souple pour automatiser les envois de documents par e-mail. En combinant intelligemment les objets ir.attachment, les options du paramètre email_values, et une configuration propre des templates, il est possible de couvrir un grand nombre de cas métiers, sans avoir à développer de modules complexes.

C’est une base technique solide pour toute entreprise souhaitant intégrer ses documents extérieurs dans ses flux Odoo, en limitant les manipulations manuelles et en assurant une traçabilité parfaite des envois.

Pièces jointes externes dans Odoo
AUGURIA, Cyrille de LAMBERT 14 mai 2025
Partager cette publication
Étiquettes
Nos blogs