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";
}