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)