Handle PDFs as application/octet-streams.

This commit is contained in:
Andrew Ferrier 2014-10-04 17:02:44 +01:00
parent ea0adea08c
commit 76bc8790f0
2 changed files with 33 additions and 9 deletions

View file

@ -86,21 +86,29 @@ def main():
def handle_pdf_parts(email, output_directory):
parts = find_all_parts(email, "application/pdf")
maybeParts = find_all_parts(email, "application/octet-stream")
for maybePart in maybeParts:
filename = extract_part_filename(maybePart)
unused_base, ext = os.path.splitext(filename)
if ext.lower() == '.pdf':
parts.append(maybePart)
for part in parts:
payload = part.get_payload(decode=True)
filename = part.get_filename()
if decode_header(filename)[0][1] is not None:
filename = str(decode_header(filename)[0][0]).decode(decode_header(filename)[0][1])
filename = extract_part_filename(part)
fullFilename = os.path.join(output_directory, filename)
fullFilename = get_unique_version(fullFilename)
payload = part.get_payload(decode=True)
with open(fullFilename, 'wb') as output_file:
output_file.write(payload)
def extract_part_filename(part):
filename = part.get_filename()
if decode_header(filename)[0][1] is not None:
filename = str(decode_header(filename)[0][0]).decode(decode_header(filename)[0][1])
return filename
def get_unique_version(filename):
# From here: http://stackoverflow.com/q/183480/27641

View file

@ -76,15 +76,15 @@ class BaseTestClasses:
def attachText(self, content):
self.msg.attach(MIMEText(content, 'plain'))
def attachPDF(self, string):
unused_f_handle, file_name = tempfile.mkstemp(prefix="email2pdf_unittest_file", suffix=".pdf")
def attachPDF(self, string, fileSuffix="pdf", mainContentType="application", subContentType="pdf"):
unused_f_handle, file_name = tempfile.mkstemp(prefix="email2pdf_unittest_file", suffix="." + fileSuffix)
try:
cv = canvas.Canvas(file_name)
cv.drawString(0, 500, string)
cv.save()
part = MIMEBase('application', "pdf")
part = MIMEBase(mainContentType, subContentType)
openHandle = open(file_name, "rb")
part.set_payload(openHandle.read())
encoders.encode_base64(part)
@ -162,7 +162,9 @@ class TestMIME(BaseTestClasses.Email2PDFTestCase):
def test_plain(self):
self.addHeaders("From", "To", "Subject")
self.attachText("Some basic textual content")
filename = self.attachPDF("Some PDF content", mainContentType="application", subContentType="octet-stream")
self.assertEqual(self.invokeEmail2PDF(), 0)
self.assertTrue(os.path.exists(filename))
def test_html(self):
self.addHeaders("From", "To", "Subject")
@ -182,6 +184,20 @@ class TestMIME(BaseTestClasses.Email2PDFTestCase):
self.assertEqual(self.invokeEmail2PDF(), 0)
self.assertTrue(os.path.exists(filename))
def test_pdfAsOctetStream(self):
self.addHeaders("From", "To", "Subject")
self.attachText("Some basic textual content")
filename = self.attachPDF("Some PDF content", mainContentType="application", subContentType="octet-stream")
self.assertEqual(self.invokeEmail2PDF(), 0)
self.assertTrue(os.path.exists(filename))
def test_somethingElseAsOctetStream(self):
self.addHeaders("From", "To", "Subject")
self.attachText("Some basic textual content")
filename = self.attachPDF("Some PDF content", fileSuffix="xyz", mainContentType="application", subContentType="octet-stream")
self.assertEqual(self.invokeEmail2PDF(), 0)
self.assertFalse(os.path.exists(filename))
def test_2pdfs(self):
self.addHeaders("From", "To", "Subject")
self.attachText("Some basic textual content")