[Merge]: merge with lp:~openerp-dev/openobject-server/emails-framework

bzr revid: rha@tinyerp.com-20110317095258-m3hn59zd57x0u92l
This commit is contained in:
Rifakat Haradwala (Open ERP) 2011-03-17 15:22:58 +05:30
commit 9ac5486c9a
1 changed files with 64 additions and 30 deletions

View File

@ -42,6 +42,7 @@ from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.Header import Header
from email.Utils import formatdate, COMMASPACE
from email import Utils
from email import Encoders
from itertools import islice, izip
from lxml import etree
@ -159,7 +160,7 @@ def exec_pg_command(name, *args):
if not prog:
raise Exception('Couldn\'t find %s' % name)
args2 = (prog,) + args
return subprocess.call(args2)
def exec_pg_command_pipe(name, *args):
@ -426,7 +427,40 @@ def generate_tracking_message_id(openobject_id):
"""
return "<%s-openobject-%s@%s>" % (time.time(), openobject_id, socket.gethostname())
def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False, debug=False):
def connect_smtp_server(server_host, server_port, user_name=None, user_password=None, ssl=False, tls=False, debug=False):
"""
Connect SMTP Server and returned the (SMTP) object
"""
smtp_server = None
try:
if ssl:
# In Python 2.6
smtp_server = smtplib.SMTP_SSL(server_host, server_port)
else:
smtp_server = smtplib.SMTP(server_host, server_port)
smtp_server.set_debuglevel(int(bool(debug))) # 0 or 1
if tls:
smtp_server.ehlo()
smtp_server.starttls()
smtp_server.ehlo()
#smtp_server.connect(server_host, server_port)
if smtp_server.has_extn('AUTH') or user_name or user_password:
smtp_server.login(user_name, user_password)
except Exception, error:
_logger.error('Could not connect to smtp server : %s' %(error), exc_info=True)
raise error
return smtp_server
def _email_send(smtp_from, smtp_to_list, message, ssl=False, debug=False,
smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None):
"""Low-level method to send directly a Message through the configured smtp server.
:param smtp_from: RFC-822 envelope FROM (not displayed to recipient)
:param smtp_to_list: RFC-822 envelope RCPT_TOs (not displayed to recipient)
@ -443,11 +477,8 @@ def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False,
def write(self, s):
self.logger.notifyChannel('email_send', loglevels.LOG_DEBUG, s)
if openobject_id:
message['Message-Id'] = generate_tracking_message_id(openobject_id)
try:
smtp_server = config['smtp_server']
smtp_server = smtp_server or config['smtp_server']
if smtp_server.startswith('maildir:/'):
from mailbox import Maildir
@ -456,43 +487,36 @@ def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False,
mdir.add(message.as_string(True))
return True
oldstderr = smtplib.stderr
if debug:
oldstderr = smtplib.stderr
smtplib.stderr = WriteToLogger()
if not ssl: ssl = config.get('smtp_ssl', False)
s = smtplib.SMTP()
smtp = connect_smtp_server(smtp_server, smtp_port, smtp_user, smtp_password, ssl=ssl, tls=True, debug=debug)
try:
# in case of debug, the messages are printed to stderr.
if debug:
smtplib.stderr = WriteToLogger()
s.set_debuglevel(int(bool(debug))) # 0 or 1
s.connect(smtp_server, config['smtp_port'])
if ssl:
s.ehlo()
s.starttls()
s.ehlo()
if config['smtp_user'] or config['smtp_password']:
s.login(config['smtp_user'], config['smtp_password'])
s.sendmail(smtp_from, smtp_to_list, message.as_string())
smtp.sendmail(smtp_from, smtp_to_list, message.as_string())
except Exception:
_logger.error('could not deliver Email(s)', exc_info=True)
return False
finally:
try:
s.quit()
if debug:
smtplib.stderr = oldstderr
smtp.quit()
except Exception:
# ignored, just a consequence of the previous exception
pass
if debug:
smtplib.stderr = oldstderr
except Exception:
_logger.error('could not deliver email', exc_info=True)
_logger.error('Error on Send Emails Services', exc_info=True)
return False
return True
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False,
attach=None, openobject_id=False, ssl=False, debug=False, subtype='plain', x_headers=None, priority='3'):
attach=None, message_id=None, references=None, openobject_id=False, debug=False, subtype='plain', x_headers=None, priority='3',
smtp_server=None, smtp_port=None, ssl=False, smtp_user=None, smtp_password=None):
"""Send an email.
@ -521,9 +545,15 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
email_body = ustr(body).encode('utf-8')
email_text = MIMEText(email_body or '',_subtype=subtype,_charset='utf-8')
msg = MIMEMultipart()
if not message_id and openobject_id:
message_id = generate_tracking_message_id(openobject_id)
else:
message_id = Utils.make_msgid()
if references:
msg['references'] = references
msg['Message-Id'] = message_id
msg['Subject'] = Header(ustr(subject), 'utf-8')
msg['From'] = email_from
del msg['Reply-To']
@ -561,7 +591,11 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
part.add_header('Content-Disposition', 'attachment; filename="%s"' % (fname,))
msg.attach(part)
return _email_send(email_from, flatten([email_to, email_cc, email_bcc]), msg, openobject_id=openobject_id, ssl=ssl, debug=debug)
res = _email_send(email_from, flatten([email_to, email_cc, email_bcc]), msg, ssl=ssl, debug=debug,
smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password)
if res:
return message_id
return False
#----------------------------------------------------------
# SMS