bulk email: parse html2text only once and autocommit on many writes

This commit is contained in:
Rushabh Mehta 2012-09-24 13:09:06 +05:30
parent f354c667d4
commit 847d36408e
2 changed files with 18 additions and 7 deletions

View file

@ -80,14 +80,21 @@ def send(recipients=None, sender=None, doctype='Profile', email_field='email', f
sender = webnotes.conn.get_value('Email Settings', None, 'auto_mail_id')
check_bulk_limit(len(recipients))
from webnotes.utils.email_lib.html2text import html2text
try:
text_content = html2text(html)
except HTMLParser.HTMLParseError:
text_content = "[See html attachment]"
for r in recipients:
rdata = webnotes.conn.sql("""select * from `tab%s` where %s=%s""" % (doctype,
email_field, '%s'), r, as_dict=1)
if not is_unsubscribed(rdata):
# add to queue
add(r, sender, subject, add_unsubscribe_link(r))
add(r, sender, subject, add_unsubscribe_link(r), text_content)
def add(email, sender, subject, message):
def add(email, sender, subject, message, text_content = None):
"""add to bulk mail queue"""
from webnotes.model.doc import Document
from webnotes.utils.email_lib.smtp import get_email
@ -95,7 +102,8 @@ def add(email, sender, subject, message):
e = Document('Bulk Email')
e.sender = sender
e.recipient = email
e.message = get_email(email, sender=e.sender, msg=message, subject=subject).as_string()
e.message = get_email(email, sender=e.sender, msg=message, subject=subject,
text_content = text_content).as_string()
e.status = 'Not Sent'
e.save()

View file

@ -31,12 +31,12 @@ import conf
from webnotes import msgprint
import email
def get_email(recipients, sender='', msg='', subject='[No Subject]'):
def get_email(recipients, sender='', msg='', subject='[No Subject]', text_content = None):
"""send an html email as multipart with attachments and all"""
email = EMail(sender, recipients, subject)
if (not '<br>' in msg) and (not '<p>' in msg) and (not '<div' in msg):
msg = msg.replace('\n', '<br>')
email.set_html(msg)
email.set_html(msg, text_content)
return email
@ -77,7 +77,7 @@ class EMail:
part = MIMEText(message.encode('utf-8'), 'plain', 'utf-8')
self.msg_multipart.attach(part)
def set_html(self, message):
def set_html(self, message, text_content = None):
"""Attach message in the html portion of multipart/alternative"""
from email.mime.text import MIMEText
@ -86,7 +86,10 @@ class EMail:
# this is the first html part of a multi-part message,
# convert to text well
if not self.html_set:
self.set_html_text(message)
if text_content:
self.set_text(text_content)
else:
self.set_html_text(message)
part = MIMEText(message.encode('utf-8'), 'html', 'utf-8')
self.msg_multipart.attach(part)