From 573431a8bad2a471337b049bb945b97f20f22bd2 Mon Sep 17 00:00:00 2001 From: "Rifakat Haradwala (Open ERP)" Date: Tue, 29 Mar 2011 17:23:09 +0530 Subject: [PATCH] [IMP] ir_mail_server.py: corrected argument of send_method and did related changes and also removed unused imports bzr revid: rha@tinyerp.com-20110329115309-q7q02pto691a9nxp --- openerp/addons/base/ir/ir.xml | 2 - openerp/addons/base/ir/ir_actions.py | 7 +- openerp/addons/base/ir/ir_mail_server.py | 140 ++++++++++-------- openerp/addons/base/res/ir_property_view.xml | 1 + .../res/partner/wizard/partner_wizard_spam.py | 11 +- openerp/tools/misc.py | 10 +- 6 files changed, 88 insertions(+), 83 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 0c9a3ec5ae8..f3aab3c5bd6 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -2014,7 +2014,5 @@ - - diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 7a07ca40ef8..38904aecb5e 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -162,7 +162,7 @@ class act_window(osv.osv): def _invalid_model_msg(self, cr, uid, ids, context=None): return _('Invalid model name in the action definition.') - + _constraints = [ (_check_model, _invalid_model_msg, ['res_model','src_model']) ] @@ -195,7 +195,7 @@ class act_window(osv.osv): if act.search_view_id: search_view_id = act.search_view_id.id else: - res_view = self.pool.get('ir.ui.view').search(cr, uid, + res_view = self.pool.get('ir.ui.view').search(cr, uid, [('model','=',act.res_model),('type','=','search'), ('inherit_id','=',False)], context=context) if res_view: @@ -631,7 +631,8 @@ class actions_server(osv.osv): subject = self.merge_message(cr, uid, action.subject, action, context) body = self.merge_message(cr, uid, action.message, action, context) - if tools.email_send(user, [address], subject, body, debug=False, subtype='html') == True: + smtp_server_obj = self.pool.get('ir.mail_server') + if smtp_server_obj.send_email(uid, user, [address], subject, body, debug=False, subtype='html', cr=cr) == True: logger.info('Email successfully sent to: %s', address) else: logger.warning('Failed to send email to: %s', address) diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index ad408f80c8d..d9a62f75b76 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -28,19 +28,12 @@ from tools import config import netsvc import base64 -import inspect import subprocess import logging -import os -import re import smtplib import socket import sys -import threading import time -import warnings -import zipfile -from datetime import datetime from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart @@ -48,12 +41,6 @@ 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 -if sys.version_info[:2] < (2, 4): - from threadinglocal import local -else: - from threading import local try: from html2text import html2text except ImportError: @@ -63,17 +50,19 @@ import openerp.loglevels as loglevels from tools import config from email.generator import Generator - # get_encodings, ustr and exception_to_unicode were originally from tools.misc. # There are moved to loglevels until we refactor tools. from openerp.loglevels import get_encodings, ustr, exception_to_unicode _logger = logging.getLogger('tools') -# List of etree._Element subclasses that we choose to ignore when parsing XML. -# We include the *Base ones just in case, currently they seem to be subclasses of the _* ones. -SKIPPED_ELEMENT_TYPES = (etree._Comment, etree._ProcessingInstruction, etree.CommentBase, etree.PIBase) - +priorities = { + '1': '1 (Highest)', + '2': '2 (High)', + '3': '3 (Normal)', + '4': '4 (Low)', + '5': '5 (Lowest)', + } class ir_mail_server(osv.osv): """ @@ -103,7 +92,8 @@ unless it is already specified in the From Email, e.g: John Doe ", required=False), 'smtp_tls':fields.boolean('TLS'), 'smtp_ssl':fields.boolean('SSL/TLS'), - 'priority': fields.integer('Priority', help="If no specific server is requested for a mail then the highest priority one is used"), + 'priority': fields.integer('Priority', help="If no specific server is \ + requested for a mail then the highest priority one is used"), } _defaults = { @@ -124,8 +114,10 @@ unless it is already specified in the From Email, e.g: John Doe ", """ try: for smtp_server in self.browse(cr, uid, ids, context=context): - smtp = self.connect_smtp_server(cr, uid, smtp_server.smtp_host, smtp_server.smtp_port, user_name=smtp_server.smtp_user, - user_password=smtp_server.smtp_pass, ssl=smtp_server.smtp_ssl, tls=smtp_server.smtp_tls, debug=False) + smtp = self.connect_smtp_server(cr, uid, smtp_server.smtp_host, + smtp_server.smtp_port, user_name=smtp_server.smtp_user, + user_password=smtp_server.smtp_pass, ssl=smtp_server.smtp_ssl, + tls=smtp_server.smtp_tls, debug=False) try: smtp.quit() except Exception: @@ -139,7 +131,8 @@ unless it is already specified in the From Email, e.g: John Doe ", raise osv.except_osv(_("SMTP Connection: Test Successfully!"), '') - def connect_smtp_server(self, cr, uid, server_host, server_port, user_name=None, user_password=None, ssl=False, tls=False, debug=False): + def connect_smtp_server(self, cr, uid, server_host, server_port, user_name=None, + user_password=None, ssl=False, tls=False, debug=False): """ Connect SMTP Server and returned the (SMTP) object """ @@ -170,8 +163,8 @@ unless it is already specified in the From Email, e.g: John Doe ", raise error return smtp_server - def _email_send(self, cr, uid, smtp_from, smtp_to_list, message, ssl=False, debug=False, - smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None): + def _email_send(self, cr, uid, 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) @@ -205,7 +198,8 @@ unless it is already specified in the From Email, e.g: John Doe ", if not ssl: ssl = config.get('smtp_ssl', False) - smtp = self.connect_smtp_server(cr, uid, smtp_server, smtp_port, user_name=smtp_user, user_password=smtp_password, ssl=ssl, tls=True, debug=debug) + smtp = self.connect_smtp_server(cr, uid, smtp_server, smtp_port, + user_name=smtp_user, user_password=smtp_password, ssl=ssl, tls=True, debug=debug) try: smtp.sendmail(smtp_from, smtp_to_list, message.as_string()) except Exception: @@ -233,11 +227,16 @@ unless it is already specified in the From Email, e.g: John Doe ", """ return "<%s-openobject-%s@%s>" % (time.time(), openobject_id, socket.gethostname()) - def send_email(self, cr, uid, smtp_from, smtp_to_list, message, id=None, subject=None, ssl=False, - debug=False, smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None): + def send_email(self, cr, uid, smtp_from, email_to, subject, body, email_cc=None, + email_bcc=None, reply_to=False, 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, id=None): """Send an email. """ + if x_headers is None: + x_headers = {} if not (smtp_from or config['email_from']): raise ValueError("Sending an email requires either providing a sender " @@ -246,48 +245,65 @@ unless it is already specified in the From Email, e.g: John Doe ", smtp_from = ustr(smtp_from).encode('utf-8') if id: - smtp_server = self.browse(cr, uid, id) - if not (id and smtp_server): - server = self.search(cr, uid, [], order='priority', limit=1) - smtp_server = self.browse(cr, uid, server[0]) - if not id and smtp_server: + server = self.browse(cr, uid, id) + smtp_server = server.smtp_host + smtp_user = server.smtp_user + smtp_password = server.smtp_pass + smtp_port = server.smtp_port + ssl = server.smtp_ssl + elif not (id and smtp_server): + server_ids = self.search(cr, uid, [], order='priority', limit=1) + server = self.browse(cr, uid, server_ids[0]) + smtp_server = server.smtp_host + smtp_user = server.smtp_user + smtp_password = server.smtp_pass + smtp_port = server.smtp_port + ssl = server.smtp_ssl + elif not id and smtp_server: smtp_server = smtp_server + smtp_user = smtp_user + smtp_password = smtp_password + smtp_port = smtp_port + ssl = ssl - email_body = ustr(message.body or '').encode('utf-8') - email_text = MIMEText(email_body or '',_charset='utf-8') + if not email_cc: email_cc = [] + if not email_bcc: email_bcc = [] + if not body: body = u'' + email_body = ustr(body).encode('utf-8') + email_text = MIMEText(email_body or '', _subtype=subtype, _charset='utf-8') msg = MIMEMultipart() - openobject_id = message.res_id - if not message.message_id and openobject_id: + if not message_id and openobject_id: message_id = self.generate_tracking_message_id(openobject_id) else: message_id = Utils.make_msgid() + msg['Message-Id'] = message_id - - if message.references: - msg['references'] = message.references - - if subject: - msg['Subject'] = Header(ustr(subject), 'utf-8') + if references: + msg['references'] = references + msg['Subject'] = Header(ustr(subject), 'utf-8') msg['From'] = smtp_from - msg['To'] = smtp_to_list + del msg['Reply-To'] - if message.reply_to: - msg['Reply-To'] = message.reply_to + if reply_to: + msg['Reply-To'] = reply_to else: msg['Reply-To'] = msg['From'] - msg['Cc'] = message.email_cc or [] - msg['Bcc'] = message.email_bcc or [] - #msg['X-Priority'] = message.priority + + msg['To'] = COMMASPACE.join(email_to) + + if email_cc: + msg['Cc'] = COMMASPACE.join(email_cc) + if email_bcc: + msg['Bcc'] = COMMASPACE.join(email_bcc) + + msg['X-Priority'] = priorities.get(priority, '3 (Normal)') msg['Date'] = formatdate(localtime=True) # Add dynamic X Header - if message.headers: - x_headers = message.headers - for key, value in x_headers.iteritems(): - msg['%s' % key] = str(value) - - if html2text and message.sub_type == 'html': + for key, value in x_headers.iteritems(): + msg['%s' % key] = str(value) + if html2text and sub_type == 'html': text = html2text(email_body.decode('utf-8')).encode('utf-8') alternative_part = MIMEMultipart(_subtype="alternative") alternative_part.attach(MIMEText(text, _charset='utf-8', _subtype='plain')) @@ -296,19 +312,17 @@ unless it is already specified in the From Email, e.g: John Doe ", else: msg.attach(email_text) - attachments = [] - for attach in message.attachment_ids: - attachments.append((attach.datas_fname, base64.b64decode(attach.datas))) - if attachments: - for (fname,fcontent) in attachments: + if attach: + for (fname, fcontent) in attach: part = MIMEBase('application', "octet-stream") part.set_payload( fcontent ) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % (fname,)) msg.attach(part) - res = self._email_send(cr, uid, smtp_from, smtp_to_list, msg, smtp_server=smtp_server.smtp_host, - smtp_user=smtp_server.smtp_user, smtp_password=smtp_server.smtp_pass, smtp_port=smtp_server.smtp_port, debug=message.debug) + res = self._email_send(cr, uid, smtp_from, tools.flatten([email_to, email_cc, email_bcc]), + msg, ssl=ssl, debug=debug, smtp_server=smtp_server, smtp_user=smtp_user, + smtp_password=smtp_password, smtp_port=smtp_port) if res: return message_id return False @@ -317,13 +331,13 @@ unless it is already specified in the From Email, e.g: John Doe ", smtp_port = 0 if smtp_ssl: smtp_port = 465 - return {'value':{'smtp_ssl':smtp_ssl,'smtp_tls':False,'smtp_port':smtp_port}} + return {'value': {'smtp_ssl':smtp_ssl, 'smtp_tls':False, 'smtp_port':smtp_port}} def on_change_tls(self, cr, uid, ids, smtp_tls): smtp_port = 0 if smtp_tls: smtp_port = 0 - return {'value':{'smtp_tls':smtp_tls,'smtp_ssl':False,'smtp_port':smtp_port}} + return {'value': {'smtp_tls':smtp_tls, 'smtp_ssl':False, 'smtp_port':smtp_port}} ir_mail_server() diff --git a/openerp/addons/base/res/ir_property_view.xml b/openerp/addons/base/res/ir_property_view.xml index af836a3c92e..f15f66afc75 100644 --- a/openerp/addons/base/res/ir_property_view.xml +++ b/openerp/addons/base/res/ir_property_view.xml @@ -74,5 +74,6 @@ + diff --git a/openerp/addons/base/res/partner/wizard/partner_wizard_spam.py b/openerp/addons/base/res/partner/wizard/partner_wizard_spam.py index 61ddd70aa45..a141bfaf275 100644 --- a/openerp/addons/base/res/partner/wizard/partner_wizard_spam.py +++ b/openerp/addons/base/res/partner/wizard/partner_wizard_spam.py @@ -62,12 +62,11 @@ class partner_wizard_spam(osv.osv_memory): to = '"%s" <%s>' % (name, adr.email) #TODO: add some tests to check for invalid email addresses #CHECKME: maybe we should use res.partner/email_send - tools.email_send(data.email_from, - [to], - data.subject, - data.text, - subtype=type_, - openobject_id="res.partner-%s"%partner.id) + smtp_server_obj = self.pool.get('ir.mail_server') + smtp_server_obj.send_email(uid, data.email_from, + [to], data.subject, + data.text, subtype=type_, + cr=cr) nbr += 1 event_pool.create(cr, uid, {'name': 'Email(s) sent through mass mailing', diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index 41d0689a9e9..17ced2673d9 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -347,14 +347,6 @@ res_re = re.compile(r"\[([0-9]+)\]", re.UNICODE) command_re = re.compile("^Set-([a-z]+) *: *(.+)$", re.I + re.UNICODE) reference_re = re.compile("<.*-openobject-(\\d+)@(.*)>", re.UNICODE) -priorities = { - '1': '1 (Highest)', - '2': '2 (High)', - '3': '3 (Normal)', - '4': '4 (Low)', - '5': '5 (Lowest)', - } - def html2plaintext(html, body_id=None, encoding='utf-8'): ## (c) Fry-IT, www.fry-it.com, 2007 ## @@ -421,7 +413,7 @@ def html2plaintext(html, body_id=None, encoding='utf-8'): return html -def email_send(smtp_from, smtp_to_list, message, ssl=False, debug=False, smtp_server=None, smtp_port=None, +def email_send(uid, smtp_from, smtp_to_list, message, ssl=False, debug=False, smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None, cr=None): if not cr: db_name = getattr(threading.currentThread(), 'dbname', None)