Teams Voicemail

ich bin kein Freund von "Audiodateien" für Mitteilungen, die auch als Text-Mail oder Chat mich erreichen können, wenn ich nicht per Sprache erreichbar bin. Wer mit Teams telefoniert, hat aber auch hier eine "Sprach-Mailbox". Voicemail gibt es aber auch für Call Queues/Attendant und im Teams Kanal als "Shared Voicemail".

Backend

Aus technischer Sicht ist ein Voicemail-Server auch heute noch ein Service, auf den ein Anwender seine eingehenden Anrufe weiterleitet. Daran hat sich seit den ersten Sprachboxen in der TK-Welt nicht viel geändert, nur dass die Signalisierung heute meist SIP und der Transport RTP/UDP ist. Ein Voicemail-Server hat daher immer eine im System erreichbare Nebenstelle oder Adresse, die auch angerufen werden kann. Das System erkennt dann an der mit übergebenen "Umgeleitet von"-Information, für wen ein Anrufer eine Nachricht hinterlassen will oder ob der Inhaber selbst anruft. Nachdem die Voicemail empfangen und ggfls. Verarbeitet wurde (z.B. Spracherkennung) wurde, wird diese in das Empfängersystem übergeben. Früher hatte das Voicemail-Systeme oft ein eigenes "Postfach" oder die Nachrichten wurde direkt ins Postfach per EWS/IMAP4 o.ä. "abgelegt". Heute ist es fast immer eine SMTP-Mail mit entsprechender Formatierung und Audio-Anlage.

Viele Anbieter von Sprachsystemen sind verschwunden, nachdem Microsoft mit der Exchange UM-Rolle (Version 2007-2016) eine entsprechende Funktion integriert hat. Mit dem Wegfall der "Exchange UM-Rolle" seit Exchange 2019 können Sie "Cloud Voice Mail (CVM)" nutzen, vormals als "Azure Voice Mail" bezeichnet.

Microsoft Teams bedient sich der gleichen Infrastruktur und sendet die Mails per SMTP über den MX-Record an das Postfach. Bei passender Konfiguration mit Exchange Hybrid und entsprechenden Kontakten kann das Postfach sogar OnPremises liegen. Siehe dazu auch Voicemail ohne Exchange UM

Individuelle Voicemail

Für mich als "Teams Voice"-Teilnehmer kann ich an mehrere Stellen auf die Voicemail-Funktion einwirken. Über den "Anrufe"-Bereich sehe ich nicht nur sofort entsprechende Sprachnachrichten und verpasste anrufe, sondern ich kann auch die Weiterleitung zur Voicemail steuern.

Weitere Optionen befinden sich unter den Teams Einstellungen auf dem Client:

Hier kann ich dann eine individuelle Begrüßung aufzeichnen und weitere Einstellungen vornehmen.

Dieser Dialog ist nur für individuelle Voicemail-Einstellungen möglich aber nicht für die später beschriebene "Shared Voicemail"

 

Diese Einstellungen macht jeder Anwender für sich und kann aktuell auch noch nicht durch einen Administrator stellvertretend ausgeführt werden. Ein Programm wie SEFAUtil (Lync/SfB) gibt es für Teams aktuell nicht und per Graph oder Teams PowerShell gibt es auch keine Möglichkeiten. Ich bin aber sicher, dass dies in Zukunft möglich sein wird.

Auch eine Verwaltung über Exchange (https://outlook.office.com/ecp) ist nicht mehr möglich (Stand Nov 2021):

Deutlicher ist quasi nicht zu sehen, dass Exchange UM ausgedient hat und die Voicemail-Funktion in der Cloud nicht mehr Bestandteil von Exchange Online ist.

Richtlinien

Jede Funktion von Teams lässt sich per Richtlinien kontrollieren. Allerdings ist dies nicht immer per Browser im Admin-Portal möglich. Dort gibt es auch im Nov 2021 noch keine Möglichkeit, so dass die Einstellungen per PowerShell erfolgen müssen. Die entsprechenden Befehle hat Microsoft dokumentiert.

Wie schon aus anderen Bereichen bekannt, gibt es neben der globalen Richtlinie weitere individuelle Richtlinien, die dann an Benutzer zugewiesen werden können. Benutzer ohne explizit zugewiesene Richtlinie nutzen die globale Richtlinie. Hier meine Default-Werte.

PS C:\> Get-CsOnlineVoicemailPolicy

Identity                            : Global
EnableTranscription                 : True
ShareData                           : Defer
EnableTranscriptionProfanityMasking : False
EnableEditingCallAnswerRulesSetting : True
MaximumRecordingLength              : 00:05:00
EnableTranscriptionTranslation      : True
PrimarySystemPromptLanguage         :
SecondarySystemPromptLanguage       :

Microsoft definiert per Default schon weitere Richtlinien, die sie direkt zuweisen könnten und sich nur in den folgenden Einstellungen unterscheiden:

Identity                                 EnableTranscription EnableTranscriptionProfanityMasking
--------                                 ------------------- -----------------------------------
Global                                                  True                               False
Tag:Default                                             True                               False
Tag:TranscriptionDisabled                              False                               False
Tag:TranscriptionProfanityMaskingEnabled                True                                True

Die "Global" und "Tag:Default" sind sogar identisch. Mittels "New-CsOnlineVoicemailPolicy" legen Sie bei Bedarf weitere eigene Richtlinien an und die Zuweisung an Benutzer erfolgt mit "Grant-CsOnlineVoicemailPolicy".

Auto Attendant

Die Funktion der "Vermittlung" ist in Europa eher ungewöhnlich, da wir per "Durchwahl" meist keine Vermittlung brauchen. In anderen Ländern können Rufnummern aber knapp sein und eine Firma hat weniger externe Rufnummern als interne Durchwahlen. Dann verbinden sich Anrufer mit einer Zentrale (Mensch oder Maschine) und wählen dann die Nebenstelle z.B. per DTMF nach. Diese Funktion kann Teams auch bereitstellen, d.h. eine besondere Rufnummer landet auf einem AA und durchläuft dort einen Entscheidungsbaum. Der "Abwurf" auf eine Sprachmailbox kann auch nach Tag und Zeit, z.B. Öffnungszeiten, gesteuert werden.

Sie könnten den Anruf an eine Person (und deren Voicemail) leiten, an eine Voice App die z.B. ein Callcenter darstellt, eine externe Nummer oder an ein Voicemail Ziel. Ein legitimes Ziel ist eine Microsoft 365 Gruppe bzw. Microsoft Teams. Auf die Besonderheit eine Microsoft 365 Group/Microsoft Team als Voicemail-Ziel gehe ich weiter unten noch genauer ein.

Call Queue

Neben dem Autoattendant und Individualempfängern gibt es noch die Call Queues, die in Deutschland als "Warteschlangen", "Gruppennummern" und aus der Skype for Business Welt als "Response Group" bekannt sind. Mehrere Agenten (Personen) sind in einer Warteschlange, die über eine Rufnummer erreicht werden können. Teams verteilt die eingehenden Anrufe und wenn keine Agenten verfügbar sind oder die Beantwortung zu lange dauert, kann der Ruf z.B. an eine Voicemail vermittelt werden. Hierzu gibt es pro Call Queue zwei Einstellmöglichkeiten.

  • Call Overflow
    d.h. wenn mehr als die angegebene Anzahl an Anrufern warten müsste. Ein mögliches Ziel ist eine Voicemail
  • Call Timeout
    Wenn kein Agent in der angegeben Zeit den Ruf abholt, dann folgt Teams den folgenden Regeln:

Wie beim Auto Attendant ist für eine Voicemail einer Call Queue ebenfalls eine "Microsoft 365 Groups" bzw. ein "Microsoft Team" ein legitimes Ziel.

Shared Voicemail Routing

Ehe Sie aber eine Office 365 Group als Ziel für eine Voicemail nutzen, sollten Sie die Einstellung der Gruppe im Exchange Admin Center prüfen. Die Voreinstellung bei der Neuanlage einer Microsoft 365 Gruppe ist in der Regel passend aber einen Kontrollblick wert.

When you use the admin center to create a group, by default users do not get copies of group emails sent to their inboxes though users get copies of group meeting invitations sent to their inboxes
Quelle: https://docs.microsoft.com/en-us/microsoft-365/admin/create-groups/manage-groups?view=o365-worldwide#send-copies-of-conversations-to-group-members-inboxes

Wenn die Einstellung "falsch" ist, dann bekommen alle Mitglieder eines Teams auch die Voicemail als Kopie. Die Microsoft 365 Group funktioniert dann wie ein Mailverteiler.

Die Funktion gab es so schon längere Zeit. Leider mussten die Mitglieder eines Teams aber diese "Voice Mails" weiterhin in Outlook in der Microsoft 365 Gruppe ansehen.

Achtung:
Cloud Voice Mail sendet die Sprachnachricht als SMTP-Mail direkt an die primäre SMTP-Adresse der Microsoft 365 Gruppe und bedient sich dabei dem MX-Record. Wenn dies eine "%gruppenname@%tenantname%.onmicrosoft.com"-Adresse ist, dann bleibt Sie im Tenant. Bei einer anderen Adresse wird die Mail ggfls. sogar über ihren eigenen Spamfilter geroutet.

Wenn die Sprachnachricht nicht ankommt, dann sollten sie einen Blick ins Exchange Messagetracking werfen.

Cloud Voice Mail sendet die Nachrichte mit einem "<>" im SMTP-Envelope. Sie müssen die Office 365 Group daher für die Zustellung für alle (internen) Absender erlauben.

Es ist nicht erforderlich, die Gruppe von "Extern" (Grün) erreichbar zu machen, wenn sie über eine "onmicrosoft.com"-Domäne angesprochen wird. Sollte die Office Group aber eine SMTP-Domäne nutzen, die per MX-Record nicht direkt zu Exchange Online verweist, dann kommt die Mail für ihre System "aus dem Internet".

Eine Anpassung  dieser Einstellung kann laut Microsoft bis zu 30 Minuten dauern
Quelle: https://docs.microsoft.com/en-us/microsoft-365/admin/create-groups/manage-groups?view=o365-worldwide#let-people-outside-the-organization-email-the-group

Ganz genau passt das mit der Absenderadresse aber auch nicht genau, denn Exchange sendet tatsächlich eine "Unzustellbarkeit" an einen Absender zurück, obwohl der SMTP-Envelope ein "<>" sein soll.

Sie sehen aber, dass der Absender sich immer ändert. Er scheint aber aus dem eigenen Tenant zu kommen.

Das könnte schon wieder ein Hebel sein, z.B. über eine Transportregel die Erreichbarkeit auf dem Internet einzuschränken

Am Betreff können Sie auch sehen, dass Microsoft sogar hier die Bezeichnung "Shared Voicemail" eingedeutscht hat.

noreply_skype_voicemail_1c86a6d9-dfdc-4df0-876e-aa37bf038da6@msxfaq.onmicrosoft.com
noreply_skype_voicemail_78502f8f-be24-4210-8d13-8449df9575f0@msxfaq.onmicrosoft.com

Leider nutzt Microsoft hier keine feste Absenderadresse im SMTP-Envelope, die per SPF/DKIM abgesichert ist, so dass man diese als Empfangsbeschränkung nutzen kann.

Allerdings ist der "Header" mit dem Anrufer belegt, wie ein Blick in die Mailbox anzeigt:

Da ich in dem Tenant parallel mit Hybrid Centralized Mail Transport gearbeitet habe, wurden die Mails sogar zum lokalen Exchange Server zugestellt, der die dann vermutlich über das Internet und MX-Records wieder zu Exchange Online senden wird. Der wird die Mail dann vermutlich ablehnen und sich damit im Sande verlaufen. Dennoch ist dies ein guter Hinweis, dass Cloud Voice Mail nicht mal so eben mit einer Microsoft 365 Group zusammenarbeiten kann.

Teams Voicemail

Auf der Ignite 2020 wurde aber eine Funktion erstmals sichtbar aber es hat dann immer noch fast ein Jahr gedauert, bis sie "Global Available (GA)" war.

Microsoft Teams: Voice-enabled Channels
"Collaborative calling enables customers to connect a call queue to a channel in Teams. Users can collaborate and share information in the channel while taking calls in the queue. This feature is ideal for scenarios such an IT help desk or HR hotline. IT admins can quickly connect call queues to specific channels, and team owners can manage the settings. "
Quelle: hhttps://www.microsoft.com/en-us/microsoft-365/roadmap?filters=&searchterms=68770

Die Idee dabei ist, dass eine Call Queue mit einem Teams-Kanal in einem Microsoft Team verknüpft wird. Was auf den ersten Moment wenig spektakulär aussieht, ist dennoch eine große Arbeitserleichterung, da damit die Pflege der Agenten über das Team selbst und nicht mehr über Gruppen erfolgt. Allerdings ist natürlich damit jedes "Teammitglied" auch immer ein Agent der Call Queue. Machen Sie das nicht ohne Vorwarnung für große Teams. Ein Agent kann sich selbst rausnehmen, wenn Sie dies als Administrator zulassen. Aber als Administrator können Sie dies nicht stellvertretend machen.

Im entsprechenden Kanal erscheint dann ein neuer Reiter "Anrufe" und wer drauf klickt, findet am rechten Rand ein Dialpad und kann bei ausgehenden Anrufen auch die ausgehende Rufnummer vorgeben. Im mittleren Bereich sehen wir dann den Verlauf der Anrufe und hat direkt Zugriff auf die Voicemail. Die Schaltfläche oben ist nur ein Filter. Wer hier "Alle" aktiv hat, sieht Voicemails und angenommene und verpasste Anrufe.

Für jeden Anruf und die Voicemail können sie direkt den Anrufer zurückrufen, sofern er eine gültige Nummer übermittelt hat.

Wenn sie mehrere Call Queues in einem Team in verschiedene Kanäle ablegen, dann hat jeder Kanal seine "eigene" Voicemail, obwohl die Mails in der gleichen Office 365 Mailbox landen. Anscheinend filtert Teams hier auf ein Property der Mail.

Gelesen/Ungelesen
Ich kann in Teams eine Voicemail leider nicht mehr als "ungelesen" kennzeichnen oder einen Task zuweisen etc. Der Gelesen-Status wird aber mit Outlook synchronisiert. Wenn ich die Voicemail mit Outlook als "ungelesen setze, dann ist sie auch in Teams "ungelesen". Für Eskalationszwecke könnten die Group Mailboxen auf ältere ungelesene Voicemails zyklisch geprüft werden.

Die Nachrichtenklasse der Voice-Mails ist übrigens "IPM.Note.Microsoft.Voicemail.UM.CA" und in Outlook können die Eigenschaften nicht angezeigt werden.

Dennoch kann man z.B. aus einer exportierten MSG-Datei die SMTP-Header extrahieren.

From: "Carius, Frank" <+49160xxxxx>
Date: Wed, 17 Nov 2021 23:09:23 +0000
Subject: Geteilte Voicemail (UC Team CallQueue)
Message-Id: <8K0RDOWNBFU4.D1JZD4PE3DX43@RDDC98408749A1>
Reply-To: +49 160 xxxxxx <noreply@skype.voicemail.microsoft.com>
To: UCTeam@msxfaq.onmicrosoft.com
X-AttachmentOrder: audio.mp3
X-VoiceMessageDuration: 7
Content-Class: Voice-CA
X-VoiceMessageSenderIsAnonymous: False
X-CallingTelephoneNumber: +49 160 xxxxxx
X-VoiceMessageSenderName: +49160xxxxxx
X-AzureVoicemail-CallId: 6ea06270-58ee-4c0a-9a96-33d49e2546f7
X-AzureVoicemail-FirehoseActivityId: 18446744073709551615
X-IsPstnCall: True
X-ShareDataEnabled: False
X-VoiceMessageLanguage: de
X-AzureVoicemail-TranscriptionRequestId: d67573ae-176f-4e6d-9ce0-f7a81e837d33
X-VoiceMessageTranscription: So und noch ein Ton
X-VoiceMessageTranscriptionLanguage: de-DE
X-VoiceMessageConfidenceLevel: high
X-VoiceMessageInitialSilence: False
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-bk3j5tPJDcLb1Wok+En3NA=="
Return-Path:  noreply_skype_voicemail_xxxxxxxx@msxfaq.onmicrosoft.com
X-EOPAttributedMessage: 0
X-MS-Exchange-Organization-MessageDirectionality: Originating
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthSource:
 TreatMessagesAsInternal-VE1EUR03FT038.eop-EUR03.prod.protection.outlook.com
X-MS-PublicTrafficType: Email
X-OriginatorOrg: netatwork.de
X-MS-TrafficTypeDiagnostic: DB8PR04MB7084:FirstParty-Skype-V1
X-MSXFAQ-EXORules: 1
X-MS-Oob-TLC-OOBClassifiers: OLM:2803;
X-MS-Exchange-Organization-SCL: -1
X-Microsoft-Antispam: BCL:0;

Interessant ist hier, dass die Rufnummer der Anrufers im Header protokolliert wird. Auch scheint die Mail "vom eigenen Tenant" zu kommen und mit einem "SCL -1" den Spamfilter zu umgehen. Das gilt natürlich nur, wenn die Zustellung direkt innerhalb von Exchange erfolgt und der MX-Record nicht auf ein anderes System verweist. Der Header "X-MSXFAQ-EXORules: 1" verrät mir, dass Transportregeln in der Cloud ebenfalls angewendet wurde.

Nur den Namen der Call Queue, über die diese Voicemail angekommen ist, habe ich in der Mail nicht gefunden. Die Zuordnung mehrerer Voicemails zu dem passenden Kanal läuft wohl über ein anderes Property.

Teams HTTP Query

Beim Wechsel in die "Anrufe"-Karteikarte zeigt Teams kurz ein "Suche nach Voicemails" an.

Natürlich habe ich dem Teams Client mit den Developer Tools auf die Finger geschaut und folgenden Request (gekürzt) gefunden:

Request URL:  https://outlook.office.com/api/beta/groups/<guid>/messages
                     ?$expand=SingleValueExtendedProperties($filter=
                              PropertyId%20eq%20%27Integer%20{00020328-0000-0000-C000-000000000046}%20Id%200x6801%27%20
                         or%20PropertyId%20eq%20%27String%20{00020386-0000-0000-C000-000000000046}%20Name%20X-VoiceMessageConfidenceLevel%27%20
                         or%20PropertyId%20eq%20%27String%20{00020386-0000-0000-C000-000000000046}%20Name%20X-VoiceMessageTranscription%27)
                     &$filter=SingleValueExtendedProperties/Any(ep:%20ep/PropertyId%20eq%20%27String%200x1a%27%20
                                  and%20ep/Value%20eq%20%27IPM.Note.Microsoft.Voicemail.UM.CA%27)
                     &$top=30
                     &$select=From,Body,IsRead,Id,ReceivedDateTime,InternetMessageHeaders

Decodiert ist es etwas einfacher lesbar.

$expand:  SingleValueExtendedProperties($filter=PropertyId eq 'Integer {00020328-0000-0000-C000-000000000046} Id 0x6801' 
                                             or PropertyId eq 'String {00020386-0000-0000-C000-000000000046} Name X-VoiceMessageConfidenceLevel'' 
                                             or PropertyId eq 'String {00020386-0000-0000-C000-000000000046} Name X-VoiceMessageTranscription')
$filter:  SingleValueExtendedProperties/Any(ep: ep/PropertyId eq 'String 0x1a' ' 
                                             and ep/Value eq 'IPM.Note.Microsoft.Voicemail.UM.CA')

Das Propertyset "00020328-0000-0000-C000-000000000046" ist dabei einfach nur ein "Common PSMAPI"-Set

Als Authentifizierung kommt ein Bearer-Token mit folgenden Properties zum Einsatz:

"aud": "https://outlook.office.com/",
"iss": "https://sts.windows.net/<tenantGUID>/"
"app_displayname": "Microsoft Teams",
"appid": "1fec8e78-bce4-4aaf-ab1b-5451cc387264",
"scp": "Calendars.ReadWrite 
        Contacts.ReadWrite
        EWS.AccessAsUser.All Files.Read.All
        Files.ReadWrite.All
        Group.ReadWrite.All
        Mail.ReadWrite
        Mail.Send OWA.AccessAsUser.All
        SCIS-Internal.ReadWrite 
        Signals.ReadWrite
        SubstrateSearch-Internal.ReadWrite 
        User.Read User.ReadBasic.All",

Ein klassischer REST-API-Aufruf, der eine JSON-Antwort liefert:

Die Bereiche "Body", "From" und "InternetMessageHeaders" habe ich nicht aufgeklappt, da der Inhalt keine Besonderheiten enthält.

Interessant, dass Teams hier direkt gegen "outlook.office.com"  geht und eine Beta-API nutzt, anstatt mit der Graph-API zu arbeiten.

Agent Handing im Kanal

Die Integration der Call Queue in einen Kanal eröffnet dem Anwender auch eine einen direkten Weg, sich selbst als Agent ein- und auszutragen, sofern der Administrator dies erlaubt hat. Die Einstellung dazu erfolgt in der Call Queue.

Eingehende Rufe werden wie bisher von Teams beim Agenden gemeldet:

Hier ändert sich auch mit "Shared Voicemail" nichts.

Einschätzung

Die Funktion war überfällig und integriert die Voicemail als Team Kanal . Auch das Management einer Call Group landet sehr elegant in Teams. Dennoch gibt es schon noch einige Dinge, die mich stören:

  • Karteikarte "Anrufe" als Default
    Wenn ich eine Call Queue mit einem Kanal verbinde, dann ist mein Schwerpunkt eigentlich auf der Telefonie. Ich kann zwar die Standardkarte "Wiki" entfernen aber "Beiträge" und "Dateien" weder entfernen noch verbergen oder zumindest die Reihenfolge verändern.
  • Agenten on behalf
    Aktuell ist es nicht möglich, dass ich als Admin die Agenten für die Call Queue zentral aktiviere/deaktiviere oder zumindest den Status sehe, wer gerade "ausgebucht" ist.
  • "Anrufe" nicht im mobilen Client (bekannt)
    Wenn ich Teams auf dem SmartPhone nutze, dann sehe ich dort zwar den Kanal aber nur die Karteikarten "Beiträge", "Dateien" und "Weitere".  Dort erscheint aber nicht "Anrufe". Die Anrufe an die Call Queue werden aber schon auf dem Smartphone signalisiert.

    Das ist aber dokumentiert, da die Funktion aktuell nur auf dem Windows Client und Mac Client sichtbar ist. Ich hoffe, es kommt aber doch bald auch für die anderen Clients.
  • Ansage nicht abschaltbar
    Wenn ein Anrufer aus der Call Queue zur Voicemail geroutet wird, dann wird natürlich die in der Call Queue konfigurierte Ansage oder Audiodatei abgespielt. Aber dann spielt Cloud Voice Mail noch mal seine Ansage ab.
  • Gruppen-Voicemail in meiner Voicemail
    Etwas verwirrend finde ich, dass in meiner persönlichen Voicemail auch die Sprachnachrichten des Teams erscheinen.
  • Defekter Links
    Bei all den echten Problemen its es eher kosmetischer Natur, dass der Link auf die Homepage springt und nicht zur entsprechenden Stelle im Formular

Die Story mit "Shared Voicemail" ist also noch nicht zu Ende und wird fortgesetzt.

Weitere Links