Browse Source

Exodus of mailgun

pull/364/head
Ivan Yelizariev 3 years ago
parent
commit
85ae3d5c0a
No known key found for this signature in database GPG Key ID: 5C35763D5E7BFD67
  1. 39
      mailgun/README.rst
  2. 2
      mailgun/__init__.py
  3. 34
      mailgun/__manifest__.py
  4. 1
      mailgun/controllers/__init__.py
  5. 16
      mailgun/controllers/main.py
  6. 15
      mailgun/data/ir_cron_data.xml
  7. 10
      mailgun/doc/changelog.rst
  8. 93
      mailgun/doc/index.rst
  9. 29
      mailgun/i18n/es.po
  10. BIN
      mailgun/images/mailgun_main.png
  11. 2
      mailgun/models/__init__.py
  12. 33
      mailgun/models/ir_config_parameter.py
  13. 22
      mailgun/models/mail_thread.py
  14. BIN
      mailgun/static/description/icon.png
  15. 334
      mailgun/static/description/index.html
  16. BIN
      mailgun/static/description/mailgun_add_domain.png
  17. BIN
      mailgun/static/description/mailgun_auth_recipients.png
  18. BIN
      mailgun/static/description/mailgun_auth_recipients_form.png
  19. BIN
      mailgun/static/description/mailgun_domain_details.png
  20. BIN
      mailgun/static/description/mailgun_odoo_general.png
  21. BIN
      mailgun/static/description/mailgun_odoo_mail_alias.png
  22. BIN
      mailgun/static/description/mailgun_odoo_outgoing.png
  23. BIN
      mailgun/static/description/mailgun_odoo_partner_email.png
  24. BIN
      mailgun/static/description/mailgun_odoo_sys_param.png
  25. BIN
      mailgun/static/description/mailgun_route.png
  26. BIN
      mailgun/static/description/mailgun_route_form.png

39
mailgun/README.rst

@ -1,39 +0,0 @@
.. image:: https://itpp.dev/images/infinity-readme.png
:alt: Tested and maintained by IT Projects Labs
:target: https://itpp.dev
.. image:: https://img.shields.io/badge/license-MIT-blue.svg
:target: https://opensource.org/licenses/MIT
:alt: License: MIT
=========
Mailgun
=========
The module allows to receive incoming messages or send them to clients who uses external mail services (e.g. gmail.com) by using 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.
Questions?
==========
To get an assistance on this module contact us by email :arrow_right: help@itpp.dev
Contributors
============
* Ildar Nasyrov <Nasyrov@it-projects.info>
* Ivan Yelizariev <yelizariev@it-projects.info>
===================
Odoo Apps Store: https://apps.odoo.com/apps/modules/11.0/mailgun/
Notifications on updates: `via Atom <https://github.com/it-projects-llc/mail-addons/commits/11.0/mailgun.atom>`_, `by Email <https://blogtrottr.com/?subscribe=https://github.com/it-projects-llc/mail-addons/commits/11.0/malgun.atom>`_
Tested on `Odoo 11.0 <https://github.com/odoo/odoo/commit/dc61861f90d15797b19f8ebddfb0c8a66d0afa88>`_

2
mailgun/__init__.py

@ -1,2 +0,0 @@
from . import controllers
from . import models

34
mailgun/__manifest__.py

@ -1,34 +0,0 @@
# Copyright 2018 Ildar Nasyrov <https://it-projects.info/team/iledarn>
# License MIT (https://opensource.org/licenses/MIT).
{
"name": """Mailgun""",
"summary": """Setup the outgoing and incoming mail flow easily by using Mailgun""",
"category": "Discuss",
# "live_test_url": "http://apps.it-projects.info/shop/product/mailgun?version=11.0",
"images": ["images/mailgun_main.png"],
"version": "13.0.1.1.0",
"application": False,
"author": "IT-Projects LLC, Ildar Nasyrov",
"support": "apps@itpp.dev",
"website": "https://itpp.dev",
"license": "Other OSI approved licence", # MIT
"price": 195.00,
"currency": "EUR",
"depends": ["mail"],
"external_dependencies": {"python": [], "bin": []},
"data": ["data/ir_cron_data.xml"],
"demo": [],
"qweb": [],
"post_load": None,
"pre_init_hook": None,
"post_init_hook": None,
"uninstall_hook": None,
"auto_install": False,
"installable": False,
"demo_title": "Mailgun",
"demo_addons": [],
"demo_addons_hidden": [],
"demo_url": "mailgun",
"demo_summary": "Easy to send outgoing and fetch incoming messages by using Mailgun",
"demo_images": ["images/mailgun_main.png"],
}

1
mailgun/controllers/__init__.py

@ -1 +0,0 @@
from . import main

16
mailgun/controllers/main.py

@ -1,16 +0,0 @@
import re
from odoo import http
from odoo.http import request
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")
if not re.match("^https://[^/]*api.mailgun.net/", message_url):
# simple security check failed
raise Exception("wrong message-url")
request.env["mail.thread"].sudo().mailgun_fetch_message(message_url)
return "ok"

15
mailgun/data/ir_cron_data.xml

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<openerp>
<data noupdate="1">
<record id="mailgun_domain_verification" model="ir.cron">
<field name="name">Mailgun - domain verification request</field>
<field name="model_id" ref="model_ir_config_parameter" />
<field name="interval_number">10</field>
<field name="interval_type">minutes</field>
<field name="numbercall">10</field>
<field name="state">code</field>
<field name="code">model.mailgun_verify()</field>
<field name="doall" eval="True" />
</record>
</data>
</openerp>

10
mailgun/doc/changelog.rst

@ -1,10 +0,0 @@
`1.1.0`
-------
- ADD: automatic domain verification
-------
`1.0.0`
-------
- Init version

93
mailgun/doc/index.rst

@ -1,93 +0,0 @@
=========
Mailgun
=========
Installation
============
* `Install <https://odoo-development.readthedocs.io/en/latest/odoo/usage/install-module.html>`__ this module in a usual way
Configuration
=============
Mailgun-side
------------
* register or log in http://mailgun.com
* Open menu ``[[ Domains ]]`` and click on your domain, e.g. ``sandbox123*****.mailgun.org`` domain. Here you can see all the information needed to configure odoo outgoing mail feature
* Please note that state of your domain should be ``Active`` before you can use it. If it is ``Unverified``, verify it first using Mailgun FAQ - `How do I verify my domain <https://help.mailgun.com/hc/en-us/articles/202052074-How-do-I-verify-my-domain->`__
* if you are using your sandbox domain, add Authorized Recipient first (Sandbox domains are restricted to `authorized recipients <https://help.mailgun.com/hc/en-us/articles/217531258>`__ only)
* create new Route
* Open menu ``[[ Routes ]]``
* Click ``[Create Route]`` button
* **Expression Type** - ``Custom``
* **Raw Expression** - ``match_recipient('.*@<your mail domain>')``
* **Actions** - ``Store and notify``, ``http://<your odoo domain>/mailgun/notify``
Odoo-side
---------
* `Activate Developer Mode <https://odoo-development.readthedocs.io/en/latest/odoo/usage/debug-mode.html>`__
* Configure **Outgoung mail server**
* Open menu ``[[ Settings ]] >> Technical >> Email >> Outgoing Mail Servers``
* Edit ``localhost`` record or create new one with the following:
* **Description** - ``Mailgun``
* **SMTP Server** - take from Mailgun **SMTP Hostname** (usually, it is ``smtp.mailgun.org``)
* **Connection Security** - ``SSL/TLS``
* **Username** - take from Mailgun **Default SMTP Login**
* **Password** - take from Mailgun **Default Password**
* Click ``[Test Connection]`` button to check the connection and then ``[Save]``
* Configure **Incoming mail feature**
* Configure catchall domain
* Open menu ``Settings / General Settings``, check **External Email Servers** and edit **Alias Domain** - set it from Mailgun **Domain Name**
* Click ``[Save]`` button
* Set Mailgun API credentials
* Open menu ``[[ Settings ]] >> Parameters >> System Parameters``
* Create new parameter
* key: ``mailgun.apikey``
* Value: API Key from mailgun (``key-...``)
* Click ``[Save]`` button
* Configure mail aliases and emails for users
* Open menu ``[[ Settings ]] >> Users >> Users``
* Select the ``Administrator`` user (for example, you should configure all your users the same way but using different aliases) and click ``[Edit]``
* On Preference tab edit **Alias** field - create new mail alias, e.g. ``admin@<you mail domain>`` with the following settings
* **Alias Name** - ``admin``
* **Aliased Model** - ``Users``
* **Record Thread ID** - ``1``
* **Default Values** - ``{}``
* **Alias Contact** - ``Everyone``
* **Security Owner** - ``Administrator``
* **Parent Model** - Not set
* **Parent Record Thread ID** - ``0``
* Open user's **Related Partner** and edit **Email** field - usually it should be the same as mail alias name (``admin@<you mailgun domain`` for ``Administrator``) - this would be an address for replying user's messages
Usage
=====
Outgoing
--------
* Open menu ``[[ Settings ]]>> Email >> Emails`` to create a message
* Click ``[Send Now]`` button
* RESULT: receive the message in your mail client (e.g. on gmail.com)
Incoming
--------
* Create new message from your mail client to e.g. ``admin@<you mailgun domain>``
* Open menu ``[[ Discuss ]]`` in Odoo
* RESULT: See your message there

29
mailgun/i18n/es.po

@ -1,29 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mailgun
#
# Translators:
# Randall Castro <rcastro@treintaycinco.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-19 16:49+0000\n"
"PO-Revision-Date: 2017-12-19 16:49+0000\n"
"Last-Translator: Randall Castro <rcastro@treintaycinco.com>, 2018\n"
"Language-Team: Spanish (https://www.transifex.com/it-projects-llc/teams/76080/es/)\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"
#. module: mailgun
#: model:ir.model,name:mailgun.model_mail_thread
msgid "Email Thread"
msgstr "Hilo de correo electrónico"
#. module: mailgun
#: model:ir.model,name:mailgun.model_ir_config_parameter
msgid "ir.config_parameter"
msgstr "ir.config_parameter"

BIN
mailgun/images/mailgun_main.png

Before

Width: 750  |  Height: 371  |  Size: 384 KiB

2
mailgun/models/__init__.py

@ -1,2 +0,0 @@
from . import mail_thread
from . import ir_config_parameter

33
mailgun/models/ir_config_parameter.py

@ -1,33 +0,0 @@
import logging
import requests
from odoo import api, models
try:
import simplejson as json
except ImportError:
import json
_logger = logging.getLogger(__name__)
class IrConfigParameter(models.Model):
_inherit = ["ir.config_parameter"]
@api.model
def mailgun_verify(self):
verified = self.sudo().get_param("mailgun.verified")
if verified:
return
api_key = self.sudo().get_param("mailgun.apikey")
mail_domain = self.sudo().get_param("mail.catchall.domain")
if api_key and mail_domain:
url = "https://api.mailgun.net/v3/domains/%s/verify" % mail_domain
res = requests.put(url, auth=("api", api_key))
if (
res.status_code == 200
and json.loads(res.text)["domain"]["state"] == "active"
):
self.sudo().set_param("mailgun.verified", "1")

22
mailgun/models/mail_thread.py

@ -1,22 +0,0 @@
import logging
import requests
from odoo import api, models
_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),
verify=False,
)
self.message_process(False, res.json().get("body-mime"))

BIN
mailgun/static/description/icon.png

Before

Width: 100  |  Height: 100  |  Size: 2.1 KiB

334
mailgun/static/description/index.html

@ -1,334 +0,0 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan" style="color:#875A7B;">Mailgun</h2>
<h3 class="oe_slogan">Easy to setup the outgoing and incoming mail flow</h3>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class="oe_mt32">
<div class="alert alert-success" style="padding:0.3em 0.6em; font-size: 150%;">
The module provides Odoo and Mailgun integration to be able to easily configure <em>Outgoing</em> and <em>Incoming</em> mail flow.
<div style="margin-top:2%;">
From Mailgun side you get:
<ul style="padding-left: 1.6em;">
<li style="margin-top: 0.3em;">
Powerful Sending Infrastructure
</li>
<li>
Intelligent Inbound Routing &amp; Storage
</li>
<li>
Tracking and Analytics
</li>
<li>
Email Validation
</li>
</ul>
</div>
</div>
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Mailgun Configuration</h3>
<h4 class="oe_slogan"><b>Manage Domains</b></h4>
<div class="oe_span12">
<p class="oe_mt32">
<font style="font-size: 120%;">
<ul style="padding-left: 1.4em;">
<li>
Create account on <a href="https://mailgun.com" target="_blank">Mailgun</a> service
</li>
<li>
Add domain in <b>Domains</b> menu
</li>
</ul>
Note that the state of your domain should be <b>Active</b> to be able to use it from Odoo side. To verify it follow the instruction <a href="https://help.mailgun.com/hc/en-us/articles/202052074-How-do-I-verify-my-domain-" target="_blank">How do I verify my domain</a>
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_add_domain.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
Click on added domain name and see all the information needed to configure your <em>Incoming</em> and <em>Outgoing</em> mail feature.
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_domain_details.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
If you use sandbox domain, add <b>Authorized Recipient</b> first (sandbox domains are restricted to <a href="https://help.mailgun.com/hc/en-us/articles/217531258" target="_blank">authorized recipients</a>)
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_auth_recipients.png"/>
</div>
<br/>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_auth_recipients_form.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced" style="margin-top: 5em;">
<h4 class="oe_slogan"><b>Routes</b></h4>
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
Navigate to <b>Routes</b> menu and create a new route
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_route.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class="oe_mt32">
<font style="font-size: 120%;">
Set the following fields and values:
<ul>
<li>
<b>Expression Type</b>: Custom
</li>
<li>
<b>Raw Expression</b>: match_recipient('.*@your_mail_domain')
</li>
<li>
<b>Actions</b>:
<ul>
<li>
Check the box <em>Store and notify</em>
</li>
<li>
Put there http://your_odoo_domain/mailgun/notify
</li>
</li>
</ul>
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_route_form.png"/>
</div>
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
<b>Now everything is ready to move to Odoo configuration.</b>
</font>
</p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced" style="margin-top: 6em;">
<h3 class="oe_slogan">Odoo Configuration</h3>
<h4 class="oe_slogan"><b>Outgoing Mail Feature</b></h4>
<div class="oe_span12">
<p class="oe_mt32">
<font style="font-size: 120%;">
At first, activate <a href="https://odoo-development.readthedocs.io/en/latest/odoo/usage/debug-mode.html" target="_blank">the developer mode</a>. Then go to <em>Settings &rarr; Technical &rarr; Email &rarr; Outgoing Mail Servers</em> menu and populate the following fields:
<ul>
<li>
<b>Description</b> - e.g. Mailgun
</li>
<li>
<b>SMTP Server</b> - smtp.mailgun.org
</li>
<li>
<b>Connection Security</b> - SSL/TLS
</li>
<li>
<b>Username</b> - use <em>Default SMTP Login</em> from mailgun
</li>
<li>
<b>Password</b> - use <em>Default Password</em> from mailgun
</li>
</ul>
Once the fields are populated, click <b>Test Connection</b> button to check the connection to smtp server. If everything is ok, you can see popup message <em>Connection Test Succeeded! Everything seems properly set up!</em> and you are able to send messages now.
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_odoo_outgoing.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h4 class="oe_slogan"><b>Incoming Mail Feature</b></h4>
<div class="oe_span12">
<p class="oe_mt32">
<font style="font-size: 120%;">
Note that to setup incoming mailing, it is not required to setup <em>Incoming Mail Server</em>.
<br/>
Open <em>Settings &rarr; General Settings</em> menu:
<ul>
<li>
Check the box <b>External Email Servers</b>
</li>
<li>
Set as <b>Alias Domain</b> the domain name from Mailgun
</li>
</ul>
Save the changes.
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_odoo_general.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class="oe_mt32">
<font style="font-size: 120%;">
Setup mailgun API credentials in <em>Settings &rarr; Parameters &rarr; System Parameters</em> menu. Create new parameter:
<ul>
<li>
<b>Key</b> - mailgun.apikey
</li>
<li>
<b>Value</b> - key-12345...
</li>
</ul>
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_odoo_sys_param.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
Now you can configure mail aliases for users. Go to <em>Settings &rarr; Users</em> menu and open user form (e.g. for Administrator). Then switch to <em>Preferences</em> tab and select an existing alias or create new one in the <b>Alias</b> field.
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_odoo_mail_alias.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
Open the user's related partner and set <b>Email</b> - the email is used for replying on user messages
</font>
</p>
</div>
<div class="oe_screenshot" align="center">
<img style="max-width: 80%" src="mailgun_odoo_partner_email.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
<font style="font-size: 120%;">
<b>
Everything is done! It's time to send/receive email messages now!
</b>
</font>
</p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span8">
<h2>Need our service?</h2>
<p class="oe_mt32">Contact us by <a href="mailto:apps@it-projects.info">email</a> or fill out <a href="https://www.it-projects.info/page/website.contactus " target="_blank">request form</a></p>
<ul>
<li><a href="mailto:apps@it-projects.info">apps@it-projects.info <i class="fa fa-envelope-o"></i></a></li>
<li><a href="https://www.it-projects.info/page/website.contactus " target="_blank">https://www.it-projects.info/page/website.contactus <i class="fa fa-list-alt"></i></a></li>
<li><a href="https://m.me/itprojectsllc" target="_blank">https://m.me/itprojectsllc <i class="fa fa-facebook-square"></i></a></li>
<li>skype@it-projects.info <i class="fa fa-skype"></i></li>
</ul>
</div>
<div class="oe_span4">
<div class="stamp" style="width:200px;">
<div style="margin-top: 15px;
position: relative;
font-family:'Vollkorn', serif;
font-size: 16px;
line-height: 25px;
text-transform: uppercase;
font-weight: bold;
color: #75526b;
border: 3px dashed #75526b;
float: left;
padding: 4px 12px;
-webkit-transform: rotate(6deg);
-o-transform: rotate(6deg);
-moz-transform: rotate(6deg);
-ms-transform: rotate(6deg);">
Tested on Odoo<br/>11.0 community
</div>
<div style="margin-top: 15px;
position: relative;
font-family:'Vollkorn', serif;
font-size: 16px;
line-height: 25px;
text-transform: uppercase;
font-weight: bold;
color: #75526b;
border: 3px dashed #75526b;
float: left;
padding: 4px 12px;
-webkit-transform: rotate(-7deg);
-o-transform: rotate(-7deg);
-moz-transform: rotate(-7deg);
-ms-transform: rotate(-7deg);">
Tested on Odoo<br/>11.0 enterprise
</div>
</div>
</div>
</div>
</section>

BIN
mailgun/static/description/mailgun_add_domain.png

Before

Width: 1196  |  Height: 509  |  Size: 133 KiB

BIN
mailgun/static/description/mailgun_auth_recipients.png

Before

Width: 1135  |  Height: 916  |  Size: 150 KiB

BIN
mailgun/static/description/mailgun_auth_recipients_form.png

Before

Width: 1079  |  Height: 443  |  Size: 68 KiB

BIN
mailgun/static/description/mailgun_domain_details.png

Before

Width: 1209  |  Height: 916  |  Size: 135 KiB

BIN
mailgun/static/description/mailgun_odoo_general.png

Before

Width: 1257  |  Height: 681  |  Size: 112 KiB

BIN
mailgun/static/description/mailgun_odoo_mail_alias.png

Before

Width: 1192  |  Height: 647  |  Size: 113 KiB

BIN
mailgun/static/description/mailgun_odoo_outgoing.png

Before

Width: 1186  |  Height: 671  |  Size: 114 KiB

BIN
mailgun/static/description/mailgun_odoo_partner_email.png

Before

Width: 969  |  Height: 653  |  Size: 83 KiB

BIN
mailgun/static/description/mailgun_odoo_sys_param.png

Before

Width: 1192  |  Height: 647  |  Size: 108 KiB

BIN
mailgun/static/description/mailgun_route.png

Before

Width: 1179  |  Height: 921  |  Size: 287 KiB

BIN
mailgun/static/description/mailgun_route_form.png

Before

Width: 1179  |  Height: 921  |  Size: 201 KiB

Loading…
Cancel
Save