summaryrefslogtreecommitdiff
path: root/addons/mail/static/scripts/openerp_mailgate.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/static/scripts/openerp_mailgate.py')
-rwxr-xr-xaddons/mail/static/scripts/openerp_mailgate.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/addons/mail/static/scripts/openerp_mailgate.py b/addons/mail/static/scripts/openerp_mailgate.py
new file mode 100755
index 00000000000..68ae20d35e3
--- /dev/null
+++ b/addons/mail/static/scripts/openerp_mailgate.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+# Copyright (C) 2010-TODAY OpenERP S.A. (http://www.openerp.com)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+#
+##############################################################################
+"""
+ openerp_mailgate.py
+"""
+
+import cgitb
+import time
+import optparse
+import sys
+import xmlrpclib
+import smtplib
+from email.MIMEMultipart import MIMEMultipart
+from email.MIMEBase import MIMEBase
+from email.MIMEText import MIMEText
+from email.Utils import COMMASPACE, formatdate
+from email import Encoders
+
+class DefaultConfig(object):
+ """
+ Default configuration
+ """
+ OPENERP_DEFAULT_USER_ID = 1
+ OPENERP_DEFAULT_PASSWORD = 'admin'
+ OPENERP_HOSTNAME = 'localhost'
+ OPENERP_PORT = 8069
+ OPENERP_DEFAULT_DATABASE = 'openerp'
+ MAIL_ERROR = 'error@example.com'
+ MAIL_SERVER = 'smtp.example.com'
+ MAIL_SERVER_PORT = 25
+ MAIL_ADMINS = ('info@example.com',)
+
+config = DefaultConfig()
+
+
+def send_mail(_from_, to_, subject, text, files=None, server=config.MAIL_SERVER, port=config.MAIL_SERVER_PORT):
+ assert isinstance(to_, (list, tuple))
+
+ if files is None:
+ files = []
+
+ msg = MIMEMultipart()
+ msg['From'] = _from_
+ msg['To'] = COMMASPACE.join(to_)
+ msg['Date'] = formatdate(localtime=True)
+ msg['Subject'] = subject
+
+ msg.attach( MIMEText(text) )
+
+ for file_name, file_content in files:
+ part = MIMEBase('application', "octet-stream")
+ part.set_payload( file_content )
+ Encoders.encode_base64(part)
+ part.add_header('Content-Disposition', 'attachment; filename="%s"'
+ % file_name)
+ msg.attach(part)
+
+ smtp = smtplib.SMTP(server, port=port)
+ smtp.sendmail(_from_, to_, msg.as_string() )
+ smtp.close()
+
+class RPCProxy(object):
+ def __init__(self, uid, passwd,
+ host=config.OPENERP_HOSTNAME,
+ port=config.OPENERP_PORT,
+ path='object',
+ dbname=config.OPENERP_DEFAULT_DATABASE):
+ self.rpc = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/%s' % (host, port, path), allow_none=True)
+ self.user_id = uid
+ self.passwd = passwd
+ self.dbname = dbname
+
+ def __call__(self, *request, **kwargs):
+ return self.rpc.execute(self.dbname, self.user_id, self.passwd, *request, **kwargs)
+
+class EmailParser(object):
+ def __init__(self, uid, password, model, email_default, dbname, host, port):
+ self.rpc = RPCProxy(uid, password, host=host, port=port, dbname=dbname)
+ try:
+ self.model_id = int(model)
+ self.model = str(model)
+ except:
+ self.model_id = self.rpc('ir.model', 'search', [('model', '=', model)])[0]
+ self.model = str(model)
+ self.email_default = email_default
+
+
+ def parse(self, message, custom_values=None, save_original=None):
+ # pass message as bytes because we don't know its encoding until we parse its headers
+ # and hence can't convert it to utf-8 for transport
+ res_id = self.rpc('mail.thread',
+ 'message_process',
+ self.model,
+ xmlrpclib.Binary(message),
+ custom_values or {},
+ save_original or False)
+
+def configure_parser():
+ parser = optparse.OptionParser(usage='usage: %prog [options]', version='%prog v1.1')
+ group = optparse.OptionGroup(parser, "Note",
+ "This program parse a mail from standard input and communicate "
+ "with the OpenERP server for case management in the CRM module.")
+ parser.add_option_group(group)
+ parser.add_option("-u", "--user", dest="userid",
+ help="ID of the user in OpenERP",
+ default=config.OPENERP_DEFAULT_USER_ID, type='int')
+ parser.add_option("-p", "--password", dest="password",
+ help="Password of the user in OpenERP",
+ default=config.OPENERP_DEFAULT_PASSWORD)
+ parser.add_option("-o", "--model", dest="model",
+ help="Name or ID of crm model",
+ default="crm.lead")
+ parser.add_option("-m", "--default", dest="default",
+ help="Default eMail in case of any trouble.",
+ default=None)
+ parser.add_option("-d", "--dbname", dest="dbname",
+ help="Database name (default: %default)",
+ default=config.OPENERP_DEFAULT_DATABASE)
+ parser.add_option("--host", dest="host",
+ help="Hostname of the OpenERP Server",
+ default=config.OPENERP_HOSTNAME)
+ parser.add_option("--port", dest="port",
+ help="Port of the OpenERP Server",
+ default=config.OPENERP_PORT)
+ parser.add_option("--custom-values", dest="custom_values",
+ help="Add Custom Values to the object",
+ default=None)
+ parser.add_option("-s", dest="save_original",
+ action="store_true",
+ help="Attach a copy of original email to the message entry",
+ default=False)
+
+ return parser
+
+def main():
+ """
+ Receive the email via the stdin and send it to the OpenERP Server
+ """
+ parser = configure_parser()
+ (options, args) = parser.parse_args()
+
+
+ email_parser = EmailParser(options.userid,
+ options.password,
+ options.model,
+ options.default,
+ dbname=options.dbname,
+ host=options.host,
+ port=options.port)
+
+
+ msg_txt = sys.stdin.read()
+
+ custom_values = {}
+ try:
+ custom_values = dict(eval(options.custom_values or {} ))
+ except:
+ import traceback
+ traceback.print_exc()
+
+ try:
+ email_parser.parse(msg_txt, custom_values, options.save_original or False)
+ except Exception:
+ msg = '\n'.join([
+ 'parameters',
+ '==========',
+ '%r' % (options,),
+ 'traceback',
+ '=========',
+ '%s' % (cgitb.text(sys.exc_info())),
+ ])
+
+ subject = '[OPENERP]:ERROR: Mailgateway - %s' % time.strftime('%Y-%m-%d %H:%M:%S')
+ send_mail(
+ config.MAIL_ERROR,
+ config.MAIL_ADMINS,
+ subject, msg, files=[('message.txt', msg_txt)]
+ )
+ sys.stderr.write("Failed to deliver email to OpenERP Server, sending error notification to %s\n" % config.MAIL_ADMINS)
+
+if __name__ == '__main__':
+ main()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: