diff --git a/.gitignore b/.gitignore index 2f169e7..ad5b6a7 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ nosetests.xml venv/ .env +/tmp-emails/ diff --git a/AUTHORS.rst b/AUTHORS.rst index bee2424..2e427f7 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -10,6 +10,7 @@ With inputs and contributions from (in chronological order): - `@smihai `_ - `@Daviey `_ - `@positiveviking `_ +- `@MrTango `_ See `all Github contributors `_ diff --git a/emails/store/file.py b/emails/store/file.py index 4a9d26a..2ee7aeb 100644 --- a/emails/store/file.py +++ b/emails/store/file.py @@ -1,6 +1,7 @@ # encoding: utf-8 from __future__ import unicode_literals +import imghdr import uuid from mimetypes import guess_type from email.mime.base import MIMEBase @@ -99,6 +100,10 @@ def get_mime_type(self): filename = self.filename if filename: r = self._mime_type = guess_type(filename)[0] + if not r: + img_mime_type = imghdr.what(filename, h=self.data) + if img_mime_type: + r = "image/{0}".format(img_mime_type) if not r: r = MIMETYPE_UNKNOWN self._mime_type = r diff --git a/emails/testsuite/store/test_store.py b/emails/testsuite/store/test_store.py index 4d8d365..f7eb09e 100644 --- a/emails/testsuite/store/test_store.py +++ b/emails/testsuite/store/test_store.py @@ -25,6 +25,35 @@ def test_attachment_headers(): assert 'X-Header: X' in part +def test_get_mime_type_by_extension(): + f = emails.store.BaseFile(data='x', filename='logo.jpg') + assert f.mime_type == 'image/jpeg' + + +def test_get_mime_type_from_data_jpeg(): + f = emails.store.BaseFile( + data=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01', + filename='thumb', + ) + assert f.mime_type == 'image/jpeg' + + +def test_get_mime_type_from_data_png(): + f = emails.store.BaseFile( + data=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d', + filename='thumb', + ) + assert f.mime_type == 'image/png' + + +def test_get_mime_type_from_data_gif(): + f = emails.store.BaseFile( + data=b'GIF89a\xd3\x00G\x00\xf7\x00\x00\xff\xff', + filename='thumb', + ) + assert f.mime_type == 'image/gif' + + def test_store_commons(): FILES = [{'data': 'aaa', 'filename': 'aaa.txt'}, {'data': 'bbb', 'filename': 'bbb.txt'}, ] store = emails.store.MemoryFileStore()