diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index 3d5185379ac6f0758199076c9ec548ddf0a3aec3..f474a072c22993ba96157ed929f4f9e6f75eb5e7 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -274,6 +274,12 @@ class mail_mail(osv.Model):
                     except Exception:
                         pass
 
+                # Writing on the mail object may fail (e.g. lock on user) which
+                # would trigger a rollback *after* actually sending the email.
+                # To avoid sending twice the same email, provoke the failure earlier
+                mail.write({'state': 'exception'})
+                mail_sent = False
+
                 # build an RFC2822 email.message.Message object and send it without queuing
                 res = None
                 for email in email_list:
@@ -299,9 +305,6 @@ class mail_mail(osv.Model):
                 if res:
                     mail.write({'state': 'sent', 'message_id': res})
                     mail_sent = True
-                else:
-                    mail.write({'state': 'exception'})
-                    mail_sent = False
 
                 # /!\ can't use mail.state here, as mail.refresh() will cause an error
                 # see revid:odo@openerp.com-20120622152536-42b2s28lvdv3odyr in 6.1