Mail clients handle reply formatting differently, making reliable parsing difficult. Thank god we have standards. This library splits text-based emails into separate replies based on common headers produced by different, multilingual clients usually indicating separation.
Replies can either present the whole mail message body, or strip headers, signatures and common disclaimers if required. Currently supported languages are:
- Dutch (
nl) ๐ณ๐ฑ - English (
en) ๐ฌ๐ง - French (
fr) ๐ซ๐ท - German (
de) ๐ฉ๐ช - Italian (
it) ๐ฎ๐น - Japanese (
ja) ๐ฏ๐ต - Polish (
pl) ๐ต๐ฑ - Swedish (
sv) ๐ธ๐ช - Czech (
cs) ๐จ๐ฟ (untested - contributions welcome!) - Spanish (
es) ๐ช๐ธ (untested - contributions welcome!) - Korean (
ko) ๐ฐ๐ท (untested - contributions welcome!) - Chinese (
zh) ๐จ๐ณ (untested - contributions welcome!)
๐ณ๏ธโ๐ Adding more languages is quite easy!
This is an improved Python implementation of GitHub's Ruby-based email_reply_parser and an adaptation of Zapier's email-reply-parser which both split the mails in fragments instead of distinct replies. They also only support English.
โญ Easy to implement
โญ Multilanguage Support
โญ Text-based mail parsing
โญ Detect headers, signatures and disclaimers
โญ Fully type annotated
โญ Easy-to-read code and well-tested
This library makes it easy to split an incoming mail into replies, making working with emails much more manageable and easily providing the text content for each reply โ with or without signatures, disclaimers and headers.
For example, it can turn the following email:
Awesome! I haven't had another problem with it. Thanks, alfonsrv On Wed, Dec 20, 2023 at 13:37, RAUSYS <info@rausys.de> wrote: > The good news is that I've found a much better query for lastLocation. > It should run much faster now. Can you double-check? Into just the replied text content:
Awesome! I haven't had another problem with it. pip install mail-parser-replyfrom mailparser_reply import EmailReplyParser mail_body = 'foobar'; languages = ['en', 'de'] mail_message = EmailReplyParser(languages=languages).read(text=mail_body) print(mail_message.replies)Or get only the latest reply using:
latest_reply = EmailReplyParser(languages=languages).parse_reply(text=mail_body)EmailMessage.text: Mail body EmailMessage.languages: Languages to use for parsing headers EmailMessage.replies: List of EmailReply; single parsed replies EmailMessage.include_english: Always include English language for parsing EmailMessage.keep_hyphen_lists: Don't capture hyphen marked lists as signatures EmailMessage.default_language: Default language to use if language dictionary doesn't include any other language codes EmailMessage.HEADER_REGEX: RegEx for identifying headers, separating mails EmailMessage.SIGNATURE_REGEX: RegEx for identifying signatures EmailMessage.DISCLAIMERS_REGEX: RegEx for identifying disclaimers EmailMessage.read(): Parse EmailMessage.text to EmailReply which are then stored in EmailMessage.replies EmailReply.content: Unprocessed mail body with headers, signatures, disclaimers EmailReply.body: Mail body without headers, signatures, disclaimers EmailReply.full_body: Mail body; just without headers EmailReply.headers: Identified Headers EmailReply.signatures: Identified Signatures EmailReply.disclaimers: Identified disclaimers 