George Daramouskas
6 years ago
No known key found for this signature in database
GPG Key ID: 5B4EF742F8CD859C
8 changed files with 221 additions and 0 deletions
-
78mail_embed_image/README.rst
-
4mail_embed_image/__init__.py
-
18mail_embed_image/__manifest__.py
-
4mail_embed_image/models/__init__.py
-
88mail_embed_image/models/ir_mail_server.py
-
BINmail_embed_image/static/description/icon.png
-
4mail_embed_image/tests/__init__.py
-
25mail_embed_image/tests/test_mail_embed_image.py
@ -0,0 +1,78 @@ |
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
|
|||
================ |
|||
mail_embed_image |
|||
================ |
|||
|
|||
This module was written to extend the functionality of ... to support ... |
|||
and allow you to ... |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
To install this module, you need to: |
|||
|
|||
#. do this ... |
|||
|
|||
Configuration |
|||
============= |
|||
|
|||
To configure this module, you need to: |
|||
|
|||
#. go to ... |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
To use this module, you need to: |
|||
|
|||
#. go to ... |
|||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
|||
:alt: Try me on Runbot |
|||
:target: https://runbot.odoo-community.org/runbot/205/10.0 |
|||
|
|||
|
|||
Known issues / Roadmap |
|||
====================== |
|||
|
|||
* Some src attributes might contain data instead of urls. Deal with it. |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues |
|||
<https://github.com/OCA/social/issues>`_. In case of trouble, please |
|||
check there if your issue has already been reported. If you spotted it first, |
|||
help us smashing it by providing a detailed and welcomed feedback. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Images |
|||
------ |
|||
|
|||
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* George Daramouskas <gdaramouskas@therp.nl> |
|||
|
|||
Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list <mailto:community@mail.odoo.com>`_ or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use. |
|||
|
|||
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from . import models |
@ -0,0 +1,18 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
{ |
|||
"name": "mail_embed_image", |
|||
"version": "10.0.1.0.0", |
|||
"author": "Therp BV,Odoo Community Association (OCA)", |
|||
"license": "AGPL-3", |
|||
"category": "", |
|||
"summary": "", |
|||
"depends": [ |
|||
'mail', |
|||
], |
|||
"data": [ |
|||
], |
|||
"installable": True, |
|||
"application": False, |
|||
} |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from . import ir_mail_server |
@ -0,0 +1,88 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
import requests |
|||
import uuid |
|||
from odoo import models |
|||
from odoo.addons.base.ir.ir_mail_server import encode_header_param |
|||
from lxml.html.soupparser import fromstring |
|||
from lxml import etree |
|||
from base64 import b64encode |
|||
from email.mime.base import MIMEBase |
|||
from email import Encoders |
|||
|
|||
|
|||
class IrMailServer(models.Model): |
|||
_inherit = 'ir.mail_server' |
|||
|
|||
def build_email( |
|||
self, |
|||
email_from, |
|||
email_to, |
|||
subject, |
|||
body, |
|||
email_cc=None, |
|||
email_bcc=None, |
|||
reply_to=None, |
|||
attachments=None, |
|||
message_id=None, |
|||
references=None, |
|||
object_id=None, |
|||
subtype='plain', |
|||
headers=None, |
|||
body_alternative=None, |
|||
subtype_alternative='plain'): |
|||
result = super(IrMailServer, self).build_email( |
|||
email_from, |
|||
email_to, |
|||
subject, |
|||
body, |
|||
email_cc, |
|||
email_bcc, |
|||
reply_to, |
|||
attachments, |
|||
message_id, |
|||
references, |
|||
object_id, |
|||
subtype, |
|||
headers, |
|||
body_alternative, |
|||
subtype_alternative, |
|||
) |
|||
|
|||
def replace_img_src(msg, attachments): |
|||
"""replace_img_src Given a message, find it's img tags and if they |
|||
are URLs, replace them with cids |
|||
|
|||
:param msg: A email.message.Message |
|||
""" |
|||
if msg.is_multipart(): |
|||
for part in msg.get_payload(): |
|||
replace_img_src(part, attachments) |
|||
else: |
|||
if msg.get_content_subtype() == 'html': |
|||
body = msg.get_payload(decode=True) |
|||
root = fromstring(body) |
|||
for img in root.xpath('//img'): |
|||
src = img.get('src') |
|||
if src.startswith('http'): |
|||
content = requests.get(src).content |
|||
content_base64 = b64encode(content) |
|||
cid = uuid.uuid4().hex |
|||
filename_rfc2047 = encode_header_param(cid) |
|||
part = MIMEBase('application', 'octet-stream') |
|||
part.set_param('name', filename_rfc2047) |
|||
part.add_header( |
|||
'Content-Disposition', |
|||
'attachment', |
|||
cid=cid, |
|||
filename=filename_rfc2047, |
|||
content=content_base64, |
|||
) |
|||
part.set_payload(content) |
|||
Encoders.encode_base64(part) |
|||
result.attach(part) |
|||
img.set('src', 'cid:%s' % (cid)) |
|||
msg.set_payload(etree.tostring(root)) |
|||
replace_img_src(result, attachments) |
|||
return result |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from . import test_mail_embed_image |
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2019 Therp BV <https://therp.nl> |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from openerp.tests.common import TransactionCase |
|||
from lxml import etree |
|||
|
|||
|
|||
class TestMailEmbedImage(TransactionCase): |
|||
|
|||
post_install = True |
|||
at_install = False |
|||
|
|||
def test_mail_embed_image(self): |
|||
server = self.env['ir.mail_server'] |
|||
root = etree.Element('div') |
|||
etree.SubElement(root, 'img') |
|||
etree.SubElement(root, 'img') |
|||
body = etree.tostring(root) |
|||
message = server.build_email( |
|||
'test@example.com', |
|||
'test@example.com', |
|||
'subject', |
|||
body, |
|||
) |
|||
# TODO assertions |
Write
Preview
Loading…
Cancel
Save
Reference in new issue