ATTACHMENT_FILENAME = '2018年度公开课计划表.xlsx'
+LATIN1_MAIL = b'\n'.join((
+ b'Return-Path: <postmaster@vm1.net.lan>',
+ b'Received: from vm1.net.lan ([unix socket])',
+ b'\t by vm1.net.lan with LMTPA;',
+ b'\t Mon, 15 Jul 2019 09:08:56 +0200',
+ b'X-Sieve: CMU Sieve 2.4',
+ b'Received: from localhost (vm1.net.lan [127.0.0.1])',
+ b'\tby localhost (Postfix) with ESMTP id E7BBE1F460',
+ b'\tfor <postmaster@vm1.net.lan>; Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+ b'X-Virus-Scanned: by Intra2net Mail Security (AVE=8.3.54.20,VDF=8.15.29.48)',
+ b'X-Spam-Status: No, score=-208 required=5 tests=[ALL_INTERNAL=-200,',
+ b'\tALL_TRUSTED=-2, BAYES_00=-6] autolearn=Intra2net',
+ b'X-Spam-Level: 0',
+ b'Received: from vm1.net.lan ([127.0.0.1]) by vm1.net.lan (Postfix, from userid 0)',
+ b'\tid 97AD81F45E; Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+ b'Content-Type: text/plain; charset="iso-8859-1"',
+ b'To: postmaster@vm1.net.lan',
+ b'From: postmaster@vm1.net.lan',
+ b'Subject: Intra2net Business Server Update: Version 6.6.0 installiert',
+ b'Message-Id: <20190715070856.97AD81F45E@vm1.net.lan>',
+ b'Date: Mon, 15 Jul 2019 09:08:56 +0200 (CEST)',
+ b'',
+ b'Eine neue Intra2net Business Server Version wurde vom Update-System installiert.',
+ b'Diese Version bringt folgende Neuerungen:',
+ b'',
+ b'Version: 6.6.0',
+ b'',
+ b'- Neuer Linux Kernel 4.19 steigert die Systemleistung',
+ b' - Bis zu 30% h\xf6herer Durchsatz in der E-Mailverarbeitung',
+ b' - Aktualisierte Treiber f\xfcr neue und bestehende Hardware',
+ b' - Beschleunigter TCP-Verbindungsaufbau und mehr Durchsatz',
+ b' - Viele neue Schutzfunktionen um Angriffe zu erschweren',
+ b' - Performance bei Systemen mit 8GB und mehr Arbeitsspeicher gesteigert',
+ b' - Neueste Version der VMware- und Hyper-V-Tools',
+ b'',
+ b'- Weitere Verbesserungen',
+ b' - Der Anhangfilter kann jetzt schreibgesch\xfctzte',
+ b' Excel-Dateien auf gef\xe4hrliche Makros untersuchen',
+ b' - Schutz vor Durchprobieren von Passw\xf6rtern aus dem Internet versch\xe4rft',
+ b' - Aktualisierte Spamfilter-Regeln',
+ b'',
+ b'- Kumulatives Sicherheitsupdate behebt 14 Schwachstellen',
+ b' (ImageMagick-7.0.8-50, curl-7.65.1: CVE-2019-5435, libxml2-2.9.9:',
+ b' CVE-2018-9251, CVE-2018-14567 und CVE-2018-14404, libxslt-1.1.33:',
+ b' CVE-2019-11068, poppler-0.78.0, python-3.7.3: CVE-2019-9636, CVE-2019-9740',
+ b' und CVE-2019-9947, python37-urllib3-1.24.3: CVE-2019-9740, sqlite-3.26.0:',
+ b' CVE-2019-5827, CVE-2019-9936 und CVE-2019-9937)',
+ b'',
+ b'- Aktualisierung von Linux-Basisdiensten',
+ b' (file-5.37, glib2-2.58.3, hyperv-daemons-20190303, iproute2-5.0,',
+ b' iptables-1.8.3, kernel-4.19.57, linux-firmware-2019-06-18, mdadm-4.1,',
+ b' open-vm-tools-10.3.10, openssl-1.0.2s, python37-oletools-0.54.2,',
+ b' savapi-4.11.1)',
+ b'',
+ b'',
+ b'Hinweis: Dieses Update enth\xe4lt weiterhin einen 32-Bit Kernel.',
+ b'Der 64-Bit Kernel wird erst mit Update 6.7.0 im Herbst kommen.',
+))
class MailUtilsFunctionTest(unittest.TestCase):
msg.set_unixfrom('Autotest-Sender@localhost')
self.assertEqual(mail_utils.parse_mail_date(msg), result)
+
+ def test_latin1_mail(self):
+ """Check reading mail with non-ascii chars not encoded with utf8"""
+ mail_file = join(self.temp_dir, 'update-mail')
+ with open(mail_file, 'xb') as writer:
+ writer.write(LATIN1_MAIL)
+
+ # check this does not raise a UnicodeDecodeError
+ msg1 = mail_utils.parse_mail_file(mail_file, headers_only=False)
+ msg2, fnames = mail_utils.parse_mail_file(mail_file, headers_only=True,
+ attachment_filenames=True)
+ self.assertTupleEqual(fnames, tuple())
+
+ # check basic parsing worked
+ for msg in (msg1, msg2):
+ self.assertEqual(mail_utils.parse_mail_date(msg)
+ .replace(tzinfo=None), dt(2019, 7, 15, 9, 8, 56))
+ self.assertEqual(msg['Subject'],
+ 'Intra2net Business Server Update: '
+ 'Version 6.6.0 installiert')
+ self.assertEqual(msg['Content-Type'],
+ 'text/plain; charset="iso-8859-1"')
+
+ # also test text finder
+ text = mail_utils.get_message_text(mail_file)
+ self.assertIn('Neuer Linux Kernel 4.19', text)
+ self.assertIn('30% höherer Durchsatz in der E-Mailverarbeitung', text)
+ self.assertIn('gefährliche Makros', text)