diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index cd817fa796a..13ca39bec39 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -159,7 +159,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 +426,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 +476,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 +486,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, 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 +544,13 @@ 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 message_id: + msg['Message-Id'] = message_id + elif openobject_id: + msg['Message-Id'] = generate_tracking_message_id(openobject_id) + msg['Subject'] = Header(ustr(subject), 'utf-8') msg['From'] = email_from del msg['Reply-To'] @@ -561,7 +588,8 @@ 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) + return _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) #---------------------------------------------------------- # SMS