Statisches Add-in für Outlook (Desktop/Web/Mobile), gehostet über GitHub
Pages (https://uvaree.github.io/signova-spike/). Setzt beim Verfassen
automatisch die zentral verwaltete E-Mail-Signatur aus
signova-app – tenant-nativ,
routet nie E-Mails, kennt nur Vorlagen- und Verzeichnisdaten.
| Datei | Zweck |
|---|---|
manifest.xml |
Add-in-Manifest (Unified Manifest v1.1-Overrides). GUID 7f2a9c40-… niemals ändern – jede Aktualisierung über die <Version>. |
launchevent.js |
Event-Handler + Signatur-Aufbau (Desktop/Web und Mobile teilen sich denselben Code, s.u.). |
commands.html |
Minimale Runtime-Seite, lädt office.js + launchevent.js – der <SourceLocation> jedes LaunchEvent-Extension-Points. |
taskpane.html |
Panel „Meine Signaturen” (manueller Weg, Signatur wählen). |
Automatische Signatur beim Verfassen funktionierte bisher nur in OWA und
Outlook Desktop (OnNewMessageCompose-Ereignis). In Outlook für iOS/Android
war das Add-in zwar installiert und aktivierbar, aber die Automatik zündete
nicht – dem Manifest fehlte die Mobile-Deklaration des Ereignisses
(Referenz: learn.microsoft.com – Mobile event-based activation).
Geändert für manifest.xml (Version 1.1.0.0 → 1.2.0.0, GUID
unverändert):
<MobileFormFactor>-Knoten ein zweites <ExtensionPoint
xsi:type="LaunchEvent"> ergänzt, mit <LaunchEvent
Type="OnNewMessageCompose" FunctionName="onNewMessageComposeHandler"/>
und <SourceLocation resid="WebViewRuntime.Url"/> – derselbe Resource-
Verweis wie beim Desktop-Pendant, zeigt auf commands.html, das per
<Override type="javascript"> im <Runtimes>-Element bereits auf
launchevent.js gemappt ist. Keine eigene Mobile-Runtime-Seite nötig,
derselbe Handler läuft auf jeder Plattform.OnMessageRecipientsChanged bewusst nicht für Mobile registriert –
braucht Mailbox 1.13 und war nicht Teil dieses Auftrags.<Requirements>-Mindestversion (Top-Level und die
bt:Sets DefaultMinVersion in den V1.1-Overrides) von 1.10 auf 1.5
gesenkt. Grund: Mit 1.10 wäre das Add-in auf Mobile-Clients unterhalb
dieser Fassung gar nicht erst installierbar gewesen – die Fassung war
schlicht zu hoch angesetzt, seit dieser Knoten ursprünglich nur für den
Desktop-Fall geschrieben wurde. 1.5 ist die von Microsoft dokumentierte
Mindestanforderung für event-basierte Aktivierung überhaupt; einzelne
Methoden, die erst ab 1.10 existieren, werden im Code selbst per
Feature-Detection abgesichert (nächster Punkt), nicht über dieses Feld.MobileMessageComposeCommandSurface
(Knopf in der Taskpane) bleibt zusätzlich bestehen – Automatik ersetzt
sie nicht, sondern ergänzt sie.Geändert für launchevent.js:
signovaSetzeSignatur() rief item.body.setSignatureAsync() bisher
ungeprüft auf. Diese Methode gibt es erst ab Mailbox 1.10 – mit der
gesenkten Mindestversion (s.o.) ist ein Client zwischen 1.5 und 1.9
theoretisch denkbar (in der Praxis bei aktuellen Mobile-Apps kaum noch
anzutreffen, moderne Outlook-Mobile-Clients unterstützen 1.10 längst).
Jetzt mit Feature-Detection abgesichert (typeof … === "function"),
im selben Stil wie an jeder anderen Stelle dieser Datei
(signovaHatEigeneSignatur, signovaComposeTyp, signovaEmpfaenger):
fehlt die Methode, passiert nichts – kein Fehler, keine Signatur, statt
eines Absturzes im Compose-Handler.Office.context.mailbox.userProfile, item.to/item.cc.getAsync,
item.getComposeTypeAsync, fetch) waren bereits über Feature-Detection
oder reine Mailbox-1.1-Basis-APIs abgesichert – keine weitere Änderung
nötig.SIGNOVA_VERSION auf 1.4.0 angehoben (rein informativ, erscheint in
der Taskpane und im data-signident-Attribut der gesetzten Signatur).Mit 1.1.0.0 zündete OnNewMessageCompose nachweislich in OWA. Seit
1.2.0.0/1.2.1.0 zündete es nirgends mehr – weder OWA (InPrivate
getestet, Panel lief, launchevent.js lud sichtbar) noch iOS. Taskpane/Panel
funktionierten überall, also wurde VersionOverrides geparst – nur die
LaunchEvent-Aktivierung war beschädigt.
Ursache: Die Mini-Auftrag-Änderung “iOS-Automatik” senkte die globale
<Requirements>-Mindestversion (Top-Level und bt:Sets
DefaultMinVersion in den V1.1-Overrides) von 1.10 auf 1.5, mit der
Begründung, 1.5 sei “die von Microsoft dokumentierte Mindestanforderung
für event-basierte Aktivierung überhaupt”. Das stimmt nicht für
OnNewMessageCompose auf Web/Desktop: Microsoft dokumentiert explizit
Requirement-Set 1.10
als Minimum, damit dieses Ereignis dort überhaupt erkannt wird (“Support for
this feature in Outlook was introduced in requirement set 1.10” – Abschnitt
“Outlook events”). 1.5 ist nur die Grenze, bis zu der Outlook Mobile
sich selbst als API-fähig meldet (separat dokumentiert unter
mobile-event-based),
nicht die Mindestanforderung des Ereignisses selbst. Mit MinVersion="1.5"
deklariert, hat Outlook Web/Desktop das LaunchEvent-ExtensionPoint schlicht
nicht mehr als unterstützt erkannt – die anderen Diff-Teile derselben
Pakete (Mobile-Icon-Resids) betreffen ausschließlich <MobileFormFactor>
und können OWA gar nicht berühren, was die Fehlersuche eingrenzte.
Fix (manifest.xml, 1.2.1.0 → 1.2.2.0, GUID unverändert):
<Requirements><Sets><Set Name="Mailbox" MinVersion="…"/> und
bt:Sets DefaultMinVersion in den V1.1-Overrides zurück auf 1.10.
Damit zündet OnNewMessageCompose auf Web/Desktop wieder wie zu
1.1.0.0-Zeiten.<MobileFormFactor>-LaunchEvent-Block aus dem Mini-Auftrag bleibt
additiv im Manifest stehen, ist damit aber wieder nicht nutzbar: Ein
einziges globales <Requirements>-Feld kann nicht gleichzeitig 1.10
(Pflicht für das Web/Desktop-Ereignis) und ≤1.5 (das Maximum, das
Outlook Mobile von sich aus meldet) erfüllen. Es gibt in diesem
Manifestschema keine granulare Pro-Plattform-MinVersion. Damit ist die
iOS-/Android-Automatik aus dem Mini-Auftrag vom 16.09.2026 vorerst
wieder außer Kraft – offene Optionen für später: (a) ein zweites,
mobil-only Add-in-Manifest mit eigener MinVersion="1.5" parallel
pflegen (Desktop/Web bleiben auf diesem Manifest mit 1.10), oder
(b) abwarten, ob Microsoft eine granularere Anforderungsdeklaration je
Form-Factor ergänzt. Der manuelle Knopf (MobileMessageComposeCommandSurface)
ist von alldem unberührt und funktioniert auf Mobile weiterhin.Lade-Ping (launchevent.js, SIGNOVA_VERSION 1.4.1 → 1.4.2): Ganz
am Dateianfang (direkt nach SIGNOVA_BASE/SIGNOVA_TOKEN/SIGNOVA_VERSION,
vor jeder sonstigen Logik) sendet die Datei jetzt einen
Fire-and-forget-Ping (navigator.sendBeacon, sonst fetch(…, {keepalive:
true}), in try/catch, kein Office-Objekt vorausgesetzt) mit Marker
script_loaded an den bestehenden /api/addin/ping-Endpunkt der
signova-app. Ein zweiter Ping mit Marker handler_invoked läuft am
Anfang von onNewMessageComposeHandler. Damit lässt sich künftig aus den
Server-Logs unterscheiden: “Skript lädt gar nicht” vs. “Skript lädt, aber
das Ereignis kommt nie an” vs. “Ereignis kommt an, aber signovaApply
scheitert” – genau die Unterscheidung, die in diesem Regressionsfall zuerst
händisch (InPrivate-Test, Screenshot) gemacht werden musste.
Der bestehende /ping-Endpoint verlangte bisher zwingend email (Zod-
Schema zPing, siehe signova-app); die Lade-Ping-Marker kennen zum
Zeitpunkt script_loaded noch kein Office-Profil. Dafür ein kleiner,
separater Fix in signova-app (eigener Commit dort): email in zPing
optional gemacht, marker/userAgent als neue optionale Felder ergänzt;
Anfragen mit gesetztem marker werden nur geloggt (kein Insert in
signature_events – dieser Tabelle liegt eine strikte CHECK-Constraint
auf mode IN ('auto','button') zugrunde, und sie speist die
Abdeckungs-Statistik im Admin-Bereich; Lade-Ping-Marker dort mit
einzumischen hätte diese Zahlen verfälscht). Bestehende Pings mit email
laufen unverändert über den alten Pfad inklusive Insert.
npx office-addin-manifest validate manifest.xml
Formalie aus dem Manifest-Review zu 1.2.0.0: Im <MobileFormFactor>-
Icon-Block referenzierten die 25er- und 48er-Slots die 16er- bzw. 80er-
Bilddateien (Icon.16x16, Icon.80x80) statt eigener, passend skalierter
Icons.
Geändert für manifest.xml (Version 1.2.0.0 → 1.2.1.0, GUID
unverändert):
bt:Image-Einträge Icon.25x25 (assets/icon-25.png) und
Icon.48x48 (assets/icon-48.png) unter <bt:Images> registriert.MobileMessageComposeCommandSurface-Icon-Block alle size="25"-
Einträge auf resid="Icon.25x25" und alle size="48"-Einträge auf
resid="Icon.48x48" umgestellt (für alle drei scale-Stufen).
size="32" verwies bereits korrekt auf Icon.32x32 und blieb
unverändert. Desktop-Icons (MessageComposeCommandSurface) unverändert.assets/icon-25.png und assets/icon-48.png sind aus dem größten
vorhandenen Icon (icon-128.png) sauber herunterskaliert, mit
transparentem Hintergrund wie die übrigen Icon-Dateien.SIGNOVA_VERSION in launchevent.js auf 1.4.1 angehoben (reiner
Debug-Marker, keine sonstige Codeänderung).npx office-addin-manifest validate manifest.xml
Statisches Hosting über GitHub Pages – ein Push auf main ist der Deploy.
Danach im Microsoft 365 Admin Center (zentral verteiltes Add-in) ggf. die
Manifest-Version erneut synchronisieren lassen, falls der Tenant nicht
automatisch auf die neue <Version> reagiert.