diff --git a/mailgun/README.rst b/mailgun/README.rst new file mode 100644 index 0000000..4d45817 --- /dev/null +++ b/mailgun/README.rst @@ -0,0 +1,36 @@ +========= + 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. + +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 +======= + +Contributors +------------ +* Ildar Nasyrov +* Ivan Yelizariev + +Sponsors +-------- +* `IT-Projects LLC `_ + +Further information +=================== + +HTML Description: https://apps.odoo.com/apps/modules/9.0/mailgun/ + +Usage instructions: ``_ + +Changelog: ``_ + +Tested on Odoo 9.0 c8cd67c5d98b410cabe0a6efb3347a8a4de731d8 diff --git a/mailgun/__init__.py b/mailgun/__init__.py new file mode 100644 index 0000000..43dbbaa --- /dev/null +++ b/mailgun/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +import controllers +import models diff --git a/mailgun/__openerp__.py b/mailgun/__openerp__.py new file mode 100644 index 0000000..50f9277 --- /dev/null +++ b/mailgun/__openerp__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +{ + 'name': "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/mailgun/controllers/__init__.py b/mailgun/controllers/__init__.py new file mode 100644 index 0000000..a84d81a --- /dev/null +++ b/mailgun/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +import main diff --git a/mailgun/controllers/main.py b/mailgun/controllers/main.py new file mode 100644 index 0000000..b03c8a6 --- /dev/null +++ b/mailgun/controllers/main.py @@ -0,0 +1,16 @@ +# -*- 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): + + @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/doc/index.rst b/mailgun/doc/index.rst new file mode 100644 index 0000000..a632863 --- /dev/null +++ b/mailgun/doc/index.rst @@ -0,0 +1,55 @@ +========= + Mailgun +========= + +Usage +===== + +* 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`` + * Create new parameter + + * key: ``mailgun.apikey`` + * 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 + +* From https://mailgun.com/cp/routes create new route + + * Priority: ``0`` + * 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 +* Reply to the message and check it in your mail client (e.g. gmail.com) + + + 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'))