David
7 years ago
committed by
Jairo Llopis
13 changed files with 545 additions and 23 deletions
-
28mail_tracking_mailgun/README.rst
-
1mail_tracking_mailgun/__init__.py
-
11mail_tracking_mailgun/__openerp__.py
-
133mail_tracking_mailgun/i18n/es.po
-
3mail_tracking_mailgun/models/__init__.py
-
2mail_tracking_mailgun/models/ir_mail_server.py
-
58mail_tracking_mailgun/models/mail_tracking_email.py
-
21mail_tracking_mailgun/models/mail_tracking_event.py
-
135mail_tracking_mailgun/models/res_partner.py
-
1mail_tracking_mailgun/tests/__init__.py
-
131mail_tracking_mailgun/tests/test_mailgun.py
-
16mail_tracking_mailgun/views/mail_tracking_email.xml
-
28mail_tracking_mailgun/views/res_partner.xml
@ -1,5 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import models |
@ -1,29 +1,140 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * mail_tracking_mailgun |
|||
# |
|||
# Translators: |
|||
# OCA Transbot <transbot@odoo-community.org>, 2016 |
|||
# Gelo Joga Landoo <gj@landoo.es>, 2016 |
|||
# * mail_tracking_mailgun |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 9.0c\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2016-11-28 14:12+0000\n" |
|||
"PO-Revision-Date: 2016-11-28 14:12+0000\n" |
|||
"Last-Translator: Gelo Joga Landoo <gj@landoo.es>, 2016\n" |
|||
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" |
|||
"POT-Creation-Date: 2017-11-22 09:11+0000\n" |
|||
"PO-Revision-Date: 2017-11-22 09:11+0000\n" |
|||
"Last-Translator: <david.vidal@tecnativa.com>\n" |
|||
"Language-Team: \n" |
|||
"MIME-Version: 1.0\n" |
|||
"Content-Type: text/plain; charset=UTF-8\n" |
|||
"Content-Transfer-Encoding: \n" |
|||
"Language: es\n" |
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n" |
|||
"Plural-Forms: \n" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:82 |
|||
#, python-format |
|||
msgid "%s couldn't be verified. Either the request couln't be completed or the mailbox provider doesn't support email verification" |
|||
msgstr "%s no ha podido ser verificado. Puede que la petición no se haya completado o que el buzón no soporta validación de correo electrónico" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:76 |
|||
#, python-format |
|||
msgid "%s failed the mailbox verification. Please check it in order to avoid sending issues" |
|||
msgstr "%s no ha pasado la validación de buzón. Compruébela para prevenir problemas con los envíos" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:69 |
|||
#, python-format |
|||
msgid "%s is not a valid email address. Please check it in order to avoid sending issues" |
|||
msgstr "%s no es una dirección válida de correo electrónico. Compruébela para prevenir problemas con los envíos" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/mail_tracking_email.py:75 |
|||
#, python-format |
|||
msgid "A Mailgun domain value is needed!" |
|||
msgstr "¡Se necesita un valor de dominio para Mailgun!"" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.view_partner_form_mailgun |
|||
msgid "Check Mailgun" |
|||
msgstr "Comprobar Mailgun" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.view_partner_form_mailgun |
|||
msgid "Check email validity" |
|||
msgstr "Comprobar validez de email" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/mail_tracking_email.py:236 |
|||
#, python-format |
|||
msgid "Couldn't retrieve Mailgun information" |
|||
msgstr "No se ha podido obtener información desde Mailgun" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:30 |
|||
#, python-format |
|||
msgid "Email has been bounced: %s\n" |
|||
"Reason: %s\n" |
|||
"Event: %s" |
|||
msgstr "El correo ha sido rebotado: %s\n" |
|||
"Razón: %s\n" |
|||
"Evento: %s" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:56 |
|||
#, python-format |
|||
msgid "Error %s trying to check mailof connection" |
|||
msgstr "Error %s al intentar comprobar el correo electrónicodeconexión" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/mail_tracking_email.py:240 |
|||
#, python-format |
|||
msgid "Event information not longer stored" |
|||
msgstr "La información del evento ha caducado" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.model,name:mail_tracking_mailgun.model_mail_tracking_email |
|||
msgid "MailTracking email" |
|||
msgstr "MailTracking email" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.model,name:mail_tracking_mailgun.model_mail_tracking_event |
|||
msgid "MailTracking event" |
|||
msgstr "MailTracking event" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.view_partner_form_mailgun |
|||
msgid "Mailgun" |
|||
msgstr "Mailgun" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:62 |
|||
#, python-format |
|||
msgid "Mailgun Error. Mailbox verification value wasn't returned" |
|||
msgstr "Error de Mailgun. No se ha devuelto el valor de verificación de buzón" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.model.fields,field_description:mail_tracking_mailgun.field_mail_tracking_event_mailgun_id |
|||
msgid "Mailgun Event ID" |
|||
msgstr "Mailgun Event ID" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.model,name:mail_tracking_mailgun.model_res_partner |
|||
msgid "Partner" |
|||
msgstr "Empresa" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.mailgun_manual_check |
|||
msgid "Re-sync Mailgun" |
|||
msgstr "Resincronizar Mailgun" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.view_partner_form_mailgun |
|||
msgid "Set Bounced" |
|||
msgstr "Marcar como rebotado" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/mail_tracking_email.py:70 |
|||
#, python-format |
|||
msgid "There is no Mailgun API key!" |
|||
msgstr "There is no Mailgun API key!" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.ui.view,arch_db:mail_tracking_mailgun.view_partner_form_mailgun |
|||
msgid "Unset Bounced" |
|||
msgstr "Desmarcar como rebotado" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: code:addons/mail_tracking_mailgun/models/res_partner.py:46 |
|||
#, python-format |
|||
msgid "You need to configure mailgun.validation_key in order to be able to check mails validity" |
|||
msgstr "Necesitas configurar mailgun.validation_key para poder comprobar la validez de direcciones de correo" |
|||
|
|||
#. module: mail_tracking_mailgun |
|||
#: model:ir.model,name:mail_tracking_mailgun.model_ir_mail_server |
|||
msgid "ir.mail_server" |
|||
|
@ -1,6 +1,7 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import ir_mail_server |
|||
from . import mail_tracking_email |
|||
from . import mail_tracking_event |
|||
from . import res_partner |
@ -0,0 +1,21 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2017 Tecnativa - David Vidal |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from openerp import models, fields |
|||
|
|||
|
|||
class MailTrackingEvent(models.Model): |
|||
_inherit = "mail.tracking.event" |
|||
|
|||
mailgun_id = fields.Char( |
|||
string="Mailgun Event ID", |
|||
copy="False", |
|||
readonly=True, |
|||
) |
|||
|
|||
def _process_data(self, tracking_email, metadata, event_type, state): |
|||
res = super(MailTrackingEvent, self)._process_data( |
|||
tracking_email, metadata, event_type, state) |
|||
res.update({'mailgun_id': metadata.get('mailgun_id', False)}) |
|||
return res |
@ -0,0 +1,135 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2016 Tecnativa - Antonio Espinosa |
|||
# Copyright 2016 Tecnativa - Carlos Dauden |
|||
# Copyright 2017 Tecnativa - Pedro M. Baeza |
|||
# Copyright 2017 Tecnativa - David Vidal |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import requests |
|||
import json |
|||
|
|||
from openerp import _, api, models |
|||
from openerp.exceptions import UserError |
|||
|
|||
|
|||
class ResPartner(models.Model): |
|||
_inherit = 'res.partner' |
|||
|
|||
@api.multi |
|||
def email_bounced_set(self, tracking_emails, reason, event=None): |
|||
res = super(ResPartner, self).email_bounced_set( |
|||
tracking_emails, reason, event=event) |
|||
self._email_bounced_set(reason, event) |
|||
return res |
|||
|
|||
@api.multi |
|||
def _email_bounced_set(self, reason, event): |
|||
for partner in self: |
|||
if not partner.email: |
|||
continue |
|||
body = _('Email has been bounced: %s\n' |
|||
'Reason: %s\n' |
|||
'Event: %s') % (partner.email, reason, |
|||
event['Message-Id'] or '') |
|||
partner.message_post(body=body) |
|||
|
|||
@api.multi |
|||
def check_email_validity(self): |
|||
""" |
|||
Checks mailbox validity with Mailgun's API |
|||
API documentation: |
|||
https://documentation.mailgun.com/en/latest/api-email-validation.html |
|||
""" |
|||
api_key, api_url, domain, validation_key = self.env[ |
|||
'mail.tracking.email']._mailgun_values() |
|||
if not validation_key: |
|||
raise UserError(_('You need to configure mailgun.validation_key' |
|||
' in order to be able to check mails validity')) |
|||
for partner in self: |
|||
res = requests.get( |
|||
"%s/address/validate" % api_url, |
|||
auth=("api", validation_key), params={ |
|||
"address": partner.email, |
|||
"mailbox_verification": True, |
|||
}) |
|||
if not res or res.status_code != 200: |
|||
raise UserError(_( |
|||
'Error %s trying to ' |
|||
'check mail' % res.status_code or 'of connection')) |
|||
content = json.loads(res.content, res.apparent_encoding) |
|||
if 'mailbox_verification' not in content: |
|||
raise UserError( |
|||
_("Mailgun Error. Mailbox verification value wasn't" |
|||
" returned")) |
|||
# Not a valid address: API sets 'is_valid' as False |
|||
# and 'mailbox_verification' as None |
|||
if not content['is_valid']: |
|||
partner.email_bounced = True |
|||
raise UserError( |
|||
_('%s is not a valid email address. Please check it ' |
|||
'in order to avoid sending issues') % (partner.email)) |
|||
# If the mailbox is not valid API returns 'mailbox_verification' |
|||
# as a string with value 'false' |
|||
if content['mailbox_verification'] == 'false': |
|||
partner.email_bounced = True |
|||
raise UserError( |
|||
_('%s failed the mailbox verification. Please check it ' |
|||
'in order to avoid sending issues') % (partner.email)) |
|||
# If Mailgun can't complete the validation request the API returns |
|||
# 'mailbox_verification' as a string set to 'unknown' |
|||
if content['mailbox_verification'] == 'unknown': |
|||
raise UserError( |
|||
_("%s couldn't be verified. Either the request couln't be " |
|||
"completed or the mailbox provider doesn't support " |
|||
"email verification") % (partner.email)) |
|||
|
|||
@api.multi |
|||
def check_email_bounced(self): |
|||
""" |
|||
Checks if the partner's email is in Mailgun's bounces list |
|||
API documentation: |
|||
https://documentation.mailgun.com/en/latest/api-suppressions.html |
|||
""" |
|||
api_key, api_url, domain, validation_key = self.env[ |
|||
'mail.tracking.email']._mailgun_values() |
|||
for partner in self: |
|||
res = requests.get( |
|||
'%s/%s/bounces/%s' % (api_url, domain, partner.email), |
|||
auth=("api", api_key)) |
|||
if res.status_code == 200 and not partner.email_bounced: |
|||
partner.email_bounced = True |
|||
elif res.status_code == 404 and partner.email_bounced: |
|||
partner.email_bounced = False |
|||
|
|||
@api.multi |
|||
def force_set_bounced(self): |
|||
""" |
|||
Forces partner's email into Mailgun's bounces list |
|||
API documentation: |
|||
https://documentation.mailgun.com/en/latest/api-suppressions.html |
|||
""" |
|||
api_key, api_url, domain, validation_key = self.env[ |
|||
'mail.tracking.email']._mailgun_values() |
|||
for partner in self: |
|||
res = requests.post( |
|||
'%s/%s/bounces' % (api_url, domain), |
|||
auth=("api", api_key), |
|||
data={'address': partner.email}) |
|||
partner.email_bounced = ( |
|||
res.status_code == 200 and not partner.email_bounced) |
|||
|
|||
@api.multi |
|||
def force_unset_bounced(self): |
|||
""" |
|||
Forces partner's email deletion from Mailgun's bounces list |
|||
API documentation: |
|||
https://documentation.mailgun.com/en/latest/api-suppressions.html |
|||
""" |
|||
api_key, api_url, domain, validation_key = self.env[ |
|||
'mail.tracking.email']._mailgun_values() |
|||
for partner in self: |
|||
res = requests.delete( |
|||
'%s/%s/bounces/%s' % (api_url, domain, partner.email), |
|||
auth=("api", api_key)) |
|||
if res.status_code in (200, 404) and partner.email_bounced: |
|||
partner.email_bounced = False |
@ -1,5 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import test_mailgun |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<record id="mailgun_manual_check" model="ir.ui.view"> |
|||
<field name="name">Manual Mailgun check</field> |
|||
<field name="model">mail.tracking.email</field> |
|||
<field name="inherit_id" ref="mail_tracking.view_mail_tracking_email_form"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="state" position="before"> |
|||
<button name="action_manual_check_mailgun" |
|||
type="object" string="Re-sync Mailgun"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
</odoo> |
@ -0,0 +1,28 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- Copyright 2016 Tecnativa - Pedro M. Baeza |
|||
Copyright 2016 Carlos Dauden - Tecnativa <carlos.dauden@tecnativa.com> |
|||
Copyright 2017 Tecnativa <vicent.cubellsn@tecnativa.com> |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> |
|||
<odoo> |
|||
|
|||
<record id="view_partner_form_mailgun" model="ir.ui.view"> |
|||
<field name="name">Partner Mailgun button</field> |
|||
<field name="model">res.partner</field> |
|||
<field name="inherit_id" ref="mail_tracking.view_partner_form"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="email_bounced" position="after"> |
|||
<label for="check_email_bounced" string="Mailgun" |
|||
attrs="{'invisible': [('email', '=', False)]}"/> |
|||
<group col="3" name="mailgun_buttons" attrs="{'invisible': [('email', '=', False)]}"> |
|||
<button name="check_email_bounced" type="object" string="Check Mailgun" class="oe_link"/> |
|||
<button name="check_email_validity" type="object" string="Check email validity" class="oe_link"/> |
|||
<button name="force_set_bounced" type="object" string="Set Bounced" class="oe_link" |
|||
attrs="{'invisible': [('email_bounced', '=', True)]}"/> |
|||
<button name="force_unset_bounced" type="object" string="Unset Bounced" class="oe_link" |
|||
attrs="{'invisible': [('email_bounced', '=', False)]}"/> |
|||
</group> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue