SMS in Teams empfangen

SMS in Teams ist im Teams Feedback Forum immer wieder ein Thema. Auch mich interessierte es seit längerer Zeit welche Möglichkeiten es für den Empfang von SMS in Teams gibt.
In erster Linie möchte ich die SMS nur empfangen, für Multi-Faktor Codes (MFA-Codes). Manch Anbieter bieten weiterhin keine Methode über TOTP-Code und verlangen eine Telefonnummer für den Versand einer MFA SMS. Bei einem Datendiebstahl ist bei der (bekanntlich unsicheren) SMS-Methode die Telefonnummer gleich mitgestohlen. Für meine Zwecke sollte es eine schnell ersetzbare Nummer sein.

In dem Beitrag versuche ich einige Möglichkeiten zusammenzufassen.
Im zweiten Abschnitt konfiguriere ich den Empfang von SMS in einem Teams Kanal und beschreibe wie die Konfiguration kostengünstig über Twilio und Azure Automation möglich ist, und alternativ eine zusätzliche Möglichkeit über Power Automate.


Möglichkeiten für SMS-Empang

Teams Phone Mobile

Am einfachsten und schnellsten wäre der Empfang von SMS in Teams mit Teams Phone Mobile (früher Operator Connect Mobile). Die Unterstützung für SMS ist laut Berichten auf der Roadmap.

Mit Teams Phone Mobile wird die Mobilnummer auch in Teams eingesetzt. In Teams und deinem Smartphone hast du dieselbe Nummer.

With Teams Phone Mobile, a user’s SIM-enabled phone number is also their Teams phone number. Users can use a single phone number in Microsoft Teams across both their mobile service and desk lines, and seamlessly transition between networks and devices.

Im Teams Admin Center musst du für Teams Phone Mobile in deinem Land Anbieter mit “Teams Phone Mobile Calling” filtern. In der Schweiz bietet es aktuell nur Swisscom für Geschäftskunden. Für meine Zwecke ist die Lösung der falsche Weg. Es soll eine schnell ersetzbare, alternative Nummer und kostengünstige Lösung sein.

Anbieter für Teams Phone Mobile
Anbieter für Teams Phone Mobile
Azure Communication Services

Mit Azure Communication Services bietet Microsoft eine Möglichkeit die Azure Plattform für Kommunikationsdienste einsetzen. Für Telefonie und SMS kann es eine interessante Option sein.

Warum es für meinen Zweck noch keine Option ist?

  • Möchte jemand eine Telefonnummer über Azure Communication Services beziehen limitiert es Microsoft auf die Region laut Azure Subscription. Durch die Einschränkung können verfügbare Nummern limitiert sein.

Phone number availability is currently restricted to Azure subscriptions that have a billing address in supported regions.

Für meinen Zweck ist Azure Communications Services dadurch keine Option. Sollte Azure zukünftig Incoming SMS in der Schweiz unterstützen prüfe ich es erneut.

Twilio Messaging

Im Unterschied zu Azure Communication Services bietet Twilio über MessagingX und Programmable Messaging Telefonnummern aus verschiedenen Ländern für den Empfang und Versand von SMS.

  • Abhängig zum Land kann Twilio Anforderungen an eine Adresse in dem Land vorgeben. Bei der Wahl einer Nummer kannst über verschiedene Filter eine passende Nummer anzeigen lassen.
  • Abhängig zur Landesvorwahl ist der monatliche Mietpreis tief oder höher. Die Nummer sollte SMS empfangen können. Meist kann die Nummer gleichzeitig SMS versenden und Anrufe empfangen/tätigen.

In der Preisliste zeigt Twilio Preise pro Land für die verschiedenen Arten von Nummern. Zusätzlich kommen zum monatlichen Mietpreis der Nummer Gebühren für den Empfang/Versand von SMS und Anrufe. Eine kurze Zusammenfassung (Stand Juni 2023). Twilio kann die Preise jederzeit ohne Ankündigung anpassen.

CountryPrice
CodeNumber PrefixNumber
(per month)
SMS Inbound
(per SMS, for 153 chars)
SMS Outbound
(per SMS, for 153 chars)
CH+419 USD0.0075 USD0.0725 USD
AT+436 USD0.0075 USD0.0979 USD
DE+495 USD0.0075 USD0.0940 USD
GB+441.15 USD0.0075 USD0.0420 USD
US+11.15 USD0.0079 USD0.0079 USD
3rd Party Anbieter mit SMS Integration in Teams

Suchst du in Google nach SMS in Teams wirst du verschiedene Anbieter mit SMS Integration in Teams finden. Bei allen Anbietern zahlst du einen monatlichen Preis. In vielen Fällen bieten die Anbieter nur eine Telefonnummer aus den USA oder Kanada. Die Produkte binden sich als App/Bot in Teams ein und leiten die SMS als Chat oder Nachricht in einem Kanal weiter. Abhängig zum Anbieter könntest du über Teams auf die SMS antworten. Da mir die Gebühren für meine Zwecke zu hoch sind sah ich mir bisher keinen der Anbieter an.

Konfiguration von SMS-Empfang in Teams

Für meinen Zweck probierte ich zwei Möglichkeiten mit Twilio aus.

  1. SMS-Empfang über Twilio, Azure Automation und Teams Kanal
  2. SMS-Empfang über Twilio, Power Automate und Teams Kanal

Für Möglichkeit 1 nutze ich Webhooks in Teams und beide Möglichkeiten führen am Ende zum gewünschten Ergebnis. Es ist teils abhängig welche Microsoft Lizenzen deine Organisation einsetzt, wie viel es kosten darf und welche Möglichkeit für die Organisation einfacher fällt.

Allgemein ist zu erwähnen, Twilio stellt dir anfangs eine US-Nummer inkl. Guthaben für Tests bereit. Eine praktische Sache für die erste Konfiguration. Die Testnummer ist in manchen Dingen eingeschränkt, in der Dokumentation findest du mehr Informationen.

NOTE
Webhooks liefern eine eindeutige URL für den Empfang von Inhalten. Halte die URL geheim. 
Eine Webhook-URL prüft nicht ob der Absender berechtigt ist an einen Webhook Inhalte zu senden. 

Vorbereitungen

Für beide Möglichkeiten sind fast identische Vorbereitungsarbeiten nötig.

Incoming Webhook Connector in Teams Kanal

Wie oben erwähnt nutze ich in einem Teams Kanal einen Webhook Connector. Ich erstellte mir einen neuen SMS-Kanal und binde den Incoming Webhook Connector ein. Der Name des Connectors wird in der Nachricht angezeigt. Kopiere die Webhook URL und halte es geheim.

NOTE
Solltest du die Lösung über Power Automate einsetzen benötigst du den Webhook Connector in Teams nicht. Power Automate kann die Nachricht direkt in Teams posten. 

Webhook Connector für Teams Kanal
Webhook Connector für Teams Kanal
Twilio Nummer konfigurieren

In deinem Twilio Konto hast du eine Übersicht deiner aktiven Nummern. Hast du noch keine Nummer wird Twilio vorschlagen einen Test zu starten. Hier könntest du später neue Nummern kaufen oder wieder stornieren. Bei einer Testnummer wird Twilio immer Voice, SMS, MMS und Fax unterstützen.

Twilio Testnummer
Twilio Testnummer
  1. Hast du Twilio bisher nicht genutzt wurde von Twilio für dein Konto ein “Default Conversation Service” eingerichtet. Öffne unter Messaging > Services zuerst den Service. Nutzt du Twilio bereits könntest du einen neuen Service einrichten, oder einen bestehenden öffnen.
  2. Kontrolliere unter Integration welche Konfiguration für Incoming Messages gesetzt ist. Standardmässig könnte Twilio hier Drop aktivieren, dann wird deine eingehende SMS nie weiter behandelt und du wunderst dich warum ein Test nicht funktioniert. Es sollte “Defer to sender’s webhook” konfiguriert sein.
Screenshot
  1. Kontrolliere ausserdem die von Twilio vorkonfigurierten Geo Permissions. Mit Geo Permissions limitierst du den Empfang und Versand an/von unerwünschten Ländern.
  2. Geh zurück zu deinen aktiven Nummern und klick auf die gewünschte Nummer. Bei einer US-Nummer wird dir Twilio anzeigen für den Versand an US-Nummern fehlen behördliche Dokumente. Für den SMS-Test kannst du es ignorieren.
    Scrolle nach unten zur Messaging Configuration. Hier wählst du zuerst den in Schritt 1 definierten Messaging Service und kannst du einen Webhook angeben an den eine Nachricht weitergeleitet wird.
    Schlechte Nachricht, die Webhook URL aus dem Teams Kanal solltest du hier nicht einfügen. Die Nachricht wird nicht in Teams ankommen. Teams möchte für eingehende Nachrichten definierte JSON-Parameter.
Twilio Messaging Configuration für Nummer einrichten
Twilio Messaging Configuration für Nummer einrichten
  1. Für Schritt 4 benötigst du eine Lösung für die Erstellung der korrekten Nachricht. Dafür sind die zwei Möglichkeiten über Azure Automation oder Power Automate relevant.

SMS-Empfang über Twilio, Azure Automation und Teams Kanal

In meinem Fall teste ich als erste Lösung einen Azure Automation Account mit PowerShell Runbook und Azure Webhook. Das PowerShell Runbook konvertiert mir den von Twilio übertragenen Text in ein für Teams passendes JSON-Format.

  1. Erstelle in Azure einen neuen Azure Automation Account.
  2. Erstellte im Automation Account ein neues PowerShell Runbook. Für mich erstellte ich es für PowerShell 5. Für den Test benötigst du noch keine PowerShell Commands, könntest aber das Beispiel laut Doku einfügen.
  3. Füge im Runbook einen Webhook hinzu.
    • Die Webhook URL wird dir nur einmal angezeigt. Kopiere die URL und halte es geheim.
    • Die Webhook URL ist standardmässig 12 Monate gültig.
  4. Füge die Webhook URL aus Schritt 7 bei Twilio Schritt 4 ein und speichere die Twilio Konfiguration.
  5. Testweise kannst du eine SMS an die Twilio Nummer senden. Wenige Sekunden später sollte das Runbook aus dem Automation Account starten.
  6. Nun ist sichtbar was Twilio übermittelt. Twilio vermerkt sie übermitteln die Angaben 1:1 wie sie es erhalten. Es ist ein langer String.
String
ToCountry=US&ToState=PA&SmsMessageSid=SM25c1ffd5cc0f799f838b350e27333408&NumMedia=0&ToCity=POTTSTOWN&FromZip=&SmsSid=SM25c1ffd5cc0f799f838b350e27333408&FromState=&SmsStatus=received&FromCity=&Body=SMS+Demo+for+my+Teams+Channel+&FromCountry=CH&To=xxxx&MessagingServiceSid=MG9c95be87e82bcdfa28fb747859211330&ToZip=19465&NumSegments=1&MessageSid=SM25c1ffd5cc0f799f838b350e27333408&AccountSid=xxxx&From=xxxx&ApiVersion=2010-04-01

  1. Den String kannst du mit PowerShell zerlegen (bei & ein Split durchführen). Für mich sind vier Informationen relevant.
    • To (um zu kennen an welche Nummer die Nachricht gesendet wurde, falls es in Twilio mehrere Nummern gibt)
    • From (um zu kennen wer der Absender ist)
    • FromCountry (um zu kennen aus welchem Land der Absender ist)
    • Body (die eigentliche Nachricht)
  2. Für mich erstellte ich folgendes PowerShell Script das im Runbook abläuft. Unterstützung liefert dieser Beitrag.
    Möchtest du keine weiteren Informationen in der Teams Nachricht könntest du das Script übernehmen. Beachte, die Teams Webhook URL ist im Automation Account als Variable hinterlegt. Passe für deine Ausführung im Script den Namen entsprechend an. Für meine Tests lasse ich weiterhin manche Daten ausgeben.
PowerShell
param
(
    [Parameter(Mandatory=$false)]
    [object] $WebhookData
)

$WebhookData
$TeamsWebhookURL = Get-AutomationVariable -Name "TeamsSMSWebhookURL"


if ($WebhookData.RequestBody) { 
    
    $SMSBody = [System.Net.WebUtility]::UrlDecode($WebhookData.RequestBody) # Decoding as the string is in HTML format
    $SMSBody = $SMSBody.Split("&")
    $SMSBody

    # Collect values for To, From, FromCountry, and Body
    $BodyValue = ($SMSBody | ?{$_ -like "Body=*" }).Replace("Body=","")
    $FromNumberValue = ($SMSBody | ?{$_ -like "From=*" }).Replace("From=","")
    $ToNumberValue = ($SMSBody | ?{$_ -like "To=*" }).Replace("To=","")
    $FromCountryValue = ($SMSBody | ?{$_ -like "FromCountry=*" }).Replace("FromCountry=","")     

    $TeamsWebhookBody = [PSCustomObject][Ordered]@{
        "@type"      = "MessageCard"
        "@context"   = "http://schema.org/extensions"
        "summary"    = "Incoming SMS"
        "themeColor" = '0078D7'
        "sections"   = @(
                @{
                    "activityTitle"    = "SMS from $FromNumberValue"                    
                    "activityImage"    = "https://blog.topedia.com/pictures/SMSIcon2.png" # feel free to replace the picture, should be on a public place. 
                    "facts"            = @(
                            @{
                                "name"  = "Recipient:"
                                "value" = $ToNumberValue
                            },
                            @{
                                "name"  = "Sender:"
                                "value" = $FromNumberValue
                            },
                            @{
                                "name"  = "Country:"
                                "value" = $FromCountryValue
                            },
                            @{
                                "name"  = "Message:"
                                "value" = $BodyValue
                            }
                    )
                    "markdown" = $true
                }
            )

    } | ConvertTo-JSON -Depth 4

    Invoke-RestMethod -Uri $TeamsWebhookURL -Method Post -Body $TeamsWebhookBody -ContentType 'application/json'  
        
}

  1. Nachdem das Runbook publiziert ist kannst du erneut eine SMS an die Twilio Nummer senden. Abhängig wie schnell das Runbook in Azure startet sollte die Nachricht im Teams Kanal nach wenigen Sekunden eingehen.
Empfang von SMS über Azure Automation
Empfang von SMS über Azure Automation
  1. Im Automation Account kannst du den Ablauf des Runbooks kontrollieren und Input/Outputs/Fehler überprüfen.

SMS-Empfang über Twilio, Power Automate und Teams Kanal

Als zweite Lösung teste ich Power Automate mit einem Webhook Connector, JSON Parser und Teams Connector. Der Webhook Connector ist ein Premium Connector, bedeutet die Organisation muss passende Lizenzen einsetzen. Beachte die Dokumentation für Informationen in welchen Power Automate Lizenzen Premium Connectors inkludiert sind.

Twilio bietet selbst einen Power Automate Connector. Der Twilio Connector inkludiert aber nur Actions und keine Trigger. Für eingehende SMS-Nachrichten ist der Connector nicht hilfreich. Der Flow muss selbst zusammengestellt werden, mit Unterstützung von hier und hier.

  1. Öffne Power Automate und erstelle einen neuen, leeren Flow (Automated cloud flow, der Flow muss von selbst starten).
  2. Suche nach dem Trigger “When an HTTP request is received” (Premium Connector) und füge den Trigger ein. Belasse die Standardkonfiguration.
Screenshot
  1. Suche nach der Action “Parse JSON” und füge die Action ein.
  2. Füge in Parse JSON folgende Werte ein:
    • Content: @{triggerBody()?[‘$formdata’]}
    • Schema:
JSON
{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "key": {
                "type": "string"
            },
            "value": {
                "type": "string"
            }
        },
        "required": [
            "key",
            "value"
        ]
    }
}

Screenshot
  1. Suche nach der Action “Initialize variable” um eine neue Variable zu erstellen.
  2. Füge folgende Werte in die Action ein:
    • Name: MessageBody
    • Type: String
    • Value: <leer lassen>
  3. Wiederhole Schritt 9 und 10 für die Variablen SenderNumber, FromCountry und Recipient. Am Ende sollten es vier Variablen sein. In welcher Reihenfolge spielt keine Rolle.
Screenshot
  1. Leitet Twilio später eine SMS an den Power Automate Webhook weiter splittet Parse JSON über das Schema die Nachricht in Key und Value. Dabei handelt es sich um ein JSON-Array. Hier an einem Auszug.
Screenshot

Als nächsten Schritt gehe ich über Power Automate alle Keys durch und suche mir To, From, FromCountry und Body, und speichere die Werte (Value) in den zuvor erstellten Variablen. Power Automate wird dafür rund 10 Sekunden benötigen.

  1. Suche nach der Action “Apply to each” und füge es als nächsten Schritt ein.
  2. In der Action gibt du als Output den Body von Parse JSON an (aus Schritt 8).
  3. Füge in Apply to each “Condition” als weitere Action ein.
  4. In Condition wählst du als Wert Key (aus Parse JSON) is equal to Body.
  5. Bei “If yes” fügst du als Action “Set variable” ein.
    • Name: MessageBody
    • Value: Value (aus Parse JSON)
  6. Wiederhole die Schritte 15 bis 17 für die drei weiteren Variablen To, From und FromCountry. Am Ende solltest du vier Conditions in Apply to each sehen.
Screenshot
  1. Als letzten Schritt fügst du eine Action “Post message in a chat or channel” ein. Wähle über welche Methode, in welchem Team, in welchen Kanal mit welchem Text. Den Text und die Variablen kannst du frei ergänzen.
Nachricht in Teams Kanal posten
Nachricht in Teams Kanal posten
  1. Speichere deinen Flow. Durch das Abspeichern wird dir eine Webhook URL erstellt (in When a HTTP request is received). Öffne den Trigger aus Schritt 6, kopiere die Webhook URL und halte es geheim.
  2. Füge die Webhook URL aus Schritt 20 bei Twilio Schritt 4 ein und speichere die Twilio Konfiguration.
  3. In deinem Flow sollten nun 8 Schritte inkludiert sein (+ 4 Conditions).
Screenshot
  1. Nun kannst du deinen Flow testen. Starte einen manuellen Test und warte bis Flow dir anzeigt du kannst deine Live Aktivität ausführen.
  2. Sende eine SMS an deine Twilio Nummer und warte bis dein Flow die eingehende Nachricht erkennt. Power Automate wird den Flow durchgehen, und sollte im besten Fall am Ende in deinem Kanal eine Nachricht posten. In meinem Fall funktioniert es.
Empfang von SMS über Power Automate
Empfang von SMS über Power Automate


SMS über Twilio versenden

In einzelnen Fällen können Anbieter für MFA Konfigurationen eine Bestätigung über SMS erwarten. Mit deiner Twilio Nummer kannst du die Bestätigung per SMS versenden.
Für den Versand benötigst du aus deinem Twilio Konto die Account SID, den Auth Token und deine Twilio Telefonnummer. Alle Daten solltest du auf der Startseite von deinem Konto finden. In meinem Beispiel sende ich die SMS mit PowerShell über die Twilio Messages API. Für Testkonten kann Twilio den Versand limitieren.

PowerShell
$TwilioNumber = "<TwilioPhoneNumber>"
$TwilioAccountSID = "<TwilioAccountSID>"
$TwilioAccountToken = "<TwilioAccountToken>"
$ToNumber = "<RecipientNumber>"
$SMSText = "Twilio Outbound SMS Demo"

$TwilioPass = $TwilioAccountToken | ConvertTo-SecureString -asPlainText -Force
$TwilioCred = New-Object System.Management.Automation.PSCredential($TwilioAccountSID, $TwilioPass)

$MessageBody = @{      
    From = $TwilioNumber; 
    To = $ToNumber;
    Body = $SMSText 
}

$APIUrl = "https://api.twilio.com/2010-04-01/Accounts/$TwilioAccountSID/Messages.json"
$TwilioSMS = Invoke-WebRequest $APIUrl -Method Post -Credential $TwilioCred -Body $MessageBody | ConvertFrom-Json | Select sid, body


Die SMS geht nach wenigen Sekunden ein.

Screenshot


Mein Fazit und Kosten

Beide Möglichkeiten über Twilio mit Azure Automation und Power Automate funktionieren für den Empfang von SMS in Teams. Ich kann bei Twilio die Nummer sehr schnell ersetzen und bei Bedarf aktivieren/deaktivieren.

Aus persönlicher Sicht bevorzuge ich die Methode über Azure Automation. Ich finde es über den Automation Account und das PowerShell Runbook einfacher als die Schritte in Power Automate. Ausserdem bin ich unabhängig zu Power Automate (Premium) Lizenzen und Speicherplatz in einer Dataverse Datenbank.
In einer Azure Subscription sind für Automation 500 Minuten pro Monat inkludiert. Pro eingegangener SMS läuft das Runbook rund 10 Sekunden. Auf Seite Azure fallen dadurch noch keine Kosten an.

So gesehen fallen nur für Twilio Kosten an. Über die letzten Tage führte ich viele Tests aus. In meinem Twilio Testkonto zeigt es mir die Kosten täglich aktualisiert. Für einen Test ob meine Nummer funktioniert telefonierte ich einmal mit der Nummer.

Share
Avatar-Foto

Tobias Asböck

Tobias ist ein Senior System Engineer mit rund 10 Jahren Berufserfahrung für Microsoft 365 Produkte wie SharePoint Online, OneDrive for Business, Teams Collaboration, Entra ID, Information Protection, Universal Print und Microsoft 365 Lizenzierung. Aus der Vergangenheit kennt er über einen Zeitraum von 15+ Jahren die Planung, Administration und den Betrieb von SharePoint Server Umgebungen. Tobias ist ein PowerShell Scripter mit Zertifizierungen für Microsoft 365 Produkte. In seiner Freizeit beschäftigt sich Tobias mit Aktualisierungen in der M365-Welt, ist mit seinem Rennvelo unterwegs und anderen sportlichen Aktivitäten beschäftigt. Bei Fragen kontaktiere mich über LinkedIn oder [email protected].

2 Responses

  1. Ingo Ehlers sagt:

    Einfach ist anders……

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert