Mail-Threads für OTRS-Notifications
Heute habe ich versucht OTRS-Notifications in einen sinnvollen Thread zu bekommen.
Allgemeine Problemstellung:
OTRS schickt seine Notifications ohne einen References-Header. Das heißt, dass
Mailprogramme wie z.B. Thunderbird die Mails nicht in einem sinnvollen Thread
anzeigen können und man erst aufwendig nach Antworten suchen muss. Da OTRS Mails
nur auf Customer-Seite vernünftig macht und man als “Agent” auch nicht wirklich
per Mail mit OTRS interagieren kann, wurde die Notification-Schnittstelle an die
Agents wohl sehr stiefmütterlich behandelt.
Mein Ansatz zumindest das Problem der Threads zu lösen, hat sich auf Sieve-Filter konzentriert.
Sieve hat über Extensions die Möglichkeit, Funktionalitäten wie Header hinzufügen (siehe RFC 5293 ) den Filterregeln zugänglich zu machen.
Das kann man nutzen um z.B. einen References-Header hinzuzufügen.
Zunächst muss im Dovecot die Sieve-Extension eingeschaltet werden. Unter Dovecot kann man dafür in die lokale Config folgendes einfügen:
plugin {
sieve_extensions = +editheader
}
Die OTRS-Notifications haben ein konstantes Format für die Betreffzeile. So
schickt das OTRS, an dem ich angemeldet bin Notifications mit dem Subject
[Ticket#<TicketNummer>] <Betreff der Notification>. Dieses Format kann man nun
nutzen, um den References-Header zu setzen.
Hierfür gibt es die Extension variables. (Definiert in RFC 5229 )
Diese Extension macht es möglich, Variablen zu definieren. Standardmäßig sind
bei Direktiven wie :matches auch einige Variablen vordefiniert. So wird z.B.
bei dem Betreff [Ticket#12345] Some Text und der Filterregel header :matches
"Subject" "[Ticket#*]*" die Variable ${0} belegt mit dem gesamten Subject
(also [Ticket#12345] Some Text), ${1} enthält den Inhalt des ersten
Wildcard-Matches (also 12345) und ${2} den zweiten Wildcard-Match (und bei
weiteren Wildcards dann ${3} den dritten, ${4} den vierten usw.)
Da die Ticket-ID (gespeichert in ${1} eindeutig das Ticket referenziert, kann
man das nun nutzen, um den References-Header endgültig zu setzen.
Zu empfehlen ist hier, eine Subdomain unter der URL des Ticket-Systems zu nehmen
( z.B. tickets.otrs.example.com), damit man nicht aus Versehen eine Kollision
erzeugt.
Der gesamte Sieve-Filter sieht dann in etwa so aus:
require ["variables", "editheader"];
if header :matches "Subject" "[Ticket#*]*" {
addheader "References" "${1}@tickets.otrs.example.com";
}