diff --git a/mailparser_reply/constants.py b/mailparser_reply/constants.py index bf57794..0213a5b 100644 --- a/mailparser_reply/constants.py +++ b/mailparser_reply/constants.py @@ -76,9 +76,11 @@ 'sent_from': 'Sent from my|Get Outlook for', }, 'de': { - 'wrote_header': r'^(?!Am.*Am\s.+?schrieb.*:)(' + 'wrote_header': [r'^(?!Am.*Am\s.+?schrieb.*:)(' + QUOTED_MATCH_INCLUDE + r'Am\s(?:.+?\s?)schrieb\s(?:.+?\s?.+?):)$', + r'^(\s*(?:> ?)*[^\s<>]+@[^\s<>]+>?\s*schrieb\s*am\s+.+?:\s*)$' + ], 'from_header': r'((?:(?:^|\n|\n' + QUOTED_MATCH_INCLUDE + r')[* ]*(?:Von|Gesendet|An|Betreff|Datum|Cc|Organisation):[ *]*(?:\s{,2}).*){2,}(?:\n.*){,1})', diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/emails/email_schrieb_am.txt b/test/emails/email_schrieb_am.txt new file mode 100644 index 0000000..c899df6 --- /dev/null +++ b/test/emails/email_schrieb_am.txt @@ -0,0 +1,62 @@ +Guten Abend, + +Ich habe soeben eine Zahlungserinnerung bezüglich der Rechnung vom 29/09 erhalten. + +Ich habe den Betrag nicht überwiesen, da die Lizenz für die Software nie aktiviert wurde und Sie mir geraten hatten, mich direkt mit dem Hersteller des Produkts in Verbindung zu setzen. Das habe ich getan, aber bisher keine Rückmeldung erhalten. + +Mit freundlichen Grüßen, + +Alex Beispiel + +support@techportal.com> schrieb am Mi. 3. Okt. 2025 um 17:26: + +> Sehr geehrter Herr Beispiel +> +> +> +> In diesem Fall stehen Aussage gegen Aussage. Da wir als Vermittlungsplattform nicht abschließend bewerten können, welche Partei korrekt handelt, schlagen wir vor, dass Sie direkt mit dem Anbieter kommunizieren und eine Lösung finden. +> +> +> +> Mögliche Optionen könnten sein: +> +> * Eine neue Lizenzaktivierung durch die Firma SoftLine GmbH +> * Oder: eine reduzierte Rechnung über 30 EUR für den bisherigen Aufwand +> * Oder eine alternative Lösung, mit der beide Parteien einverstanden sind +> +> +> +> Hier finden Sie die Kontaktdaten der Firma: +> +> SoftLine GmbH +> +> Technoweg 7/4 1010 +> +> Beispielstadt +> +> +491778889900 +> +> softline-support@gmx.net +> +> +> +> Mit besten Grüßen +> +> **Martina Musterfrau** +> +> +> **TechPortal Support** +> +> TechPort GmbH +> +> Digitalstraße 12/5 · 54321 Musterstadt · GERMANY +> +> HRB: 999999 · Amtsgericht Musterstadt +> +> USt-ID: DE1234751230 +> +> support@techportal.com +> +> +> +> +49 (0) 123 456 789 diff --git a/test/test_email_reply_parser.py b/test/test_email_reply_parser.py index 1b127a7..287ef0b 100644 --- a/test/test_email_reply_parser.py +++ b/test/test_email_reply_parser.py @@ -211,6 +211,22 @@ def test_swedish_realistic_anonymized(self): self.assertIn("Kan inte se att det står något", mail.replies[1].body) self.assertIn("Jag har försökt få tag", mail.replies[2].body) + def test_german_schrieb_am_email(self): + mail = self.get_email('email_schrieb_am', parse=True, languages=['de']) + + # Should be split into customer reply and quoted response + self.assertEqual(2, len(mail.replies)) + + # The latest reply (customer complaint) + self.assertIn("Zahlungserinnerung bezüglich der Rechnung", mail.replies[0].body) + self.assertNotIn("Zahlungserinnerung bezüglich der Rechnung", mail.replies[1].body) + self.assertIn("In diesem Fall stehen Aussage gegen Aussage", mail.replies[1].body) + self.assertNotIn("In diesem Fall stehen Aussage gegen Aussage", mail.replies[0].body) + + # The quoted reply should have "schrieb am" in headers + self.assertIn("schrieb am", mail.replies[1].headers) + self.assertTrue(mail.replies[1].body.strip().startswith("> Sehr geehrter Herr Beispiel")) + def get_email(self, name: str, parse: bool = True, languages: list = None): """ Return EmailMessage instance or text content """ with open(f'test/emails/{name}.txt', encoding='utf-8') as f: