VIP notifications on Android with Outlook Mobile

Summary

This post covers how to create a VIP notification for emails on Android with Outlook Mobile.

Overview over VIP messages

VIP notifications is available with Gmail (and iOS Mail) that allow notification customization when emails arrive from very important people (VIP). This is convenient when preferring silence, except for VIPs. Unfortunately, it is not available in Outlook on Android at this time. In Android, turning on the Notification feature, ‘Do not disturb’, will cause all notifications to be silent, but it has exceptions for certain types such as calls and text messages. The text message exception will be used for this solution by identifying emails from VIPs and then sending a text message that allows the notification to break through ‘Do not disturb’.

Prerequisites

Description

To begin the solution it helps to start with a baseline on how emails are send to the mobile device to identify integration points.

VIP email send to Android Device via a Mail Server

Outlook Mobile receives all emails from a mail server and although there may be other systems in use before the VIP email arrives to the mail server, we only have two (2) direct integration points; (1) Mail Server and (2) Android Device w/ Outlook Mobile.

For VIP notifications to break through ‘Do not disturb’ the following text message process will need to happen.

VIP text message send to Android Device via a Wireless Carrier

Android receives all text messages from a wireless carrier and similar to emails there may be other systems in use before the VIP message arrives to our Wireless Carrier, but we only have (2) direct integration points; (1) Wireless Carrier and (2) Android Device w/ Messages.

With the email and text message flows as a baseline, we can define a conceptual integration between the two (2) processes and their subsystems. As the process starts with an email, we need a solution that can check a condition if the email is received from a VIP sender and if true, send a text message to our device. This solution can be conceptualized by bringing the baseline flows together with a workflow.

Conceptual diagram of Mail Server and Wireless Carrier integration.

The conceptual design introduces a couple of new subsystems in the process, (a) Mail Event Receiver and (b) Workflow. The purpose of the Mail Event Receiver is to watch for incoming emails and initiate the Workflow subsystem. The workflow will then be responsible for the conditional check to see if the email sender is on the VIP list and if true send the email and/or message to the device via the Wireless Carrier.

The workflow subsystem is the integration hub between the mail server and the wireless carrier. We can use no-code / low-code workflow tools for these type of subsystem integrations. A great tool for this purpose is IFTTT (IF This Then That) which comes with connectors to various subsystems. For the purposes of this post, we will cover a similar tool called Power Automate with integration to Exchange Online acting as the mail server. For the mail event receiver between Exchange Online and Power Automate, we will indirectly be using a Graph subsystem that both Exchange Online and Power Automate is integrated with to complete the mail server to workflow integration.

That covers the input to the workflow, so lets turn to the workflow output and its integration to the Wireless Carrier. Most carriers support the ability to send emails as text messages through the use of the wireless phone number as the recipient on the carrier’s mail server (aka realm). This means we can send text messages to ourselves via emails by using the notation <my.phone.number>@<wireless.carrier.realm>. This is supported by multiple carriers including the following US carriers:

Wireless CarrierEmail Recipient
Verizon5551234567@vtext.com
AT&T5551234567@txt.att.com
T-Mobile5551234567@tmomail.com
Wireless Carrier email to text message

Plugging in the identified solutions for each subsystem creates a completed logical design that we can implement.

Logical design diagram of the email to text message integration.
Logical design of the Email to Text Message integration

Note; variations can be made to this design such as substituting Exchange Online with a different mail server and Power Automate with IFTTT.

Next we’ll cover the steps for creating the workflow condition using Power Automate.

Steps

1. In a browser, navigate to Power Automate and login with an Office 365 account.

2. On the navigation menu, select “My Flows”, “New”, “Automated – from blank”

Power Automate screen for creating a new automated flow from blank template.

3. Enter a Flow name, such as “VIP Notify”

4. Type “Email” in the flow trigger search box and select the trigger “When a new email arrives (V3)”

Searching and selecting the trigger event for the workflow to be based on arrival of an email.

5. Select “Create” and a workflow canvas should appear with a trigger step.

6. Click the trigger step titled “When a new email arrives (V3)” and it should expand to see all configuration options.

7. In the ‘From’ field, enter the sender email of the VIP person. Multiple sender emails can be entered by adding a semi-colon (;) between each sender.

Entering sender emails of VIPs in the Power Automate trigger task to filter emails to only VIPs

8. Select “+ New step” at the bottom of the workflow canvas to enter a new step.

9. Search and select the action titled “Send an email (V2)”

10. Click the step titled “Send an email (V2)” and it should expand to see all configuration options.

11. In the ‘To’ field, enter your wireless carrier email address using the <phone.number>@<wireless.carrier.realm> notation to send an email as a text message to yourself.

12. In the ‘Subject’ field, enter a description that identifies the text message, such as “VIP Email Received”

13. In the ‘Body’ field, enter a description for the text message, such as “Check email for details”.

Configuring your wireless carrier phone number to send an email that should be converted to a text message.

14. Select the ‘Save’ button on the workflow canvas to save the workflow.

15. The VIP Notify workflow is now configured and should be active if the Status field displays ‘On’

VIP Notify power automate flow summary with status set to 'on'.

16. If the VIP sender list needs to be updated, return to this ‘VIP Notify’ flow and select ‘Edit’ to return to the canvas and repeat step 7 for adding or removing VIP sender emails in the ‘From’ field.

Next Steps

  • In the configuration of “Send an Email (V2)” step 12 & step 13, additional information can be added to the Subject and/or Body fields for the text message. For example, the Subject could include a dynamic field that contains the ‘Sender’ or ‘Subject’ of the email that triggered the workflow. This would provide specific details in the text message of which VIP and subject was received without having to check emails.

Azure DevOps: ./config.sh: line 85: ./bin/Agent.Listener: cannot execute binary file: Exec format error

Summary

Registering a Deployment Group agent for Azure DevOps generates the following error using the Linux registration script on a Linux ARM 32-bit operating system (such as Raspberry Pi):

./config.sh: line 85: ./bin/Agent.Listener: cannot execute binary file: Exec format error

Change the link to the agent package in the default registration script from Linux-x64 to ARM.

from 'vsts-agent-linux-x64-2.173.0.tar.gz' to 'vsts-agent-linux-arm-2.173.0.tar.gz'

The resulting registration script will look similar to the following:

mkdir azagent;cd azagent;curl -fkSL -o vstsagent.tar.gz https://vstsagentpackage.azureedge.net/agent/2.173.0/vsts-agent-linux-arm-2.173.0.tar.gz;tar -zxvf vstsagent.tar.gz; if [ -x "$(command -v systemctl)" ]; then ./config.sh --deploymentpool --deploymentpoolname "SandboxDeploy" --acceptteeeula --agent $HOSTNAME --url https://dev.azure.com/torben/ --work _work --runasservice; sudo ./svc.sh install; sudo ./svc.sh start; else ./config.sh --deploymentpool --deploymentpoolname "SandboxDeploy" --acceptteeeula --agent $HOSTNAME --url https://dev.azure.com/torben/ --work _work; ./run.sh; fi

Note: version numbers (2.173.0) are updated over time so the above referenced versions may have changed since this writing. The deployment pool name and Azure DevOps account will also be unique to the setup.

Re-run the registration script and the exec format error should be resolved with a processor / agent match.

Description

After executing the deployment group registration on a Linux ARM processor architecture, the agent may fail to start with the following error:

The ‘Exec format error’ indicates that the application was not compiled for the target processor architecture, ARM 32-bit. In reviewing the registration script, it becomes clearer that the script is pulling an agent for a Linux x64 target architecture:

Unfortunately, there is not a mechanism to select the processor type on the deployment pool registration screen as it only has the kernel (Windows or Linux) as an option, not processor architecture ARM or x64/x86. However, the deployment group targets are based on the same agent application used for Agent Pools so we can get the Url for the ARM version by going to Agent Pools, add an Agent, and select Linux : ARM.

vsts-agent-linux-arm-2.173.0.tar.gz
Azure DevOps image for Add Agent and selecting kernal and processor architecture for the agent binary

Next we change the original Deployment Group registration script by replacing

vsts-agent-linux-x64-2.173.0.tar.gz

with the arm version and rerun the updated deployment group registration script.

mkdir azagent;cd azagent;curl -fkSL -o vstsagent.tar.gz https://vstsagentpackage.azureedge.net/agent/2.173.0/vsts-agent-linux-arm-2.173.0.tar.gz;tar -zxvf vstsagent.tar.gz; if [ -x "$(command -v systemctl)" ]; then ./config.sh --deploymentpool --deploymentpoolname "SandboxDeploy" --acceptteeeula --agent $HOSTNAME --url https://dev.azure.com/torben/ --work _work --runasservice; sudo ./svc.sh install; sudo ./svc.sh start; else ./config.sh --deploymentpool --deploymentpoolname "SandboxDeploy" --acceptteeeula --agent $HOSTNAME --url https://dev.azure.com/torben/ --work _work; ./run.sh; fi

As the processor architecture now matches ARM 32-bit, the registration should succeed with the agent running as a service.

Image of Linux console showing the deployment group agent as active and running as a service

The agent will now be available for handling Azure DevOps Pipeline Releases and perform deployments to the target resource(s).

Next Steps

  • Presumably this is a temporary solution until the Azure DevOps user interface for Deployment Groups gets updated to match the Agent Pool kernel and processor selection or equivalent.
  • For multi-processor agent pools, refer to ‘Targeting multi-processor architectures with Azure DevOps‘ for additional details.