Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion mailparser_reply/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})',
Expand Down
Empty file added test/__init__.py
Empty file.
62 changes: 62 additions & 0 deletions test/emails/email_schrieb_am.txt
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions test/test_email_reply_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading