Azure Communication Services technical documentation table of contents update
Technical documentation is like a map for using a platform—whether you're building services, solving problems, or learning new features, great documentation shows you the way to the solution you need. But what good is a map if it’s hard to read or confusing to follow? That’s why easy-to-navigate documentation is so important. It saves time, reduces frustration, and helps users focus on what they want to achieve. Azure Communication Services is a powerful platform, and powerful platforms require great documentation for both new and experienced developers. Our customers tell us consistently that our docs are a crucial part of their experience of using our platform. Some studies suggest that documentation and samples are the most important elements of a great developer experience. In this update, we’re excited to share how we’ve improved our technical documentation’s navigation to make it quicker and simpler than ever to find the information you need when you need it. Why did we change? In order for our content to be useful to you, it first needs to be findable. When we launched Azure Communication Services, the small number of articles on our site made it easy to navigate and find relevant content. As we’ve grown, though, our content became harder to find for users due to the quantity of articles they need to navigate. To refresh your memory, the table of contents on our docs site used to be structured with these base categories: Overview Quickstart Tutorials Samples Concepts Resources References These directory names describ e the type of content they contain. This structure is a very useful model for products with a clearly-defined set of use cases, where typically a customer’s job-to-be-done is more constrained, but it breaks down when used for complex, powerful platforms that support a broad range of use cases in the way that Azure Communication Services does. We tried a number of small-scale changes to address the problems people were having on our site, such as having certain directories default to open on page load, but as the site grew, we became concerned that our site navigation model was becoming confusing to users and having a negative impact on their experience with our product. We decided to test that hypothesis and consider different structures that might serve our content and our customers better. Our user research team interviewed 18 customers with varying levels of experience on our platform. The research uncovered several problems that customers were having with the way our docs navigation was structured. From confusing folder titles, to related topics being far away from each other in the nav model, to general confusion around what folder titles meant, to problems finding some of the most basic information about using our platform, and a host of other issues, our user research made it clear to us that we had a problem that we needed to fix for our users. What did we change in this release? To help address these issues, we made a few key changes to make our table of contents simpler and easier to navigate. The changes we made were strictly to site navigation, not page content, and they include: We've restructured the root-level navigation to be focused on communication modality and feature type, rather than content type, to better model our customers' jobs-to-be-done. Topics include All supported communication channels Horizontal features that span more than one channel Topics of special interest to our customers, like AI Basic needs, like troubleshooting and support This will allow customers to more easily find the content they need by focusing on the job they need to do, rather than on the content type. We've simplified the overview and fundamentals sections to make the site less overwhelming on first load. We've surfaced features that customers told us were difficult to find, such as UI Library, Teams interop, and Job router. We've organized the content within each directory to roughly follow a beginner->expert path to make content more linear, and to make it easier for a user to find the next step in completing their task. We've removed unnecessary layers in our nav, making content easier to find. We've added a link to pricing information to each primitive to address a common customer complaint, that pricing information is difficult to find and understand. We've combined quickstarts, samples, and tutorials into one directory per primitive, called "Samples and tutorials", to address a customer complaint that our category names were confusing. We added a directory to each primitive for Resources, to keep important information close by. We added root-level directories for Common Scenarios, Troubleshooting, and Help and support. We did a full pass across all TOC entries to ensure correct casing, and edited entries for readability and consistency with page content, as well as for length to adhere to Microsoft guidelines and improve readability. These changes have led us to a structure that we feel less taxing for the reader, especially on first visit, maps more closely to the customer’s mental model of the information by focusing on the job-to-be-done rather than content type, helps lead them through the content from easiest to hardest, helps make it easier for them to find the information they need when they need it, and helps remind them of all the different features we support. Here’s what the table of contents looks like on page load as of Feb 6: These changes are live now. You can see them on the Azure Communication Services Technical documentation site. What’s next: In the coming weeks we will continue to make refinements based on customer feedback and our assessment of usage metrics. Our content team will begin updating article content to improve readability and enhance learning. We will be monitoring our changes and seeking your feedback. How will we monitor the effectiveness of our changes? To track the effectiveness of our changes and to be sure we haven’t regressed, we’ll be tracking a few key metrics Bounce rates: We’ll be on the lookout for an increase in bounce rates, which would indicate that customers are frequently landing on pages that don’t meet their expectations. Page Views: We’ll be tracking the number of page views for our most-visited pages across different features. A decrease in page views for these pages will be an indicator that customers are not able to find pages that had previously been popular. Customer Interviews: We will be reaching out to some of you to get your impressions of the new structure of our content over the coming weeks. Customer Surveys: We've created a survey that you can use to give us your feedback. We'll also be adding this link to select pages to allow you to tell us what you think of our changes while you're using them! So, give our new site navigation a try, and please don’t hesitate to share your feedback either by filling out our survey or by sending an email to acs-docs-feedback@microsoft.com. We look forward to hearing from you! A623Views2likes0CommentsGuest Post: Send emails with PowerShell and managed identity using Azure Communication Services
Today, we’re featuring a guest author, Luke Murray, a Microsoft Most Valuable Professional (MVP) for Azure. He’s written an article we’re sharing below, focused on Azure Communication Services Email and PowerShell. We’ll turn it over to Luke to share more! Azure Communication Services brings rich communication APIs to all your apps across any device on any platform, using the same reliable and secure infrastructure that powers Microsoft Teams. Please follow these steps to set up Azure Communication Services resources in the Azure portal as pre-requisites for sending an email. 1. Create Azure Communication Services resource. 2.Create Email Communication Service. 3. Connect them, you can use a free Azure supplied domain name, or bring in your own custom domain. Today, we will explore using Email as part of Azure Communication Services, using their REST API and PowerShell to send an email. In this example, I will access a token from Azure Communication Services. I will make a GET request to the identity endpoint of Azure Communication Services using the OAuth identity from the system-managed identity. This will return a token we can use to authenticate against the REST API. Here's a step-by-step explanation of the script: The script first defines the subject and body of the email. The body is an HTML string that contains the email content. It checks if the email body is not empty. If the email body is not empty, it gets an access token from Azure Communication Services. This is done by making a GET request to the identity endpoint of Azure Communication Services. The access token is then printed to the console. If there's an error retrieving the access token, the script catches the exception and prints the error message and response details on the console. The script then constructs the URI for the email-sending endpoint and defines the headers for the REST API call. The headers include the content type and the access token that was obtained in the authorization header. The script defines the body for the REST API call. This includes the sender address, the email content (subject and body), the recipients, the reply-to address, and a flag to disable user engagement tracking. The script then converts the PowerShell object to JSON and attempts to send the email by making a POST request to the email-sending endpoint. The request and response details are logged to the console. If the email is sent incorrectly, the script catches the exception and logs the error message and stack trace to the console. Further information on the authentication process: The script first defines the resource ID for Azure Communication Services and the communication endpoint URL. It then constructs the URI for the identity endpoint. This URI includes the environment variable IDENTITY_ENDPOINT (automatically set by Azure when using Managed Identity) and the resource ID. The script then attempts to get an access token from the identity endpoint. It does this by sending a GET request to the identity endpoint with a header that includes Metadata: true. This tells the identity endpoint that the request is coming from within Azure. If the request is successful, the response will include an access token, which is then extracted from it. This access token can then be used to authenticate requests to Azure Communication Services. The token tells Azure Communication Services that the request comes from an authenticated source (in this case, the Managed Identity) and should be allowed. (This authentication was initially written to be used in an Azure Automation Runbook, with the System Managed Identity assigned Contributor rights to the Azure Communication Services resource (not the Email Communication Services) Here is the PowerShell script to send an email using Azure Communication Services using the System Managed identity of an Azure Automation account: $emailSubject = "Important: Server Maintenance Notification" $EmailRecipient = "ituser@contoso.com" $emailBody = @" <html> <body> <p>Dear User,</p> <p>This is to inform you that a <b><i>server maintenance is scheduled for the next week</i></b>.</p> <p>The servers will be down from 10:00 PM to 2:00 AM.</p> <p>Please save your work and log off during this period to avoid any data loss.</p> <p>If you have any questions or concerns, please contact our IT Support team.</p> <p>Thank you for your understanding and cooperation.</p> <p>Best Regards,</p> <p>IT Support Team</p> </body> </html> "@ if ($emailBody -ne "") { Write-Output $emailBody # Define the resource ID for Azure Communication Services $ResourceID = 'https://communication.azure.com' # Define the communication endpoint URL $communicationendpointurl = "azcomm-contoso.australia.communication.azure.com" # Update with your communication endpoint URL # Construct the URI for the identity endpoint $Uri = "$($env:IDENTITY_ENDPOINT)?api-version=2018-02-01&resource=$ResourceID" # Debug output # Print the constructed URI and headers Write-Output "URI: $Uri" Write-Output "Headers: @{ Metadata = 'true' }" # Try to get the access token try { # Invoke a GET request to the identity endpoint to get the access token $AzToken = Invoke-WebRequest -Uri $Uri -Method GET -Headers @{ Metadata = "true" } -UseBasicParsing | Select-Object -ExpandProperty Content | ConvertFrom-Json | Select-Object -ExpandProperty access_token # Print the obtained access token Write-Output "Access Token: $AzToken" } catch { # If there's an error, print the error message and response details Write-Error "Failed to get access token: $_" Write-Output "Response Status Code: $($_.Exception.Response.StatusCode.Value__)" Write-Output "Response Status Description: $($_.Exception.Response.StatusDescription)" Write-Output "Response Content: $($_.Exception.Response.GetResponseStream() | %{ $_.ReadToEnd() })" } # Construct the URI for the email sending endpoint $uri = "https://$communicationendpointurl/emails:send?api-version=2023-03-31" # Define the headers for the REST API call # Include the content type and the obtained access token in the Authorization header $headers = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $AzToken" } # Define the body for the REST API call $apiResponse = @{ headers = @{ id = (New-Guid).Guid } senderAddress = 'DoNotReply@7647475b-a51b-4901-8674-917e6abea743.azurecomm.net' content = @{ subject = $emailSubject html = $emailBody } recipients = @{ to = @( @{ address = $EmailRecipient displayName = $EmailRecipient } ) } replyTo = @( @{ address = "example@contoso.com" displayName = "Contoso" } ) userEngagementTrackingDisabled = $true } # Convert the PowerShell object to JSON $body = $apiResponse | ConvertTo-Json -Depth 10 # Send the email try { # Log the request details Write-Output "Sending email..." Write-Output "URI: $uri" Write-Output "Headers: $headers" Write-Output "Body: $body" # Make the request $response = Invoke-RestMethod -Uri $uri -Method Post -Headers $headers -Body $body -UseBasicParsing # Log the response Write-Output "Response: $response" # Return the response $response } catch { # Log the error Write-Error "Failed to send email: $_" Write-Output "Exception Message: $($_.Exception.Message)" Write-Output "Exception StackTrace: $($_.Exception.StackTrace)" } } You can run this script in an Azure Automation Runbook (and theoretically in an Azure Function) to send an email using Azure Communication Services and the System Managed Identity—and there is no need to maintain or store client secrets! I did a previous article: Deploying and Testing Azure Email Communication Services that uses Azure Service Principal for authentication. In this blog, we use OAuth using a System Assigned Managed Identity.1.3KViews2likes0CommentsPre-send email analysis: Detecting sensitive data and inappropriate content using Azure AI
Azure Communication Services email enables organizations to send high volume messages to their customers using their applications. This tutorial shows how to leverage Azure AI to ensure that your messages accurately reflect your business’s brand and reputation before sending them. Azure AI offers services to analyze your email content for sensitive data and identify inappropriate content. This tutorial describes how to use Azure AI Text Analytics to check for sensitive data and Azure AI Content Safety to identify inappropriate text content. Use these functions to check your content before sending the email using Azure Communication Services. Prerequisites You need to complete these quickstarts to set up the Azure AI resources: Quickstart: Detect Personally Identifying Information (PII) in text Quickstart: Moderate text and images with content safety in Azure AI Studio Prerequisite check In a terminal or command window, run the dotnet command to check that the .NET client library is installed. reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" View the subdomains associated with your Email Communication Services resource. Sign in to the Azure portal. Locate your Email Communication Services resource. Open the Provision domains tab from the left navigation pane. Make sure that the email sub-domain you plan to use for sending email is verified in your email communication resource. For more information, see Quickstart: How to add custom verified email domains. View the domains connected to your Azure Communication Services resource. Sign in to the Azure portal. Locate your Azure Communication Services resource. Open the Email > Domains tab from the left navigation pane. Verified custom sub-domains must be connected with your Azure Communication Services resource before you use the resource to send emails. For more information, see Quickstart: How to connect a verified email domain. Create a new C# application This section describes how to create a new C# application, install required packages, and create the Main function. In a console window (such as cmd, PowerShell, or Bash), use the dotnet new command to create a new console app with the name EmailPreCheck. This command creates a simple "Hello World" C# project with a single source file: Program.cs. dotnet new console -o EmailPreCheck Change your directory to the newly created EmailPreCheck app folder and use the dotnet build command to compile your application. cd EmailPreCheck dotnet build Install required packages From the application directory, install the Azure Communication Services Email client and Azure AI libraries for .NET packages using the dotnet add package commands. dotnet add package Azure.Communication.Email dotnet add package Azure.AI.TextAnalytics dotnet add package Microsoft.Azure.CognitiveServices.ContentModerator Create the Main function Open Program.cs and replace the existing contents with the following code. The using directives include the Azure.Communication.Email and Azure.AI namespaces. The rest of the code outlines the SendMail function for your program. using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Azure; using Azure.Communication.Email; using Azure.AI.TextAnalytics; using Azure.AI.ContentSafety; namespace SendEmail { internal class Program { static async Task Main(string[] args) { // Authenticate and create the Azure Communication Services email client // Set sample content // Pre-check for sensitive data and inappropriate content // Send Email } } } Add function that checks for sensitive data Create a new function to analyze the email subject and body for sensitive data such as social security numbers and credit card numbers. private static async Task<bool> AnalyzeSensitiveData(List<string> documents) { // Client authentication goes here // Function implementation goes here } Create the Text Analytics client with authentication Create a new function with a Text Analytics client that also retrieves your connection information. Add the following code into the AnalyzeSensitiveData function to retrieve the connection key and endpoint for the resource from environment variables named LANGUAGE_KEY and LANGUAGE_ENDPOINT. It also creates the new TextAnalyticsClient and AzureKeyCredential variables. For more information about managing your Text Analytics connection information, see Quickstart: Detect Personally Identifiable Information (PII) > Get your key and endpoint. // This example requires environment variables named "LANGUAGE_KEY" and "LANGUAGE_ENDPOINT" string languageKey = Environment.GetEnvironmentVariable("LANGUAGE_KEY"); string languageEndpoint = Environment.GetEnvironmentVariable("LANGUAGE_ENDPOINT"); var client = new TextAnalyticsClient(new Uri(languageEndpoint), new AzureKeyCredential(languageKey)); Check the content for sensitive data Loop through the content to check for any sensitive data. Start the sensitivity check with a baseline of false. If sensitive data is found, return true. Add the following code into the AnalyzeSensitiveData function following the line that creates the TextAnalyticsClient variable. bool senstiveDataDetected = false; // we start with a baseline that of no sensitive data var actions = new TextAnalyticsActions { RecognizePiiEntitiesActions = new List<RecognizePiiEntitiesAction> { new RecognizePiiEntitiesAction() } }; var operation = await client.StartAnalyzeActionsAsync(documents, actions); await operation.WaitForCompletionAsync(); await foreach (var documentResults in operation.Value) { foreach (var actionResult in documentResults.RecognizePiiEntitiesResults) { if (actionResult.HasError) { Console.WriteLine($"Error: {actionResult.Error.ErrorCode} - {actionResult.Error.Message}"); } else { foreach (var document in actionResult.DocumentsResults) { foreach (var entity in document.Entities) { if (document.Entities.Count > 0) { senstiveDataDetected = true; // Sensitive data detected } } } } } } return senstiveDataDetected; Add function that checks for inappropriate content Create another new function to analyze the email subject and body for inappropriate content such as hate or violence. static async Task<bool> AnalyzeInappropriateContent(List<string> documents) { // Client authentication goes here // Function implementation goes here } Create the Content Safety client with authentication Create a new function with a Content Safety client that also retrieves your connection information. Add the following code into the AnalyzeInappropriateContent function to retrieve the connection key and endpoint for the resource from environment variables named CONTENT_LANGUAGE_KEY and CONTENT_LANGUAGE_ENDPOINT. It also creates a new ContentSafetyClient variable. If you're using the same Azure AI instance for Text Analytics, these values remain the same. For more information about managing your Content Safety connection information, see Quickstart: Detect Personally Identifiable Information (PII) > Create environment variables. // This example requires environment variables named "CONTENT_LANGUAGE_KEY" and "CONTENT_LANGUAGE_ENDPOINT" string contentSafetyLanguageKey = Environment.GetEnvironmentVariable("CONTENT_LANGUAGE_KEY"); string contentSafetyEndpoint = Environment.GetEnvironmentVariable("CONTENT_LANGUAGE_ENDPOINT"); var client = new ContentSafetyClient(new Uri(contentSafetyEndpoint), new AzureKeyCredential(contentSafetyLanguageKey)); Check for inappropriate content Loop through the content to check for inappropriate content. Start the inappropriate content detection with a baseline of false. If inappropriate content is found, return true. Add the following code into the AnalyzeInappropriateContent function after the line that creates the ContentSafetyClient variable. bool inappropriateTextDetected = false; foreach (var document in documents) { var options = new AnalyzeTextOptions(document); AnalyzeTextResult response = await client.AnalyzeTextAsync(options); // Check the response if (response != null) { // Access the results from the response foreach (var category in response.CategoriesAnalysis) { if (category.Severity > 2) // Severity: 0=safe, 2=low, 4=medium, 6=high { inappropriateTextDetected = true; } } } else { Console.WriteLine("Failed to analyze content."); } } return inappropriateTextDetected; // No inappropriate content detected Update the Main function to run prechecks and send email Now that you added the two functions for checking for sensitive data and inappropriate content, you can call them before sending email from Azure Communication Services. Create and authenticate the email client You have a few options available for authenticating to an email client. This example fetches your connection string from an environment variable. Open Program.cs in an editor. Add the following code to the body of the Main function to initialize an EmailClient with your connection string. This code retrieves the connection string for the resource from an environment variable named COMMUNICATION_SERVICES_CONNECTION_STRING. For more information about managing your resource connection string, see Quickstart: Create and manage Communication Services resources > Store your connection string. // This code shows how to fetch your connection string from an environment variable. string connectionString = Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING"); EmailClient emailClient = new EmailClient(connectionString); Add sample content Add the sample email content into the Main function, following the lines that create the email client. You need to get the sender email address. For more information about Azure Communication Services email domains, see Quickstart: How to add Azure Managed Domains to Email Communication Service. Modify the recipient email address variable. Put both the subject and the message body into a List<string> which can be used by the two content checking functions. //Set sample content var sender = "donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net"; // get the send email from your email resource in the Azure Portal var recipient = "emailalias@contoso.com"; // modify the recipient var subject = "Precheck Azure Communication Service Email with Azure AI"; var htmlContent = "<html><body><h1>Precheck email test</h1><br/><h4>This email message is sent from Azure Communication Service Email. </h4>"; htmlContent += "<p> My SSN is 123-12-1234. My Credit Card Number is: 1234 4321 5678 8765. My address is 1011 Main St, Redmond, WA, 998052 </p>"; htmlContent += "<p>A 51-year-old man was found dead in his car. There were blood stains on the dashboard and windscreen."; htmlContent += "At autopsy, a deep, oblique, long incised injury was found on the front of the neck. It turns out that he died by suicide.</p>"; htmlContent += "</body></html>"; List<string> documents = new List<string> { subject, htmlContent }; Pre-check content before sending email You need to call the two functions to look for violations and use the results to determine whether or not to send the email. Add the following code to the Main function after the sample content. // Pre-Check content bool containsSensitiveData = await AnalyzeSensitiveData(documents); bool containsInappropriateContent = await AnalyzeInappropriateContent(documents); // Send email only if not sensitive data or inappropriate content is detected if (containsSensitiveData == false && containsInappropriateContent == false) { /// Send the email message with WaitUntil.Started EmailSendOperation emailSendOperation = await emailClient.SendAsync( Azure.WaitUntil.Started, sender, recipient, subject, htmlContent); /// Call UpdateStatus on the email send operation to poll for the status manually try { while (true) { await emailSendOperation.UpdateStatusAsync(); if (emailSendOperation.HasCompleted) { break; } await Task.Delay(100); } if (emailSendOperation.HasValue) { Console.WriteLine($"Email queued for delivery. Status = {emailSendOperation.Value.Status}"); } } catch (RequestFailedException ex) { Console.WriteLine($"Email send failed with Code = {ex.ErrorCode} and Message = {ex.Message}"); } /// Get the OperationId so that it can be used for tracking the message for troubleshooting string operationId = emailSendOperation.Id; Console.WriteLine($"Email operation id = {operationId}"); } else { Console.WriteLine("Sensitive data and/or inappropriate content detected, email not sent\n\n"); } With this step, we have completed the tutorial. Happy coding! You can learn more about Azure Communication Email Service through the following links - Overview of Azure Communication Services email How to create authentication credentials for sending emails using SMTPPart 2 - Multichannel notification system using Azure Communication Services and Azure Functions
In this second part of this tutorial, we complete coding the remaining Azure Functions triggers and then go ahead to deploy the multichannel notification system to Azure Functions, testing the Email, SMS, and WhatsApp triggers with OpenAI GPTs. Let’s get started!1.4KViews0likes0CommentsSend an email in Python using Azure Communication Services
Here is a step-by-step tutorial on how to send an email using the Azure Communication Services SDK in Python. Pre-requisites 1. Azure Subscription – If you don’t have one, create a free account at Azure. 2. Python – Ensure you have Python 3.6+ installed on your machine. Setting up Azure resources Step 1: Create an Azure Communication Services Resource First, you need to create an Azure Communication Services Resource. Follow the instructions at Create Azure Communication Services resource to get started. Copy the connection string from the Keys blade of your communication resource. You'll need it later. Step 2: Create an Email Service Next, create an Email Service by following the steps at Create and manage Email Communication Service resources using the portal. This is how the create page looks like in the Azure portal. Step 3: Set Up a Free Azure Subdomain Back in the Communication resource, select Try Email. Under Select a domain, choose Set up a free Azure subdomain and select the email service you just created. Use the "Try Email" feature to ensure that your setup is working correctly. Copy and save the Send email from address (it starts with donotreply). You'll need it later. Step 4: Get the connection string and email domain from the Azure portal To send an email, you need to set up an Azure Communication Services resource and fetch the connection string. You can do this through the Azure portal: Navigate to the Azure Portal. Open the Azure Communication Services resource you created in Step 2. Go to Settings > Keys and copy the connection string. Go to Email Service resource > Domains > Copy the sender address. Or you can use the address you copied in Step 2 when setting up the Azure resources. Application code to send an Email Step 1: Install Required Packages First, let's install the required Python packages for Azure Communication Service Email. Open a terminal window on your desktop. Or in VS Code, press Ctrl + ` (press the control key and back quote at the same time) to open a terminal window in the app. In the terminal window, run the following command. pip install azure-communication-email Step 2: Create a new Python file. Open VS Code or any other IDE of your choice. Create a new Python file named send-email.py. Step 3: Write the Python Code to Send an Email 1. Import the Required Libraries import os from azure.communication.email import EmailClient 2. Initialize the Email Client Use the connection string you fetched earlier to initialize the EmailClient in your Python application. connection_string = "your_acs_connection_string" # Replace with your ACS connection string email_client = EmailClient.from_connection_string(connection_string) 3. Prepare the Email Message Next, construct the email message with subject, content, sender, and recipient details. message = { "content": { "subject": "This is the subject", "plainText": "This is the body", "html": "<html><h1>This is the body</h1></html>" }, "recipients": { "to": [ { "address": "customer@domain.com", "displayName": "Customer Name" } ] }, "senderAddress": "sender@contoso.com" } poller = email_client.begin_send(message) result = poller.result() 4. Track the Status of the Email (Optional) You can track the status of the sent email using the message_id returned by the send() method. Here’s how you can query the status of the email: def check_email_status(message_id): try: status_response = email_client.get_send_status(message_id) print(f"Email status: {status_response.status}") except HttpResponseError as ex: print(f"Failed to get email status: {ex}") # Example usage message_id = "your_message_id_here" check_email_status(message_id) Step 5: Run the Application Once you have set everything up, you can run your Python script, and the email should be sent successfully. Run the following command in the terminal. python send-email.py Step 6: Debugging and Error Handling You might encounter errors such as unverified domains, incorrect connection strings, or issues with the Azure Communication Services setup in the terminal. Conclusion You successfully sent an email using Azure Communication Services in Python! This tutorial covered the basic steps, including setting up Azure Communication Services, initializing the EmailClient, and sending an email. Here are some additional learning resources - Overview of Azure Communication Services email Quota increase for Azure Email Communication Service Quickstart - Send email to multiple recipients using Azure Communication Service Quickstart - Send email with attachments using Azure Communication Service Quickstart - Send email with inline attachments using Azure Communication Service Manage domain suppression lists in Azure Communication Services using the management client librariesExporting Query results or charts on email
Hi there, I have multiple queries & charts created in DevOps under my project where I can keep track of the projects sprint & delivery status and also keep track of bugs reported in DevOps. Want to find out if there is a way of exporting the charts and query results on an email list on a scheduled basis. I have tried using an extension in devops but it simply sends the query result table as an email which is not readable or of any significance to the management to provide tracking information. Any suggestions/guidance on the matter would be highly appreciated.990Views0likes0Comments'Get Email Address' for Channels disappeared
Hello All: I am very new to Azure AD and I have inherited something of a mess. Our organization's email addresses are all over the map. I.E. John Smith could be john@xyz.com or jsmith or johns or johnsmith. Its driving me nuts. I would like to know, in Azure AD, if there is a way to bulk update, via CSV file (or something similar), these email addresses w/out the user's losing any rights, privileges, licenses, etc to the format of firstname.lastname@xyz.com. Has anyone ever done this? If so, PLEASE HELP! Thank you all for your time.783Views0likes0Comments