From 1aba5335a4053ab18e16f18f26d51d44cb24c28a Mon Sep 17 00:00:00 2001 From: Ildar Nasyrov Date: Sun, 24 Apr 2016 15:21:21 +0500 Subject: [PATCH 01/16] [ADD] mail_mailgun: new module --- mail_mailgun/README.rst | 30 +++++++++++++++ mail_mailgun/__init__.py | 2 + mail_mailgun/__openerp__.py | 12 ++++++ mail_mailgun/controllers/__init__.py | 2 + mail_mailgun/controllers/main.py | 57 ++++++++++++++++++++++++++++ mail_mailgun/doc/index.rst | 26 +++++++++++++ 6 files changed, 129 insertions(+) create mode 100644 mail_mailgun/README.rst create mode 100644 mail_mailgun/__init__.py create mode 100644 mail_mailgun/__openerp__.py create mode 100644 mail_mailgun/controllers/__init__.py create mode 100644 mail_mailgun/controllers/main.py create mode 100644 mail_mailgun/doc/index.rst diff --git a/mail_mailgun/README.rst b/mail_mailgun/README.rst new file mode 100644 index 0000000..3e74761 --- /dev/null +++ b/mail_mailgun/README.rst @@ -0,0 +1,30 @@ +============== + Mail Mailgun +============== + +With this module you can receive incoming messages from mailgun. +There is no IMAP or POP3 servers on mailgun that is to be used with odoo. +That is why we need this module. It fetches messages from mailgun using their API +and stores them in odoo. + +Credits +======= + +Contributors +============ +* Ildar Nasyrov + +Sponsors +======== +* `IT-Projects LLC `_ + +Further information +=================== + +HTML Description: https://apps.odoo.com/apps/modules/VERSION/TECHNICAL_NAME/ + +Usage instructions: ``_ + +Changelog: ``_ + +Tested on Odoo 9.0 ODOO_COMMIT_SHA_TO_BE_UPDATED diff --git a/mail_mailgun/__init__.py b/mail_mailgun/__init__.py new file mode 100644 index 0000000..192867d --- /dev/null +++ b/mail_mailgun/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import controllers diff --git a/mail_mailgun/__openerp__.py b/mail_mailgun/__openerp__.py new file mode 100644 index 0000000..f0b5872 --- /dev/null +++ b/mail_mailgun/__openerp__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Mail Mailgun", + 'author': "IT-Projects LLC, Ildar Nasyrov", + 'license': 'LGPL-3', + 'website': "https://twitter.com/nasyrov_ildar", + 'category': 'Discuss', + 'version': '1.0.0', + 'depends': ['mail'], + 'data': [ + ], +} diff --git a/mail_mailgun/controllers/__init__.py b/mail_mailgun/controllers/__init__.py new file mode 100644 index 0000000..a84d81a --- /dev/null +++ b/mail_mailgun/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import main diff --git a/mail_mailgun/controllers/main.py b/mail_mailgun/controllers/main.py new file mode 100644 index 0000000..1e46977 --- /dev/null +++ b/mail_mailgun/controllers/main.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +from openerp.addons.web import http +from openerp.addons.web.http import request +import werkzeug +import email +import requests +import simplejson + + +class MailMailgun(http.Controller): + + def get_logs(self): + return requests.get( + "https://api.mailgun.net/v3/iledarn.ru/events", + auth=("api", "key-8345fd06eeb8b27a3b1f9a1e025519ad"), + params={"begin" : "Fri, 3 May 2013 09:00:00 -0000", + "ascending" : "yes", + "limit" : 25, + "pretty" : "yes", + "recipient" : "admin@iledarn.ru" + }) + + @http.route('/mail_mailgun', auth='public', csrf=False) + def incoming_mail(self, **kw): + print '\n\n\n', 'in incoming_mail ', 'kw ', kw, '\n\n\n\n' + res = self.get_logs() + logs = res.text + logs_obj = simplejson.loads(logs) + items = logs_obj.get('items') + print '\n\n\n', 'logs ', logs, '\n\n\n' + print '\n\n\n', 'logs_obj ', logs_obj, '\n\n\n' + counter = 1 + for item in items: + mes = 'Item ' + str(counter) + counter = counter + 1 + if 'store' in item['routes'][0]['actions'][0]: + print '\n', mes, '\n' + print item + print '\n' + + @http.route('/mail_mailgun_mime', auth='public', csrf=False) + def incoming_mail_mime(self, **kw): + print '\n\n\n', 'in incoming_mail_mime ', 'kw ', kw, '\n\n\n\n' + body_mime = kw.get('body-mime') + mail_thread = request.env['mail.thread'].sudo() + # mail_thread_obj = request.env['res.partner'].sudo() + # msg_dict = mail_thread_obj.message_parse(body_mime) + # print '\n\n\n', 'msg_dict ', msg_dict, '\n\n\n' + # msg_id = msg_dict.get('message_id') + # print '\n\n\n', 'msg_id ', msg_id, '\n\n\n' + # mail_thread_obj.message_new(msg_dict) + res_id = mail_thread.message_process(model=False, message=body_mime) + print '\n\n\n', 'res_id ', res_id, '\n\n\n' + + + + diff --git a/mail_mailgun/doc/index.rst b/mail_mailgun/doc/index.rst new file mode 100644 index 0000000..60e0a27 --- /dev/null +++ b/mail_mailgun/doc/index.rst @@ -0,0 +1,26 @@ +============== + Mail mailgun +============== + +Usage +===== + +First we should register on mailgun.com. +After registgration there will be one domain available. E.g. sandbox5543f1479be64e5aac193406b4cdccf8.mailgun.org. +From this point we could already use API calls to mailgun API. There is API key on the +https://mailgun.com/app/domains/sandbox5543f1479be64e5aac193406b4cdccf8.mailgun.org page. +We can do all operations using mailgun API if we know our API key. More about it +on https://documentation.mailgun.com/. + +There is 'Add New Domain' on the https://mailgun.com/app/domains to add new domains. +All domains that we add manually should be verified. +After adding your domain you will see the https://mailgun.com/app/domains//verify page +with instructions on how to verify and use new domain. + +To receive incoming messages we specify so called routes on mailgun. +You can see more about the routes here https://documentation.mailgun.com/user_manual.html#receiving-forwarding-and-storing-messages + +Instruction how to check that module works. What shall user do and what would user get, e.g. +* Open menu ... +* Click ... + From d4072dce6e052ddb0fa80fc1f59608ab51aac103 Mon Sep 17 00:00:00 2001 From: Ildar Nasyrov Date: Sun, 24 Apr 2016 20:14:29 +0500 Subject: [PATCH 02/16] =?UTF-8?q?[DOC]=20mail=5Fmailgun:=20do=D1=81/index.?= =?UTF-8?q?rst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail_mailgun/doc/index.rst | 43 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/mail_mailgun/doc/index.rst b/mail_mailgun/doc/index.rst index 60e0a27..f937b3f 100644 --- a/mail_mailgun/doc/index.rst +++ b/mail_mailgun/doc/index.rst @@ -5,22 +5,29 @@ Usage ===== -First we should register on mailgun.com. -After registgration there will be one domain available. E.g. sandbox5543f1479be64e5aac193406b4cdccf8.mailgun.org. -From this point we could already use API calls to mailgun API. There is API key on the -https://mailgun.com/app/domains/sandbox5543f1479be64e5aac193406b4cdccf8.mailgun.org page. -We can do all operations using mailgun API if we know our API key. More about it -on https://documentation.mailgun.com/. - -There is 'Add New Domain' on the https://mailgun.com/app/domains to add new domains. -All domains that we add manually should be verified. -After adding your domain you will see the https://mailgun.com/app/domains//verify page -with instructions on how to verify and use new domain. - -To receive incoming messages we specify so called routes on mailgun. -You can see more about the routes here https://documentation.mailgun.com/user_manual.html#receiving-forwarding-and-storing-messages - -Instruction how to check that module works. What shall user do and what would user get, e.g. -* Open menu ... -* Click ... +* register on http://mailgun.com +* On https://mailgun.com/app/domains click on sandbox...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature +* Copy API Key value into odoo + + * Open menu Settings/Parameters/System Parameters + * Edit mailgun.apikey parameter + * Put API Key from mailgun into Value field and save + +* From https://mailgun.com/cp/routes create new route + + * Priority: ``0`` + * Filter expression: ``catch_all()`` + * Actions: ``store(notify="http:///mailgun/notify")`` + +* In odoo remove 'localhost' Outgoing Mail Server and create 'mailgun'. Now you can send emails +* From odoo menu Settings/General Settings edit Alias Domain + + * Put your mailgun domain here. E.g. sandbox...mailgun.org + * Click 'Apply' button + +* Edit Messaging Alias for your user. Now you can receive emails that is sent to configured alias email address. + + * From menu Settings/Users/Users open you user and click 'Edit' + * On Preference tab put alias into Messaging Alias field and click 'Save' + From bef3130f4b25425592d50abe1e7f897e596c783c Mon Sep 17 00:00:00 2001 From: Ildar Nasyrov Date: Sun, 24 Apr 2016 20:27:58 +0500 Subject: [PATCH 03/16] [DOC] mail_mailgun: doc/index.rst formattings and new paragraph --- mail_mailgun/doc/index.rst | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mail_mailgun/doc/index.rst b/mail_mailgun/doc/index.rst index f937b3f..398b548 100644 --- a/mail_mailgun/doc/index.rst +++ b/mail_mailgun/doc/index.rst @@ -9,25 +9,32 @@ Usage * On https://mailgun.com/app/domains click on sandbox...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature * Copy API Key value into odoo - * Open menu Settings/Parameters/System Parameters - * Edit mailgun.apikey parameter - * Put API Key from mailgun into Value field and save + * Open menu Settings/Parameters/System Parameters + * Edit mailgun.apikey parameter + * Put API Key from mailgun into Value field and save * From https://mailgun.com/cp/routes create new route - * Priority: ``0`` - * Filter expression: ``catch_all()`` - * Actions: ``store(notify="http:///mailgun/notify")`` + * Priority: ``0`` + * Filter expression: ``catch_all()`` + * Actions: ``store(notify="http:///mailgun/notify")`` * In odoo remove 'localhost' Outgoing Mail Server and create 'mailgun'. Now you can send emails * From odoo menu Settings/General Settings edit Alias Domain - * Put your mailgun domain here. E.g. sandbox...mailgun.org - * Click 'Apply' button + * Put your mailgun domain here. E.g. sandbox...mailgun.org + * Click 'Apply' button * Edit Messaging Alias for your user. Now you can receive emails that is sent to configured alias email address. - * From menu Settings/Users/Users open you user and click 'Edit' - * On Preference tab put alias into Messaging Alias field and click 'Save' + * From menu Settings/Users/Users open you user and click 'Edit' + * On Preference tab put alias into Messaging Alias field and click 'Save'. E.g. ``admin@sandbox...mailgun.org`` + +* Send email on ``admin@sandox...mailgun.org`` +* Open ``Discuss`` from odoo +* See your message there +* Stop odoo and send several emails again. On odoo starting you see all your messages in ``Discuss`` + + From fdebb2b740f2338145795b103b476002771fb957 Mon Sep 17 00:00:00 2001 From: Denis Baranov Date: Thu, 28 Apr 2016 19:46:41 +0300 Subject: [PATCH 04/16] mail_fix_553: add name in from alias email --- mail_fix_553/README.rst | 1 + mail_fix_553/data.xml | 5 +++++ mail_fix_553/mail_fix_553.py | 3 +++ 3 files changed, 9 insertions(+) diff --git a/mail_fix_553/README.rst b/mail_fix_553/README.rst index bfb1799..f8a430f 100644 --- a/mail_fix_553/README.rst +++ b/mail_fix_553/README.rst @@ -18,6 +18,7 @@ Configuration ============= You can configure default alias at Settings -> System Parameters -> mail.catchall.alias_from +You can configure name for default alias at Settings -> System Parameters -> mail.catchall.name_alias_from Known issues / Roadmap ====================== diff --git a/mail_fix_553/data.xml b/mail_fix_553/data.xml index 411d614..e9dc78d 100644 --- a/mail_fix_553/data.xml +++ b/mail_fix_553/data.xml @@ -6,5 +6,10 @@ mail.catchall.alias_from portal + + + mail.catchall.name_alias_from + Odoo + diff --git a/mail_fix_553/mail_fix_553.py b/mail_fix_553/mail_fix_553.py index 167435a..70af917 100644 --- a/mail_fix_553/mail_fix_553.py +++ b/mail_fix_553/mail_fix_553.py @@ -38,6 +38,7 @@ class mail_mail(osv.Model): # NEW STUFF catchall_alias = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.catchall.alias_from", context=context) + catchall_alias_name = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.catchall.name_alias_from", context=context) catchall_domain = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.catchall.domain", context=context) correct_email_from = '@%s>?\s*$'%catchall_domain @@ -101,6 +102,8 @@ class mail_mail(osv.Model): email_from = mail.email_from if re.search(correct_email_from, email_from) is None: email_from = default_email_from + if catchall_alias_name: + email_from = formataddr((catchall_alias_name, email_from)) msg = ir_mail_server.build_email( email_from=email_from, # NEW STUFF From 3d21182317de8ba1eba3307f6ad9f519974c81f9 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Tue, 3 May 2016 19:08:45 +0500 Subject: [PATCH 05/16] [DOC] update doc/index.rst --- mail_mailgun/doc/index.rst | 53 +++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/mail_mailgun/doc/index.rst b/mail_mailgun/doc/index.rst index 398b548..73c2bd0 100644 --- a/mail_mailgun/doc/index.rst +++ b/mail_mailgun/doc/index.rst @@ -6,12 +6,40 @@ Usage ===== * register on http://mailgun.com -* On https://mailgun.com/app/domains click on sandbox...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature -* Copy API Key value into odoo +* On https://mailgun.com/app/domains click on sandbox123...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature + * Copy API Key value into odoo + + * Open menu ``Settings / Parameters / System Parameters`` + * Create new parameter + + * key: mailgun.apikey parameter + * Value: API Key from mailgun (``key-...``) + * click Save + + * Copy smtp credentials into odoo + + * open ``Settings / Technical / Email / Outgoing Mail Servers`` + + * delete localhost + * create new server + + * Description: ``mailgun`` + * SMTP Server: ``smtp.mailgun.org`` + * Connection Security: ``SSL/TLS`` + * Username: e.g. ``postmaster@sandbox123....mailgun.org`` + * Password: ``...`` (copy ``Default Password`` from mailgun) + +* From odoo menu ``Settings / General Settings`` edit Alias Domain + + * Put your mailgun domain here. E.g. sandbox123...mailgun.org + * Click 'Apply' button + +* Open menu ``Settings / Users / Users`` - * Open menu Settings/Parameters/System Parameters - * Edit mailgun.apikey parameter - * Put API Key from mailgun into Value field and save + * choose your user and click ``[Edit]`` + * On Preference tab put alias into Messaging Alias field and click ``[Save]``. E.g. ``admin@sandbox...mailgun.org`` + +* Now you can receive emails that is sent to configured alias email address. * From https://mailgun.com/cp/routes create new route @@ -19,19 +47,8 @@ Usage * Filter expression: ``catch_all()`` * Actions: ``store(notify="http:///mailgun/notify")`` -* In odoo remove 'localhost' Outgoing Mail Server and create 'mailgun'. Now you can send emails -* From odoo menu Settings/General Settings edit Alias Domain - - * Put your mailgun domain here. E.g. sandbox...mailgun.org - * Click 'Apply' button - -* Edit Messaging Alias for your user. Now you can receive emails that is sent to configured alias email address. - - * From menu Settings/Users/Users open you user and click 'Edit' - * On Preference tab put alias into Messaging Alias field and click 'Save'. E.g. ``admin@sandbox...mailgun.org`` - -* Send email on ``admin@sandox...mailgun.org`` -* Open ``Discuss`` from odoo +* Via your favorite mail client (e.g. gmail.com) send email to ``admin@sandox...mailgun.org`` +* Open ``Discuss`` in odoo * See your message there * Stop odoo and send several emails again. On odoo starting you see all your messages in ``Discuss`` From e369e683cb41db30b3f2956151b1f7aafa202b6f Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 15:07:59 +0500 Subject: [PATCH 06/16] [DOC] tiny improvements --- mail_mailgun/README.rst | 6 +++--- mail_mailgun/doc/index.rst | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mail_mailgun/README.rst b/mail_mailgun/README.rst index 3e74761..32c0535 100644 --- a/mail_mailgun/README.rst +++ b/mail_mailgun/README.rst @@ -11,17 +11,17 @@ Credits ======= Contributors -============ +------------ * Ildar Nasyrov Sponsors -======== +-------- * `IT-Projects LLC `_ Further information =================== -HTML Description: https://apps.odoo.com/apps/modules/VERSION/TECHNICAL_NAME/ +HTML Description: https://apps.odoo.com/apps/modules/9.0/mail_mailgun/ Usage instructions: ``_ diff --git a/mail_mailgun/doc/index.rst b/mail_mailgun/doc/index.rst index 73c2bd0..e7e3c49 100644 --- a/mail_mailgun/doc/index.rst +++ b/mail_mailgun/doc/index.rst @@ -12,7 +12,7 @@ Usage * Open menu ``Settings / Parameters / System Parameters`` * Create new parameter - * key: mailgun.apikey parameter + * key: ``mailgun.apikey`` * Value: API Key from mailgun (``key-...``) * click Save @@ -34,13 +34,11 @@ Usage * Put your mailgun domain here. E.g. sandbox123...mailgun.org * Click 'Apply' button -* Open menu ``Settings / Users / Users`` +* Set admin's email alias. Open menu ``Settings / Users / Users`` * choose your user and click ``[Edit]`` * On Preference tab put alias into Messaging Alias field and click ``[Save]``. E.g. ``admin@sandbox...mailgun.org`` -* Now you can receive emails that is sent to configured alias email address. - * From https://mailgun.com/cp/routes create new route * Priority: ``0`` @@ -50,6 +48,7 @@ Usage * Via your favorite mail client (e.g. gmail.com) send email to ``admin@sandox...mailgun.org`` * Open ``Discuss`` in odoo * See your message there +* Reply to the message and check it in your mail client (e.g. gmail.com) * Stop odoo and send several emails again. On odoo starting you see all your messages in ``Discuss`` From aa2bbc5efbf88bfda66c7c653460c29ce74b1358 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 15:10:49 +0500 Subject: [PATCH 07/16] [REF] rename module to mailgun --- {mail_mailgun => mailgun}/README.rst | 0 {mail_mailgun => mailgun}/__init__.py | 0 {mail_mailgun => mailgun}/__openerp__.py | 0 {mail_mailgun => mailgun}/controllers/__init__.py | 0 {mail_mailgun => mailgun}/controllers/main.py | 0 {mail_mailgun => mailgun}/doc/index.rst | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {mail_mailgun => mailgun}/README.rst (100%) rename {mail_mailgun => mailgun}/__init__.py (100%) rename {mail_mailgun => mailgun}/__openerp__.py (100%) rename {mail_mailgun => mailgun}/controllers/__init__.py (100%) rename {mail_mailgun => mailgun}/controllers/main.py (100%) rename {mail_mailgun => mailgun}/doc/index.rst (100%) diff --git a/mail_mailgun/README.rst b/mailgun/README.rst similarity index 100% rename from mail_mailgun/README.rst rename to mailgun/README.rst diff --git a/mail_mailgun/__init__.py b/mailgun/__init__.py similarity index 100% rename from mail_mailgun/__init__.py rename to mailgun/__init__.py diff --git a/mail_mailgun/__openerp__.py b/mailgun/__openerp__.py similarity index 100% rename from mail_mailgun/__openerp__.py rename to mailgun/__openerp__.py diff --git a/mail_mailgun/controllers/__init__.py b/mailgun/controllers/__init__.py similarity index 100% rename from mail_mailgun/controllers/__init__.py rename to mailgun/controllers/__init__.py diff --git a/mail_mailgun/controllers/main.py b/mailgun/controllers/main.py similarity index 100% rename from mail_mailgun/controllers/main.py rename to mailgun/controllers/main.py diff --git a/mail_mailgun/doc/index.rst b/mailgun/doc/index.rst similarity index 100% rename from mail_mailgun/doc/index.rst rename to mailgun/doc/index.rst From 3cd74e354be137f5383ad973c12f9c3ac9e9a775 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 15:42:39 +0500 Subject: [PATCH 08/16] [DOC] updates to new modules name + improvements in docs --- mailgun/README.rst | 8 ++++---- mailgun/__openerp__.py | 2 +- mailgun/controllers/main.py | 4 ++-- mailgun/doc/index.rst | 29 +++++++++++++++-------------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/mailgun/README.rst b/mailgun/README.rst index 32c0535..1ce53ae 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -1,6 +1,6 @@ -============== - Mail Mailgun -============== +========= + Mailgun +========= With this module you can receive incoming messages from mailgun. There is no IMAP or POP3 servers on mailgun that is to be used with odoo. @@ -21,7 +21,7 @@ Sponsors Further information =================== -HTML Description: https://apps.odoo.com/apps/modules/9.0/mail_mailgun/ +HTML Description: https://apps.odoo.com/apps/modules/9.0/mailgun/ Usage instructions: ``_ diff --git a/mailgun/__openerp__.py b/mailgun/__openerp__.py index f0b5872..50f9277 100644 --- a/mailgun/__openerp__.py +++ b/mailgun/__openerp__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- { - 'name': "Mail Mailgun", + 'name': "Mailgun", 'author': "IT-Projects LLC, Ildar Nasyrov", 'license': 'LGPL-3', 'website': "https://twitter.com/nasyrov_ildar", diff --git a/mailgun/controllers/main.py b/mailgun/controllers/main.py index 1e46977..90652bb 100644 --- a/mailgun/controllers/main.py +++ b/mailgun/controllers/main.py @@ -20,7 +20,7 @@ class MailMailgun(http.Controller): "recipient" : "admin@iledarn.ru" }) - @http.route('/mail_mailgun', auth='public', csrf=False) + @http.route('/mailgun', auth='public', csrf=False) def incoming_mail(self, **kw): print '\n\n\n', 'in incoming_mail ', 'kw ', kw, '\n\n\n\n' res = self.get_logs() @@ -38,7 +38,7 @@ class MailMailgun(http.Controller): print item print '\n' - @http.route('/mail_mailgun_mime', auth='public', csrf=False) + @http.route('/mailgun_mime', auth='public', csrf=False) def incoming_mail_mime(self, **kw): print '\n\n\n', 'in incoming_mail_mime ', 'kw ', kw, '\n\n\n\n' body_mime = kw.get('body-mime') diff --git a/mailgun/doc/index.rst b/mailgun/doc/index.rst index e7e3c49..33ccd49 100644 --- a/mailgun/doc/index.rst +++ b/mailgun/doc/index.rst @@ -1,12 +1,13 @@ -============== - Mail mailgun -============== +========= + Mailgun +========= Usage ===== -* register on http://mailgun.com -* On https://mailgun.com/app/domains click on sandbox123...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature +* register or log in http://mailgun.com +* On https://mailgun.com/app/domains click on you domain, e.g. sandbox123...mailgun.org domain. Here you can see all information needed to configure odoo outgoing mail feature + * if you in sandbox domain, add Authorized Recepient * Copy API Key value into odoo * Open menu ``Settings / Parameters / System Parameters`` @@ -29,15 +30,10 @@ Usage * Username: e.g. ``postmaster@sandbox123....mailgun.org`` * Password: ``...`` (copy ``Default Password`` from mailgun) -* From odoo menu ``Settings / General Settings`` edit Alias Domain - - * Put your mailgun domain here. E.g. sandbox123...mailgun.org - * Click 'Apply' button - -* Set admin's email alias. Open menu ``Settings / Users / Users`` - - * choose your user and click ``[Edit]`` - * On Preference tab put alias into Messaging Alias field and click ``[Save]``. E.g. ``admin@sandbox...mailgun.org`` + * From odoo menu ``Settings / General Settings`` edit Alias Domain + + * Put your mailgun domain here. E.g. sandbox123...mailgun.org + * Click 'Apply' button * From https://mailgun.com/cp/routes create new route @@ -45,6 +41,11 @@ Usage * Filter expression: ``catch_all()`` * Actions: ``store(notify="http:///mailgun/notify")`` +* Set admin's email alias. Open menu ``Settings / Users / Users`` + + * choose your user and click ``[Edit]`` + * On Preference tab put alias into Messaging Alias field and click ``[Save]``. E.g. ``admin@sandbox...mailgun.org`` + * Via your favorite mail client (e.g. gmail.com) send email to ``admin@sandox...mailgun.org`` * Open ``Discuss`` in odoo * See your message there From 992a06744635515ce48d0c668265b74e1b605a11 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 18:37:14 +0500 Subject: [PATCH 09/16] [ADD] mails via notification work --- mailgun/README.rst | 1 + mailgun/__init__.py | 1 + mailgun/controllers/main.py | 53 +++++-------------------------------- mailgun/models.py | 21 +++++++++++++++ 4 files changed, 29 insertions(+), 47 deletions(-) create mode 100644 mailgun/models.py diff --git a/mailgun/README.rst b/mailgun/README.rst index 1ce53ae..5be7a47 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -13,6 +13,7 @@ Credits Contributors ------------ * Ildar Nasyrov +* Ivan Yelizariev Sponsors -------- diff --git a/mailgun/__init__.py b/mailgun/__init__.py index 192867d..43dbbaa 100644 --- a/mailgun/__init__.py +++ b/mailgun/__init__.py @@ -1,2 +1,3 @@ # -*- coding: utf-8 -*- import controllers +import models diff --git a/mailgun/controllers/main.py b/mailgun/controllers/main.py index 90652bb..b03c8a6 100644 --- a/mailgun/controllers/main.py +++ b/mailgun/controllers/main.py @@ -6,52 +6,11 @@ import email import requests import simplejson - class MailMailgun(http.Controller): - def get_logs(self): - return requests.get( - "https://api.mailgun.net/v3/iledarn.ru/events", - auth=("api", "key-8345fd06eeb8b27a3b1f9a1e025519ad"), - params={"begin" : "Fri, 3 May 2013 09:00:00 -0000", - "ascending" : "yes", - "limit" : 25, - "pretty" : "yes", - "recipient" : "admin@iledarn.ru" - }) - - @http.route('/mailgun', auth='public', csrf=False) - def incoming_mail(self, **kw): - print '\n\n\n', 'in incoming_mail ', 'kw ', kw, '\n\n\n\n' - res = self.get_logs() - logs = res.text - logs_obj = simplejson.loads(logs) - items = logs_obj.get('items') - print '\n\n\n', 'logs ', logs, '\n\n\n' - print '\n\n\n', 'logs_obj ', logs_obj, '\n\n\n' - counter = 1 - for item in items: - mes = 'Item ' + str(counter) - counter = counter + 1 - if 'store' in item['routes'][0]['actions'][0]: - print '\n', mes, '\n' - print item - print '\n' - - @http.route('/mailgun_mime', auth='public', csrf=False) - def incoming_mail_mime(self, **kw): - print '\n\n\n', 'in incoming_mail_mime ', 'kw ', kw, '\n\n\n\n' - body_mime = kw.get('body-mime') - mail_thread = request.env['mail.thread'].sudo() - # mail_thread_obj = request.env['res.partner'].sudo() - # msg_dict = mail_thread_obj.message_parse(body_mime) - # print '\n\n\n', 'msg_dict ', msg_dict, '\n\n\n' - # msg_id = msg_dict.get('message_id') - # print '\n\n\n', 'msg_id ', msg_id, '\n\n\n' - # mail_thread_obj.message_new(msg_dict) - res_id = mail_thread.message_process(model=False, message=body_mime) - print '\n\n\n', 'res_id ', res_id, '\n\n\n' - - - - + @http.route('/mailgun/notify', auth='public', type='http', csrf=False) + def mailgun_notify(self, **kw): + # mailgun notification in json format + message_url = kw.get('message-url') + request.env['mail.thread'].sudo().mailgun_fetch_message(message_url) + return 'ok' diff --git a/mailgun/models.py b/mailgun/models.py new file mode 100644 index 0000000..5a246b4 --- /dev/null +++ b/mailgun/models.py @@ -0,0 +1,21 @@ +import requests +import time +import dateutil +import pytz + +from openerp import models, api + +from openerp.addons.mail.models.mail_message import decode +from openerp.addons.mail.models.mail_thread import mail_header_msgid_re + +import logging +_logger = logging.getLogger(__name__) + +class MailThread(models.AbstractModel): + _inherit = 'mail.thread' + + @api.model + def mailgun_fetch_message(self, message_url): + api_key = self.env['ir.config_parameter'].sudo().get_param('mailgun.apikey') + res = requests.get(message_url, headers={'Accept': 'message/rfc2822'}, auth=('api', api_key)) + self.message_process(False, res.json().get('body-mime')) From d8219d7e4ff604f0358899272c6f97241be59008 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 19:42:50 +0500 Subject: [PATCH 10/16] [DOC] add todo about reloading mails after odoo starts to get undelivered mails --- mailgun/README.rst | 4 ++++ mailgun/doc/index.rst | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mailgun/README.rst b/mailgun/README.rst index 5be7a47..a80bf09 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -7,6 +7,10 @@ There is no IMAP or POP3 servers on mailgun that is to be used with odoo. That is why we need this module. It fetches messages from mailgun using their API and stores them in odoo. +TODO. + +* If emails are sent when odoo is stopped then Mailgun will retry (other than for delivery notification) during 8 hours at the following intervals before stop trying: 10 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour, 2 hour and 4 hours. This could be fixed by fetching undelivered messages after odoo starts. + Credits ======= diff --git a/mailgun/doc/index.rst b/mailgun/doc/index.rst index 33ccd49..a632863 100644 --- a/mailgun/doc/index.rst +++ b/mailgun/doc/index.rst @@ -50,8 +50,6 @@ Usage * Open ``Discuss`` in odoo * See your message there * Reply to the message and check it in your mail client (e.g. gmail.com) -* Stop odoo and send several emails again. On odoo starting you see all your messages in ``Discuss`` - From 859cbe07b49f9dfae36ec91a001a586999099340 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 19:43:40 +0500 Subject: [PATCH 11/16] [DOC] fix format --- mailgun/README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mailgun/README.rst b/mailgun/README.rst index a80bf09..4af26dc 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -7,7 +7,8 @@ There is no IMAP or POP3 servers on mailgun that is to be used with odoo. That is why we need this module. It fetches messages from mailgun using their API and stores them in odoo. -TODO. +TODO +---- * If emails are sent when odoo is stopped then Mailgun will retry (other than for delivery notification) during 8 hours at the following intervals before stop trying: 10 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour, 2 hour and 4 hours. This could be fixed by fetching undelivered messages after odoo starts. From 1dddadfd39b95c667aceff04b2936838c1935f36 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 19:48:28 +0500 Subject: [PATCH 12/16] [DOC] and revision --- mailgun/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun/README.rst b/mailgun/README.rst index 4af26dc..f1a4ae9 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -33,4 +33,4 @@ Usage instructions: ``_ Changelog: ``_ -Tested on Odoo 9.0 ODOO_COMMIT_SHA_TO_BE_UPDATED +Tested on Odoo 9.0 c8cd67c5d98b410cabe0a6efb3347a8a4de731d8 From 7a4930a913dbd7ce7362a03517fa94867b47dfa9 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 19:56:00 +0500 Subject: [PATCH 13/16] [DOC] fix format --- mailgun/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun/README.rst b/mailgun/README.rst index f1a4ae9..4d45817 100644 --- a/mailgun/README.rst +++ b/mailgun/README.rst @@ -8,7 +8,7 @@ That is why we need this module. It fetches messages from mailgun using their AP and stores them in odoo. TODO ----- +==== * If emails are sent when odoo is stopped then Mailgun will retry (other than for delivery notification) during 8 hours at the following intervals before stop trying: 10 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour, 2 hour and 4 hours. This could be fixed by fetching undelivered messages after odoo starts. From 078b2b15263adfe52480f984c3563adebf54cdc3 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Wed, 4 May 2016 22:05:51 +0500 Subject: [PATCH 14/16] [IMP] add simple security check --- mailgun/controllers/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mailgun/controllers/main.py b/mailgun/controllers/main.py index b03c8a6..a8a7d9a 100644 --- a/mailgun/controllers/main.py +++ b/mailgun/controllers/main.py @@ -12,5 +12,8 @@ class MailMailgun(http.Controller): def mailgun_notify(self, **kw): # mailgun notification in json format message_url = kw.get('message-url') + if not message_url.startswith('https://api.mailgun.net/'): + # simple security check failed + raise Exception('wrong message-url') request.env['mail.thread'].sudo().mailgun_fetch_message(message_url) return 'ok' From 9169a9239098aa654e0aae66e0ecc34a4bd4dab9 Mon Sep 17 00:00:00 2001 From: x620 Date: Tue, 10 May 2016 13:23:10 +0500 Subject: [PATCH 15/16] [DOC] adds icons and images for app store --- mail_all/__openerp__.py | 2 +- mail_archives/__openerp__.py | 2 +- mail_base/static/description/icon.png | Bin 0 -> 2140 bytes mail_sent/__openerp__.py | 2 +- mail_sent/images/menu.png | Bin 0 -> 9087 bytes mail_to/__openerp__.py | 2 +- mail_to/images/1.png | Bin 0 -> 38524 bytes mail_to/static/description/icon.png | Bin 0 -> 2140 bytes res_partner_mails_count/__openerp__.py | 2 +- 9 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 mail_base/static/description/icon.png create mode 100644 mail_sent/images/menu.png create mode 100644 mail_to/images/1.png create mode 100644 mail_to/static/description/icon.png diff --git a/mail_all/__openerp__.py b/mail_all/__openerp__.py index 6737443..e15786b 100644 --- a/mail_all/__openerp__.py +++ b/mail_all/__openerp__.py @@ -3,7 +3,7 @@ "name": "Show all messages", "summary": """Checkout all messages where you have access""", "category": "Discuss", - "images": [], + "images": ['images/1.png'], "version": "1.0.0", "author": "IT-Projects LLC, Pavel Romanchenko", diff --git a/mail_archives/__openerp__.py b/mail_archives/__openerp__.py index 761bb6b..5416189 100644 --- a/mail_archives/__openerp__.py +++ b/mail_archives/__openerp__.py @@ -3,7 +3,7 @@ "name": "Mail archives", "summary": """Adds menu to find old messages""", "category": "Discuss", - "images": [], + "images": ['images/1.jpg'], "version": "1.0.0", "author": "IT-Projects LLC, Pavel Romanchenko", diff --git a/mail_base/static/description/icon.png b/mail_base/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..79f7d8fe294f838cf2996940c40dc08dde60642f GIT binary patch literal 2140 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 DBH|^| literal 0 HcmV?d00001 diff --git a/mail_to/__openerp__.py b/mail_to/__openerp__.py index 37f15d0..40b1ccd 100644 --- a/mail_to/__openerp__.py +++ b/mail_to/__openerp__.py @@ -3,7 +3,7 @@ "name": """Show message recipients""", "summary": """Allows you be sure, that all discussion participants were notified""", "category": "Discuss", - "images": [], + "images": ['images/1.png'], "version": "1.0.0", "author": "IT-Projects LLC, Pavel Romanchenko", diff --git a/mail_to/images/1.png b/mail_to/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..6950f93373d697ccbcbbf9aa616994ab6c5bd983 GIT binary patch literal 38524 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 z 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 SSUIi$0000 Date: Tue, 10 May 2016 13:25:00 +0500 Subject: [PATCH 16/16] [DOC] add mail_all module screenshot in images for app store --- mail_all/images/1.png | Bin 0 -> 14979 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mail_all/images/1.png diff --git a/mail_all/images/1.png b/mail_all/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f0307dfb51eab3a9f531624aed88878c2315b3 GIT binary patch literal 14979 zcmbt*2{e^$*zT@Wn*UtK%~Z4;8*^0X?&3## zJWiT;oNzsV-u{9I;e@;W84r8AeO}HUPWx2Uv~-QH)3Fc;`v_`E#|_E7KN7r;F{v#6 zJxBK-%vO2#Z9QH3puI|T$EB5yMef_U@kH9}kaHh*A70q69Ay#CC#D>J zJY40@-VK|1LaW^d{$6RiCR$g`HpLnJBVmNuv*6*_tg()#rJ)9Afqx;s&=U4_9@ z&-Ywrt;}7`joeh%CYoGLx|CCFZweH?mc5hCmFBD}-Jr^s?8)?`kVVrXbRUT@U$pV$ zGC?|ONhw>`iSf$oGcD51p?eKFxtggr40>&zGjk>DZ(iLd9o6Sraa`>1rA4LtcSy-n z($YP>z2C;i@2EabOia9c_wKD*w2`V*EW5}*T?U6sA4NS>VoC;F+S+@MUf_*X#Y;EO>tnUFbQ8Ur=8gqp=341*BfG_y+iIK|4stX|IEtQRbaubk zSMvLGthw0Ba?kUIvV5kGV{a3kC427+n_c)+9C_!?;McEA%*^STnIZI9IXM^3p5=~e zR9u}Owp#ra^Zfbq)zz!T4b^K>`oaa&Y) z=W_3Ypdb}}ef`Uq=i1XWK7an4pTHJj`}%hMt5>`C>@hVpjZ}SncBi2?!Ya zg^$WME#OmBTdGeIoeI>){VwU1q0GXFYw& z&&x|c!WcrKKjZ6LcK`mz$6C=bF$2XHQ!6Se^72Ia`Cothc)$BYfB$NP|1yuFqN0q9 z%z*=qb#*uEZJf`Y!;-3;JZVvNRUUWwHu@mWo~5Pbd>Jc zJBriL+^m_>yR!6GjrVRy2sLRO2TO5nxgaVkDk$i6nnnzVf*+BGmK?}um^1Dp=`nFN zAuje^RG|brgM#1uou-kucH;IeC{MDt_u<2b&x}kjEZ@I>UoDQ6b@A_cU3>JqO1SpR z7aL#SrElNP$|U@poYdfpdhz1L0C{-(`Sa)VO`fHvk4~&#c!C!Gi9O+SQ=1Rsm%EHl zpCgdPnCl!0W<-|71O%``#DLoEdyiDRZAjnf{A4QsoAFBpo3V@4qFL^Ox=h1`r6h9XJox0r|cXp}bh0XvYH-(Xr@xnl5h40^=s5n|W zx-W-!@$jS$4h|Oe`-HWQDK2D&L_{Ph`meHB`7tmvGw z@SWehTss_F6Mu}2IXXLsjJew67e9F-prBys-LjLg`Zsc1mTrbE>10!uuxa7PXO053 z1K|f^pCuH-uN?MDDLNliQNhRhYOf3mLP~~`Kq34(f=WE$Nkphhsy4!{v6O|YD^LN z^`7UftMH2q=9KIW)dqJ`)Qx*ytttA1R>#v5R;`aw2n24b^^Q$IlU;A%|6UGtysoJ^ zv$ncYT3YIsvcXy|@k5=@i4%3x({3kDoL~)4XH(rmxaKHA^7Q=k=+QnFmKZ?d{QSJI z*-QM-t(?&>U%m_tiCr4iWDMzSYs1P%K76=HS*tTC^*9i%uBEPiW0GcB?IcR2yu94f zXCke)w|CQ4y28RjA8Plv za6GF|ZeD%NU6`Lwy=@y$q^je)_{OHDRQ*gM7e~a=(-dCD#;&fvt1C-y?`|U!O-kJD z{rr{SD+nD%>|K2ZwfQ8`w(s==!Utok?R0bx;_1&^S*fzkMt2uf8QywLF@R|0J+ez!IJ>yGI5d=oLLaUi794C+?8ZfU zQcxhFpuk}~JVTa}Zgw&>G{jAvCzLv_o#``{p;6jG7U2B z?a;H#i&RhJX%;tE9c^kR4lPpm3H<-krldO%i9{%N?ygHBhzI>&tZ@EXJOg9M0&M;AD>fTTXjUB6tNoJ?N2#70Md zc+8F#_-av*P(HX#;=$;s!}Vj5+*=Kc(}RqI;$4HJ^l6Tm)a6NaQyO*-VaZW9UUC-tBXskFV#c^)}Sr*7dl6o z2(5kzJ2ZWh2CaD6QXs6p_r*DucpC!w<$Ya|7>%^{;nxwio4F~AOG~c(c(hTi_@14> zu5;ARk`M3SXD*+nCUlIdCFQB{GV1OlEJp$k2};C&aQHvb@xOTKug|c!uyFhVHDSI^ z$;sY+7ZcOhuV1P7nFt&)8M7Id{{Cw(U%rg7^f@3Qu`@_Go`9Y>(i9^rBLfIYPEHOC z48;4Fm;K6(PoCT_CntxusYEVLO}D9Ve)#w?QPzuY3)QswY0|cBVIXE4((V-P44wMj zm8*-BfJRSGPdz=o0|yS!ZW#_g+VAG+S?^n7o>NvPO9|aj&8WR=%gv#wDgVij!pXW1 z9z2+D*EqCm*RBIWdV6cW_Y`15{Fi55mw8QnxjQ~SUNmr3R!V9ff83nhaE+KjiHV89 zEdmd7a&piBRC#4CexV`>2n)Boem&NmZwt8i@#6 z^udGOd-v{T4R08pQJ5dxM0sB}RT&o(baPJAybYmP;kGF8@@ zf}V3-Ifo@A@RQKc&>I&C%hxseSpuG}U*|4gzDy$3=2orxtSoxQZ!r{!0XvKi5 z=x25|HJu}qr6eQ_7P@gz>%&<3dVA@%Z~yb>4*-RmQd(99c48;qgCe%DNQjE+h)`T5 zV=ePdmKP^;%}h*iU^CLvunFE|a$e8(@^U%K`_Nqno12^6<_DiY7Z-^+=jxi9oxL)d zTZQ9}4gJ~sqN%-I97rfHpU^atbNWRV1c(3=?q-L=ymiB^J;u3~SWb%)_q3NUFB=%_ z6g#x}+M1`ve20!A7lnAYM@O$N{V3v@Q|G;VsB+$BW$};H z-P0g&&dw8PN06ipB+x7=GXrDeF7QcbN!FV+#pD?qBO_+glj33%W8;|Cv7On6j~uZq z^$2+%`Yth&vx#NLgVEYKV@cScIlD??dHJ+vj-u!ZW$UFY@?=Lz%E5Mt*oq+m6kRb z>>~xMr>Up4|NQwAc=h|Y2hP*(-Dq=hadBowMn_Vfhlgvass>k9t_}`b+uEj@ix^u< ztsn4D5t$JUUtig{77m^3 zIB+sCO`og$tK50S#Kds60HQofPckx!t}I=?e$4I5s}Kmz08;+d6(8KW{fF?bqxmL6 zj3JfFznU0Epr3ddot>O+>5e|=NhJ(cRqvGN|2jkNj+Bs)=&QW4w7f9OKteB(&#)vznTkW@d4uRD%<&-nN(qF}9jf4o5P7#kb!*s%k3*xT0^11+;_*BOlf`d`0)Kkk@7 zg9CXR7*O25KR`Rf*Vp%wRJ_{2n;M+nk6m3;-T6F6j=apyZu#`-Q&$&@VtDnQM=xCm zuA*u~lo;vhMH4@7xwf{kLnkIXHMPK{NBq*ISuo2eex3d*e??SM-4K`{1bs>hcf6w) z_!4l`0Gtb^1J>8XL|5P*t~YN~pHYP<)!O98$Hy0&U-0wu!|6{=O)V-qn$+6b(t`8o zdFfJ9W25))@ir7PH22JNLDHM#cUvWi*1Bz_LYRq+n6DxaFrGp%l&D<-km*r zc5vgSL+Sfn&Yl$%5{kE}PJ>xCb6NOw;S&IrU^GB+0Nrz9HLti>>R$`?uxX~HrOh)D zVrNfKI|mqoL6&JK;}Zji;^ExiSoOh&ap<{(H3*T+DQ~GXAm`{3%>V%d*puKJQ%NOO>jmpH5;^N@? zFU!lzLqkIVkE2JAj!-Bl9Q-TLv=np^LqXvG+@C*Mnwmlf4;B;_`u+J}926Mn?(R-c zYG`N>Vm`>n7pTdXd-}zWnQ_zSnM4fe7wD(7GgC6>7VE2S&PSl5FaCM-m(P@ zVLv}V*5lX0@}J4Br%#^n^7Gf_5fV2s+#c+&@Rh0?eP&vqusmIt$%f^+8xX@0D4q2Z?3rACfdx4#3iaDgCp;6|yAWnLcmq*XVL{ER`{{2AT z&4kt{B6|77WplnL>F7m1K0eq-@Y`%ecN3GbT+s)OaZDh$=sk(8^g#qZ-XQwL(Ky%O zA0U&@j!|?0f2_N-%OEf+D?#WK6cv-y*Y#WjibP@1Av)?5PXD`Di6CMskqAedGLjEnea5 zoE#&_Mj08U=QP{5hofy~K6z4|N3e9$82|F6{lf?JtEc8tqN2JcCLms_yequpQ&T!> zYBPWS0FuEJ0M8#keq37~Q{+|SAP2J*;n@xsAJT} z9lq`4nv-va+#n8Ml_*b@`ma?cBqS6R%#K?a=a@r`x_Nn7<=dP@F*HW;!v*7*^u6Tn z{xR3e%ETl%!K@i>8-*Eqto<|n-nCDOA~8wu0A)k!`Z*17WFZ9&_f9%t&Sqn9+qV$7OH zYQ4!nPwtjkRU}+r^Ar*~Mj5<~_dmGr_G%mVe7HJAcSBHA>rgedk4WB+iTsI)nwTB^ z^WHx{>)r698;j2ui+?nBqpGvByL#5dO=ZLXo-@dKY0iGu1KS1oI5>cFIy65xp4!Gl z6QIOBfhxanK?Jn5u~CmsZUdpZgDJVF=r0U$7PeGpDmji;oYJl?FKg>Tn77aV8QDF+&BZN1N&i=ZU61+Xvp z!R>p2*v#~_lZ%U_xVU(rN+coJjrDcBjOW>M0)Wrtc&yiVkdWzfyAN5XaDYMa5lf7>f536US z2>?T5Ib`{YV?zK5>?1rVXlqm>6On3UWCVmfJUF;|J77=Ps?r=B8QNM#=HVM(2`H}^ ztE+odG_e~nANyq?nAYky}bS&KKHR0R=0}E+VX5GqzeNB z1B5kt1bB`VdD1s!kS3UYI&R8=V+ zKK$YB+jWqy^7(UCO)Uh03YIS`>zm@*g3gwk`TlFG*bamP7s%vpV4i@$6C4sar^IA< zV7QGn7>?lcz(ce%p5AF`@kUi>pT zIywsb0PLHX3|y?KInJg!(AjAy#B5dJb4oB8oj6p9n=a@ky|}0-EMaM%-vYPCBhjt? z?c{7H0!Ic?Nl6JW;{j~r zXiFU23Vj2Eu+Y%jnK?WKv+(Ix)}q0NY=mZN{-G!x1!>_V`0HQqsJXN=(pR* z$OwmE2d4t>dKgerRfVVDs1kfoNC*bU=OWi6_$9Y*ze9&EC@9F+MHDiYn+v1dzFKa7RYh67(nQ3YEwzdUlKM1mhE2rr*kgzzsj3H!3o|q<3l5@}~<1w|=JK zl`B_lw56n^x<7voFL>VF+xxS>V(ESI37*@q;WOHtAjrfaYex z5QCGG6H>Nt;{IC&tjZ@(g2RZw#sLDv9XX%%?AbDO@8q{{Z=0GFSAKV_TN1pyb}bJN z!*5xy?-UwZS^!8|V4yM*9dB>x$cyW1$JN=_r{TAGMu!`KLU|AIq3m(1Zs=Zg^pC!x zLsC*?_NqlZi$sZ4rT8l zbwnYlb$I4oqWn{~tG>V+C^Os%r-4R?vJf*16Vt8TJ;h1j@(Sx$V%?CCN!~t5$=}&U z{p;QiNp&ARk!qt%!UbE~o%Hn6AI)5GdJ*&HSXHgUf-Jo>_6~xVfkcUX&54^2d2?Gy zVNZF=rLS)y8OD;cv$qe>!A3bJ9@{)NTTxz)VDjv_b3>oEtmDzeFR!p}l9H0}!f?HQ z*75oC%8#Of+X7IIOd(1$Gc!_F{DImTeLX!Ol(66A>p6||^}l@m+S%J1`dN-Kq!7O! z_?4cX4%+~7VG%$L^oLpFCMGWMDd8gG z1MKZz@9=lPyui%*EPy@M0KO!dj~d>N65jqX+YFQtGSXX)cc6&3RDYRwD{nb_Et zamcf>1i>Ydc0Y>(l)wf(+D{$^jR3L%lHdjam($Z7Cfd`$UltY?U@yVYMYgG&I^^4u zZC1q1&5cI{EeGcxYmU8neh_hM5duScO)$Go9wor zE}4dc^h9f^8^nyaDx6o~1@O=lfsXJc!$0fcchtGJ#!Gkf_WBGrgky)^MhL)HiPcPZ zmyxs)8-{#4X!MNyj5a8$y{BhkD2Vd{`U}vTm<*gg5kxoCSp`M~rVoD|V-Hy9BD5hm zyv#$0FK^zs(SPNyMTxnkuCCk9PtviPm*F*9SbSbjiUR{7cdg3F7vIH8qb1mhn~KD& zP1o&!LxXjYWEBQ06%)G%cfNQBVhk{sxnI9fnBXy3?1oF7I5&t#o>^60#V!j93St$4 z=-6+JQT$J<^7NZ7XlQ9EX>BKsm*>xrhlJ6Gjz%jn?b)+OC4%Ehz7A(ty}O&+n|JTv zzg6$Y0K*aZ6%`z_nz3(BZL$>5AWsh-*U`~|l2=Gll!;4H;ywVHp`%lUqrA<3am&`N z>;CzU9TD))lask1t-)8sl3M;TDosA*C%Dpe1wb5lIP^R)ATqOkiiLnB7_7by$GdW- zVXvX!3*cVUp(8Xa`#;I=M82r6DHun%j(UOG z%*r|oyA90+R^#-vC@Hwc+7C!hOvd2DP`N*m>qy+n!dMayMPccC0qP=!9aW1>+()6= zwrxg_3LnvQUwCI&J!=2Q=yJqNF#5>h!=Ed! z$iiF>Bu=Y@y8Y;V0rzLW0x3_?Beo${H)aZ zD>xBUTG^HrGDnZHjHPl!fvrGD3&v=UTt)tqn~}lK7^0n|U}0d8nx4+g!Eph;=hRfv z!-q1Gl2kl9_C4yDKo(ciha;&YQhRZX0{yE(1WUcLw(=K<2!sWr*TD9nM28<92eKTA z6J`vtv9Y4@7(m*6wwhCvKVHmsOaJ)KpNWMb=+-)UG4(br2*kPWMMk#u^#QHz zVBe08;^EWHv+)!uDKJqE3J3`B^E)=D|NK;Pf-efz9oS?q0t_fLjc#p$y*Fa^-hfsqDt{)^lUcN@QE z*q=wB1cwrqLE?9NJ3A9dnVuf8SWS$Cm`ex>zJhwp|NmMK>ESNEA8~NvM(UHw~84;2G z$qdOWDq?YkCk-o}aRkW&cwl-u=0xZNY!y=WRZGC={|q*--Q#Rt>^6ixbnjef{TEbZ zIbtZN$bf(V+sn^hzMMmsKuH4rZ55n#e>QiX5syVHfm~|*cQMh_BREHYK?j5T0ZU%ikzaXvd7y>m3!`xcE?2OL*n5skF>!HyLLr8)y?kLXzlP7cV+r zxbUu}Wq+h9*2-Ljg{!l(lj;OL`pSmCR*@5+-_*l~NQnFUZx?aO`}~$v1Y9p+LdnkLF0Me1TAK$*ooTk8%29Q84?ra@^ z69@+~{rP$ze`$XD%$MQh6G6)J)kx1Z)z#fSJmL?ZGXgtyauUcd0s;d{0{6Wi7|@a1 zVJEtqf_0IN9y`}z{wLOY0P8sqeF5Ve{25!1Jaavb{5{cO-~yN6^g1QJmynQco}(+^ z)(H9zYNpJ&d)KbRqkcL)#TLbGXMEEAH6QCwU=ZaZcraY2SWUi2RRq*8q*|<2Mr?$k1-NsjG#v2#ZRh5bf@kgOd|c(PBN`D08vKxW@uP=szYY;i>#@ zJ#oEx{lCAI3cYrX5FdT=#0lHF!0m>Df4moZuwZ_$We0z4YAwP{A-F4_cK@ppcTNRA zsS4TU#R^+jK@e1VTiU2iqHXgU@?h%Gnthj^CS{oP_p{c;aGb#{@&! z$*H@q&lj;2WG@ur@Uy?>B1eUUnmar1DRD>NyJueMw`c4Hf_vzhkkC+!fW*L>$0ryX z-aEE$pOBlITi(r^o1z+BoScd;|2Pe0LV8nOZH=h}#pUS}Sj1>`oFpfZ5%@PqMtWT4 zpgUmJ+1Y(9oHgE1EpY=woioL+JuYAV*xA|qKrA&U2Xj&xa49iPf@X|a4>vd6lJuOM zpO9e~+kwB@+t$W_*{bw(fFoK%i$ej_rABHSCN{8>W!5ztL4(i%)zkEmT*0vBh+qNs zb83uJ+0xNNpGcz(AF|N5DhOMW|V`U}o zBcYhL3kax(_;fjce!*`QlMQa}FJPbobp0XBUf*V~Ye|Rm!_RMfv(Z{q#IhW7jRF5G z=no%8W*6KVud~=`KLM3VNonusIKdr>J%knWpae6*S}+@fl}g|vDU~WBxj`A>5yVjy zQPAg}o-ayDq%R63pN*e~p5meWubgi!3?2zeT72OzXZ!p2*N$S4$1&;3{pe^6kU7}c ze1Wg$XE6*w^y&@%^U1BOnA5)2bgI7 z$=w>pjfaBwD-kbB#e+wbiyg0Qr%=!|V=zsJSw>K8&_enKK`ySE#>NR4?P{8uOkwp9 z=pgFA>z)3t0Qf6cR&KM)+SuA67Hn>5fe=bfNm1@Xq3Q}St*)*@>UzlFQIMF))l2>* zOskwGZMk_oqhp5kKv3PD^8{)cSy{|?9E6buhn5ZCS{<*fi>TtCx(!FkTWoa$`4{j(?1jV za(&a*hRJE!sd5SKGt+nhtfnU+P)hRqMJ*zE^r$}~;+Z)RhV}nhm>ol&YukJzf>SXu zCMJj;?w%QZrSS0WaV_`N(|`w%vhU!GoqhN4aMQqmKc;cOk^c>C$%u%o+X6~Ab1UW^ zrl#_c#s_O|f)k`xwP6JC!v{}rBPb8d=e>M+U(EK<2Il{}@F1}EGTe#b%5kuWQK*=DK7G2^urgRXW9?6_e}b%+h~B!{ zS8{0#Q{WhfaPCzE@Z71f##AfiPHb$?Fh@>SR;lmb3(p+=;zW_{i-`@nNnyf{{AsGE zAPD9K4ITwGf`V1K&6fG>8E-F`AuM=uAMTz)Y_$6Y+l58QZQp<4I>qqZlIk{)%Hxv==PfkpP zD5Z2{=yY{1z}_mNn=KOI%a3QeSJHe3PI-}7O`)Diu3*DrWzUtMMbA)TNU|F zn?W^1tFv=(z{tJm;Zg3l@C#0V{?UE=2nVN;g<>l4$Hat~sHh1>8e^IeBnSuz-D|Xq zy6hP$zacT@lwaUa0cE}@OlgHE!H0JH)|m-ssG!FM^DQ&$BPc|%!j~^c$HpL94J<6K zc*Lbfe0cxfq?{~98pqT-N|+M!2jf*hW6|BT_G!SxXZEW>rWkTeNRD~@iBPaK1V1RSao{6!spzuB%lEA<%s}~H1RA^NWp5VJw@(HEIL%~pev=_{$S}X3KUl2HI-@JJM$@IX=lQLl@Q#j~^w8`d5iMi9U^|2XEv-@Z>BIQu z23Q9>yO!$ay$g5mGGZVuGBV$;@h(OIC%%1qSyaSB!BkS-eGpt_p&@IKet!FytK~V` zY5diaZWk|#9XY~b@e?d|aPS!IpQpyT+A2d4r}oNT-#K4HW{>X10P)h&z?wqhl+2>T zY+?L&1`9w{t%f+6WP;G5I2ac9z>Lge zQnGcv2`tF&QqO}k9hlso@!QcF4}LrIt2vl@O909HE~o7JN~76l=sWtP{+$uxN_5w> z&IC>%-e?}4fil#BAAzjbtms0x<@Y_afm}>9`Bwmt{=df=^kA8zx!x9TD3sTSa{yr| zjU;gUcF5w}rswfJ8{5*IntbbW3fU(73~A|De2Gd*3c-b*hDK9co0z=31!${*K|w_Y zd!HX)6zZVJZ^0dR=`#5&J9{RxZ+*tHB`$g@7xn?Z>;!M8SP8SRzEhy>b^l@@(8|3P zfs&TS{6DDQIQt0byx}k2WOMKjtuUsKYJZwT5WPAKbkRl3BS}~0 zdJtpW`^;!_CZuj?9|e(?sch#qV}`nUs`-hGbb2SNIu%5v2#ScY47O3>c^ku{>=E zvCn_-AV!Ojy5O5m`{Ao~IYv8bE$$S`_<2CwuDFaLtvNN@iT;=A$mBBzB< z!k6Aa6QOncbaiPe*P`r5eR`Vy1X}!bFQJlCCsdVp@q0llGNb-apM;{-mlhY1wF72k zd~BrUBMb$jwTCy0WEw8kvsit?7u*U8b}D{#xo`o{t#JAK?yD`2Dk_jb)B#AxfBdK) z!vXuY9)B8Gl`rZW8cNzQ$0Q^O$26f|T{aqVUx2j2aW*wH