[IMP] mail: avoid sending an email twice

In some specific conditions (e.g. admin logging during cron run, concurrent update), writing on the mail object may fail, triggering a rollback of the transaction.
As the write was done after the SMTP sendmail action, an email could be sent twice (state not correctly put, would be retried at next process of the email queue).
This patch provoke the error before the sendmail action and thus avoids sending the email.
Fixes #552
This commit is contained in:
Martin Trigaux 2014-09-22 17:48:11 +02:00
parent c6290988ce
commit 506e397e4a
1 changed files with 6 additions and 3 deletions

View File

@ -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