You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.2 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2019 Therp BV <https://therp.nl>
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. import requests
  5. import uuid
  6. from odoo import models
  7. from odoo.addons.base.ir.ir_mail_server import encode_header_param
  8. from lxml.html.soupparser import fromstring
  9. from lxml import etree
  10. from base64 import b64encode
  11. from email.mime.image import MIMEImage
  12. from email import Encoders
  13. class IrMailServer(models.Model):
  14. _inherit = 'ir.mail_server'
  15. def build_email(
  16. self,
  17. email_from,
  18. email_to,
  19. subject,
  20. body,
  21. email_cc=None,
  22. email_bcc=None,
  23. reply_to=None,
  24. attachments=None,
  25. message_id=None,
  26. references=None,
  27. object_id=None,
  28. subtype='plain',
  29. headers=None,
  30. body_alternative=None,
  31. subtype_alternative='plain'):
  32. result = super(IrMailServer, self).build_email(
  33. email_from,
  34. email_to,
  35. subject,
  36. body,
  37. email_cc=email_cc,
  38. email_bcc=email_bcc,
  39. reply_to=reply_to,
  40. attachments=attachments,
  41. message_id=message_id,
  42. references=references,
  43. object_id=object_id,
  44. subtype=subtype,
  45. headers=headers,
  46. body_alternative=body_alternative,
  47. subtype_alternative=subtype_alternative,
  48. )
  49. def _build_email_replace_img_src(msg, attachments):
  50. """ Given a message, find it's img tags and if they
  51. are URLs, replace them with cids.
  52. :param msg: A email.message.Message
  53. """
  54. if msg.is_multipart():
  55. for part in msg.get_payload():
  56. _build_email_replace_img_src(part, attachments)
  57. else:
  58. if msg.get_content_subtype() == 'html':
  59. body = msg.get_payload(decode=True)
  60. root = fromstring(body)
  61. for img in root.xpath(
  62. "//img[starts-with(@src, '/web/image')]"):
  63. base_url = self.env['ir.config_parameter'].get_param(
  64. 'web.base.url')
  65. src = base_url + img.get('src')
  66. response = requests.get(src)
  67. #content_base64 = b64encode(response.content)
  68. cid = uuid.uuid4().hex
  69. filename_rfc2047 = encode_header_param(cid)
  70. part = MIMEImage(response.content)
  71. part.set_param('name', filename_rfc2047)
  72. part.add_header(
  73. 'Content-Disposition',
  74. 'attachment',
  75. cid=cid,
  76. filename=filename_rfc2047,
  77. )
  78. part.set_payload(response.content)
  79. Encoders.encode_base64(part)
  80. result.attach(part)
  81. img.set('src', 'cid:%s' % (cid))
  82. msg.set_payload(etree.tostring(root))
  83. _build_email_replace_img_src(result, attachments)
  84. return result