Filtern von Antwort-E-Mails#

Das Ziel ist die automatische Bereinigung eingehender E-Mails, die als Antwort auf eine zuvor von Allegra verschickte vorgangsbezogene E-Mail erkannt worden ist. Dabei werden zitierte Texte, E-Mail-Signaturen, frühere Konversationsverläufe usw. entfernt.

Dies kann über die Datei EmailReplyPatterns.properties konfiguriert werden.

Konfigurationsdatei#

Datei:

$ALLEGRA_HOME/EmailReplyPatterns.properties

Diese Konfigurationsdatei wird aus dem $ALLEGRA_HOME-Verzeichnis geladen und kann angepasst werden.

Änderungen an der Konfigurationsdatei werden zur Laufzeit automatisch neu geladen. Ein Neustart der Anwendung ist nicht erforderlich.

Hauptkonfigurationsoptionen#

Antwortfilter aktivieren/deaktivieren#

# Controls whether to extract the reply part or keep the
# entire email as it is
extractReplayPart=true
true (Standard)

Entfernt zitierte Inhalte und behält nur den Antwortinhalt.

false

Behält den gesamten E-Mail-Inhalt einschließlich aller zitierten Teile bei, entfernt jedoch weiterhin einige allgemeine Allegra-Selektoren.

Anwendungsfall:

Auf false setzen, wenn der E-Mail-Verlauf in Vorgangkommentaren erhalten bleiben soll.

Allgemeine Allegra-Selektoren#

Verschiedene vorgangsspezifische Inhalte können optional in aus Allegra gesendete E-Mails eingefügt werden, z. B.:

  • Vorgangdetails

  • Konversationsverlauf

  • Vorgangsverknüpfung

Das oben erwähnte Flag extractReplayPart beeinflusst das Entfernen dieser Inhalte nicht. Sie werden unabhängig davon entfernt, sofern die folgenden Selektoren nicht explizit auskommentiert werden.

Format:

<client>.<itemSpecificContent>.<index>=<CSS selector>

<itemSpecificContent> kann sein:

  • itemDetail

  • itemConversationHistory

  • itemLink

#Common Allegra element selectors.
generic.itemDetail.selector.0=div[class*=itemDetail]
generic.itemDetail.selector.1=div[id*=itemDetail]

#Workaround for Outlook
outlook.itemDetail.selector.siblings.0=
hr[style*=background-color: rgb(208, 208, 208)]

# Workarounds for Gmail
gmail.itemDetail.selector.0=
div:has(> div:has(> table[width=100%]
[cellpadding=0][cellspacing=0]:has(th)))

gmail.itemDetail.selector.1=
div:has(> table[width=100%]
[cellpadding=0][cellspacing=0]:has(th))

generic.itemConversationHistory.selector.0=
div[class*=itemConversationHistory]

generic.itemConversationHistory.selector.1=
div[id*=itemConversationHistory]

outlook.itemConversationHistory.selector.siblings.0=
hr[style*=background-color: rgb(208, 208, 208)]

gmail.itemConversationHistory.selector.0=
div:has(> div:has(> p:contains(conversationHistoryText)))

gmail.itemConversationHistory.selector.1=
div:has(> p:contains(conversationHistoryText))

generic.itemLink.selector.0=div[class*=itemLink]
generic.itemLink.selector.1=div[id*=itemLink]

outlook.itemLink.selector.siblings.0=
hr[style*=background-color: rgb(208, 208, 208)]

gmail.itemLink.selector.0=
div:has(> a[href*=printItem.action?key=])

Clientspezifische Erkennung#

# Controls whether to detect the email client
# before applying patterns

extractReplayPartClientSpecific=false
true

Erkennt den E-Mail-Client (Outlook, Gmail usw.) und wendet nur die dafür relevanten Muster an.

false (Standard)

Wendet alle Muster nacheinander an, um eine bessere Kompatibilität zu erreichen.

Auf true setzen für bessere Performance, wenn innerhalb des Unternehmens hauptsächlich ein einzelner E-Mail-Client verwendet wird.

Muster mit Präfix generic werden unabhängig von dieser Einstellung immer angewendet.

Unterstützte E-Mail-Clients#

Das System enthält vorkonfigurierte Muster für:

E-Mail-Client

Präfix

Beschreibung

Outlook

outlook.

Microsoft Outlook

Gmail

gmail.

Google Gmail Webinterface

Thunderbird

thunderbird.

Mozilla Thunderbird

Apple Mail

applemail.

macOS/iOS Mail-Anwendung

Yahoo Mail

yahoomail.

Yahoo Webmail

ProtonMail

protonmail.

ProtonMail

Generic

generic.

Muster für alle E-Mails

Mustertypen und Konfiguration#

Mustertyp 1: Erkennung des E-Mail-Clients#

Identifiziert den E-Mail-Client, der die Nachricht gesendet hat.

Format:

<client>.detection.<index>=<CSS selector>
# Detection patterns
outlook.detection.0=div[id^='divRplyFwdMsg']
outlook.detection.1=div.ms-outlook-mobile-reference-message
outlook.detection.2=div[id='appendonsend']
outlook.detection.3=div.WordSection1

gmail.detection.0=div.gmail_quote
gmail.detection.1=div.gmail_attr

thunderbird.detection.0=div.moz-cite-prefix
thunderbird.detection.1=div.moz-forward-container
thunderbird.detection.2=blockquote[type='cite']

applemail.detection.0=blockquote[type='cite']

yahoomail.detection.0=div[class*=yahoo_quoted]

protonmail.detection.0=div.protonmail_quote

Der erste passende Selektor bestimmt den Clienttyp.

Nützlich bei:

extractReplayPartClientSpecific=true

Mustertyp 2: Einfache Entfernen-Selektoren#

Entfernt passende Vorgänge. Dies ist nützlich, wenn ein Quote-Element den ursprünglichen Teil der E-Mail umfasst.

gmail.selector.0=div.gmail_quote
gmail.selector.1=div.gmail_attr

thunderbird.selector.0=blockquote[type='cite']

Format:

<client>.selector.<index>=<CSS selector>

Mustertyp 3: Entfernen mit Geschwistern#

Entfernt das gefundene Element UND alle folgenden Elemente (gesamter zitierter Bereich).

Dies ist nützlich, wenn der Beginn des Originalteils durch ein Element markiert wird und alle folgenden Elemente ebenfalls entfernt werden sollen.

outlook.selector.siblings.0=
hr[style*='border:none'][style*='border-top']

yahoomail.selector.siblings.0=
div[style*='border-top'][style*='dotted']

Format:

<client>.selector.siblings.<index>=<CSS selector>

Mustertyp 4: Bedingtes Entfernen mit Geschwistern#

Entfernt Elemente, die einem Selektor entsprechen UND bestimmten Text enthalten oder einem regulären Ausdruck entsprechen.

gmail.selector.siblings.conditional.0=div.gmail_extra

gmail.selector.siblings.conditional.0.regex=
.*On.*\\d{4}.*wrote:.*

applemail.selector.siblings.conditional.0=div, p, br

applemail.selector.siblings.conditional.0.text.contains=
Begin forwarded message:

Format:

<client>.selector.siblings.conditional.<index>=
<CSS selector>

<client>.selector.siblings.conditional.<index>.regex=
<regex pattern>

oder:

<client>.selector.siblings.conditional.<index>.text.contains=
<exact text>

Mustertyp 5: Antwort-Header-Muster#

Textbasierte Muster zum Erkennen von Antwort-Headern in verschiedenen Sprachen. Diese Verarbeitung erfolgt unabhängig vom E-Mail-Client.

# English
replyheader.selector.siblings.regex.0=
From:.*Sent:.*To:.*Subject:

replyheader.selector.siblings.regex.1=
On .* wrote:

# German
replyheader.selector.siblings.regex.3=
Von:.*Gesendet:.*An:.*Betreff:

replyheader.selector.siblings.regex.4=
Am .* schrieb .*:

Format:

replyheader.selector.siblings.regex.<index>=
<regex pattern>

Zu durchsuchende Elemente:

replyheader.element.selector=div, p, pre, span

Mustertyp 6: Allegra-spezifischer Antwortmarker#

Verwenden Sie diesen Ansatz, wenn andere clientspezifische oder generische Selektoren die E-Mails nicht wie erwartet bereinigen.

Inhalte aus Allegra-E-Mails kapseln#

Stellen Sie sicher, dass der aus Allegra gesendete E-Mail-Inhalt in ein spezielles Markerelement eingebettet wird.

# Wrap outgoing emails with a marker element
item.emailSend.wrapEmailContent=false

# the start of the wrapper element
item.emailSend.wrapStartTag=
<div class="answerDelimiter" id="answerDelimiter">
<p style="color:#b5b5b5">${delimiterText}</p>

#the end of the wrapper element
item.emailSend.wrapEndTag=</div>

Wrapper-Element aus empfangenen E-Mails entfernen#

Wenn das Markerelement in der Antwort-E-Mail vorhanden ist, kann es mit einem clientspezifischen Selektor entfernt werden.

outlook.delimiterSelector=
div[id*=answerDelimiter]:has(p:contains(delimiterText))

gmail.delimiterSelector=
div:containsOwn(delimiterText)

Format:

<client>.wrapSelector=<CSS selector>
Hinweis:

%delimiterText% wird zur Laufzeit durch den lokalisierten Trennzeichentext ersetzt.

CSS-Selektor-Syntax#

Die Konfiguration verwendet Jsoup-CSS-Selektoren.

Selektor

Beispiel

Bedeutung

Tag

div

Alle div-Tags

Klasse

.gmail_quote

Klasse

ID

#appendonsend

Element-ID

Attribut exakt

[type='cite']

Exakter Wert

Attribut enthält

[style*='border']

Teilstring

Attribut beginnt mit

[id^='divRply']

Präfix

Mehrere Selektoren

div, p, br

Mehrfach

Hat Kind

:has(p)

Enthält Kind

Enthält Text

:contains(text)

Textsuche

Tests und Fehlersuche#

Konfiguration neu laden#

Nach Änderungen an EmailReplyPatterns.properties werden die Änderungen automatisch erkannt. Ein Neustart ist nicht erforderlich.

Häufige Probleme#

Zitierter Text wird nicht entfernt#

  • HTML-Quelltext der E-Mail analysieren

  • eindeutige CSS-Selektoren oder Textmuster identifizieren

  • passende Muster zur Konfigurationsdatei hinzufügen

Es wird zu viel Inhalt entfernt#

  • Selektoren spezifischer formulieren

  • zu allgemeine Muster entfernen

Muster funktionieren nach Änderungen nicht#

  • fortlaufende Nummerierung prüfen (0,1,2,…)

  • Syntaxfehler prüfen

  • doppelte Backslashes in Regex verwenden: \\d statt \d

Selektoren mit siblings#

Wenn ein Selektor mit siblings passt, wird alles unterhalb des gefundenen Elements entfernt, einschließlich Signaturen, Haftungsausschlüssen, Datenschutz- und Virenhinweisen.

Best Practices#

  • Mit echten E-Mails testen

  • Zuerst clientspezifische Muster definieren

  • Immer fortlaufende Nummerierung verwenden

  • Änderungen dokumentieren

  • Vor Änderungen Backup der Konfiguration erstellen

Technische Hinweise#

Verarbeitungsreihenfolge:

Clientspezifische Muster ->
Generische Muster ->
Antwort-Header
Caching

Regex-Muster werden für bessere Performance kompiliert und gecacht.

Groß-/Kleinschreibung

Regex-Muster für Antwort-Header sind standardmäßig case-insensitive.