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
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
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
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]