Пример #1
0
 def _build_email_process_img_body(self, root, email):
     base_url = self.env['ir.config_parameter'].get_param('web.base.url')
     for img in root.xpath(".//img[starts-with(@src, '%s/web/image')]"
                           "| .//img[starts-with(@src, '/web/image')]" %
                           (base_url)):
         image_path = img.get('src').replace(base_url, '')
         with self._fetch_image(image_path) as (endpoint, arguments):
             # now go ahead and call the endpoint and fetch the data
             response = endpoint.method(**arguments)
             if not response or response.status_code != 200:
                 logger.warning('Could not get %s', img.get('src'))
                 continue
             cid = uuid.uuid4().hex
             filename_rfc2047 = encode_header_param(cid)
             filepart = MIMEImage(response.data)
             # TODO check if filepart exists (do not attach twice)
             filepart.set_param('name', filename_rfc2047)
             filepart.add_header(
                 'Content-Disposition',
                 'inline',
                 cid=cid,
                 filename=filename_rfc2047,
             )
             # attach the image into the email as attachment
             email.attach(filepart)
             img.set('src', 'cid:%s' % (str(cid)))
     return root
    def test_attached_images(self):
        image_filename = SAMPLE_IMAGE_FILENAME
        image_path = sample_image_path(image_filename)
        image_data = sample_image_content(image_filename)

        self.message.attach_file(image_path)  # option 1: attach as a file

        image = MIMEImage(
            image_data
        )  # option 2: construct the MIMEImage and attach it directly
        image.set_param("filename", "custom-filename",
                        "Content-Disposition")  # Mailgun requires filenames
        self.message.attach(image)

        self.message.send()
        files = self.get_api_call_files()
        attachments = [
            value for (field, value) in files if field == 'attachment'
        ]
        self.assertEqual(len(attachments), 2)
        self.assertEqual(attachments[0],
                         (image_filename, image_data, 'image/png'))
        self.assertEqual(attachments[1],
                         ("custom-filename", image_data, 'image/png'))
        # Make sure the image attachments are not treated as inline:
        inlines = [value for (field, value) in files if field == 'inline']
        self.assertEqual(len(inlines), 0)
def getMIMEImage(pic):
    fp = open(PIC_PATH + pic, 'rb')
    imageType = mimetypes.guess_type(PIC_PATH + pic)
    image = MIMEImage(fp.read(),imageType[0].split('/')[1])
    fp.close()
    image.add_header('Content-Disposition', 'attachment')
    image.set_param('filename', pic, header = 'Content-Disposition', charset = 'gb2312')

    return image
Пример #4
0
    def attachImage(self,
                    content_id=None,
                    jpeg=True,
                    content_type=None,
                    content_type_add_filename=False,
                    inline=False,
                    force_filename=False,
                    extension=None):
        if jpeg:
            real_filename = self.JPG_FILENAME
            file_suffix = 'jpg' if extension is None else extension
        else:
            real_filename = self.PNG_FILENAME
            file_suffix = 'png' if extension is None else extension

        if file_suffix != '':
            suffix = "." + file_suffix
        else:
            suffix = file_suffix

        with tempfile.NamedTemporaryFile(prefix="email2pdf_unittest_image",
                                         suffix=suffix) as temp_file:
            _, basic_file_name = os.path.split(temp_file.name)

        with open(real_filename, 'rb') as image_file:
            image = MIMEImage(image_file.read())
            if content_id:
                image.add_header('Content-ID', content_id)

            if content_type:
                self._replace_header(image, 'Content-Type', content_type)

            if content_type_add_filename:
                image.set_param('name', basic_file_name, header='Content-Type')

            if inline:
                if force_filename:
                    self._replace_header(
                        image, 'Content-Disposition',
                        'inline; filename="%s"' % basic_file_name)
                else:
                    self._replace_header(image, 'Content-Disposition',
                                         'inline')
            else:
                self._replace_header(
                    image, 'Content-Disposition',
                    'attachment; filename="%s"' % basic_file_name)
            self.msg.attach(image)

        if inline and not force_filename:
            return None
        else:
            return basic_file_name
Пример #5
0
    def attachImage(self, content_id=None, jpeg=True, content_type=None, content_type_add_filename=False, inline=False, force_filename=False, extension=None):
        if jpeg:
            real_filename = self.JPG_FILENAME
            file_suffix = 'jpg' if extension is None else extension
        else:
            real_filename = self.PNG_FILENAME
            file_suffix = 'png' if extension is None else extension

        if file_suffix != '':
            suffix = "." + file_suffix
        else:
            suffix = file_suffix

        with tempfile.NamedTemporaryFile(prefix="email2pdf_unittest_image", suffix=suffix) as temp_file:
            _, basic_file_name = os.path.split(temp_file.name)

        with open(real_filename, 'rb') as image_file:
            image = MIMEImage(image_file.read())
            if content_id:
                image.add_header('Content-ID', content_id)

            if content_type:
                self._replace_header(image, 'Content-Type', content_type)

            if content_type_add_filename:
                image.set_param('name', basic_file_name, header='Content-Type')

            if inline:
                if force_filename:
                    self._replace_header(image, 'Content-Disposition', 'inline; filename="%s"' % basic_file_name)
                else:
                    self._replace_header(image, 'Content-Disposition', 'inline')
            else:
                self._replace_header(image, 'Content-Disposition', 'attachment; filename="%s"' % basic_file_name)
            self.msg.attach(image)

        if inline and not force_filename:
            return None
        else:
            return basic_file_name
Пример #6
0
    def test_mime(self):
        """
        Tests MIMEImage support for the EmailMultiAlternatives class
        """
        msg = EmailMultiAlternatives(
            subject="Hello, World!",
            body=" ",
            from_email="Sam Smith <*****@*****.**>",
            to=["John Doe <*****@*****.**>", "*****@*****.**"],
        )

        content = '<body><img src="cid:linux_penguin" /></body>'
        msg.attach_alternative(content, "text/html")
        with open("test/linux-penguin.png", "rb") as f:
            img = MIMEImage(f.read())
            img.add_header("Content-ID", "<linux_penguin>")
            msg.attach(img)

        with open("test/linux-penguin.png", "rb") as f:
            img = MIMEImage(f.read())
            img.add_header("Content-ID", "<linux_penguin_with_method>")
            img.set_param("method", "REQUEST")
            msg.attach(img)

        result = self.backend._build_sg_mail(msg)
        self.assertEqual(len(result["content"]), 2)
        self.assertDictEqual(result["content"][0], {
            "type": "text/plain",
            "value": " "
        })
        self.assertDictEqual(result["content"][1], {
            "type": "text/html",
            "value": content
        })
        self.assertEqual(len(result["attachments"]), 2)

        # First test image with no method param
        found_first_img = False
        found_second_img = False

        for attch in result["attachments"]:
            content_id = attch["content_id"]
            if content_id == "linux_penguin":
                found_first_img = True

                with open("test/linux-penguin.png", "rb") as f:
                    self.assertEqual(
                        bytearray(attch["content"], "utf-8"),
                        base64.b64encode(f.read()),
                    )
                self.assertEqual(attch["type"], "image/png")
            elif content_id == "linux_penguin_with_method":
                found_second_img = True
                self.assertEqual(attch["type"], "image/png; method=REQUEST;")
            else:
                raise Exception(f"Unexpected content_id {content_id}")

        self.assertTrue(found_first_img and found_second_img)

        # Next test image with method param
        img1 = result["attachments"][1]