diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index d0903fd2d407fae74573b6cbb18c5802e8e34663..f6a48dcd4b07f8587d073709cc5c554b0dcd85ed 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -350,6 +350,7 @@ class MailComposer(models.TransientModel):
             - normal mode: return rendered values
             /!\ for x2many field, this onchange return command instead of ids
         """
+        attachment_ids = []
         if template_id and composition_mode == 'mass_mail':
             template = self.env['mail.template'].browse(template_id)
             fields = ['subject', 'body_html', 'email_from', 'reply_to', 'mail_server_id']
@@ -375,7 +376,7 @@ class MailComposer(models.TransientModel):
                     'res_id': 0,
                     'type': 'binary',  # override default_type from context, possibly meant for another model!
                 }
-                values.setdefault('attachment_ids', list()).append(Attachment.create(data_attach).id)
+                attachment_ids.append(Attachment.create(data_attach).id)
         else:
             default_values = self.with_context(default_composition_mode=composition_mode, default_model=model, default_res_id=res_id).default_get(['composition_mode', 'model', 'res_id', 'parent_id', 'partner_ids', 'subject', 'body', 'email_from', 'reply_to', 'attachment_ids', 'mail_server_id'])
             values = dict((key, default_values[key]) for key in ['subject', 'body', 'partner_ids', 'email_from', 'reply_to', 'attachment_ids', 'mail_server_id'] if key in default_values)
@@ -388,6 +389,8 @@ class MailComposer(models.TransientModel):
         # this force the complete replacement of x2many field with
         # command and is compatible with onchange api.v7
         values = self._convert_to_write(values)
+        if attachment_ids:
+            values.update(attachment_ids=[(6, 0, attachment_ids)])
 
         return {'value': values}