In this post, I discussed the prospect of sending an e-mail from an Azure function in order to alert someone that something had gone wrong. In one of the comments, it was suggested that I should look into a third party tool called “SendGrid”, and this post is the result of that investigation.
Azure Configuration
SendGrid is a third party application, and so the first thing you need to do is to create an account:
The free tier covers you for 25,000 e-mails per month. However, you do get a scary warning that, because this isn’t a Microsoft product, it is not covered by Azure credits.
Anyway, click create and, after a while, you’re new SendGrid Account should be created:
You’ll need to get the API Key: to do this, select Manage:
That takes you to https://app.sendgrid.com, where you can select to create an API Key:
Clearly, you wouldn’t want a full access account to just send an e-mail in real life… but Restricted Access has a form that would take longer to fill in, and I can’t be mythered*… so we’ll go with full access for now.
Once you’ve created it, and given it a name, you should have a key (remember that key – don’t write it down, or copy it, you must remember it!).
Code
Create a new Function App, and add the SendGrid NuGet package:
https://www.nuget.org/packages/Sendgrid/
In this case, let’s create a HttpTrigger function (this will fire when a web address is accessed); the body of which needs to look something like this:
[FunctionName("SendEmail")] public static async Task<HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log) { log.Info("C# HTTP trigger function processed a request."); // parse query parameter var addresses = req.GetQueryNameValuePairs(); string[] addressArr = addresses .Where(a => a.Key == "address") .Select(a => a.Value).ToArray(); if (addressArr.Count() == 0) { return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass an address in the query string"); } else { HttpStatusCode status = await CallSendEmailAsync( "[email protected]", addressArr, "test e-mail", "Once more unto the breach, dear friends, once more;\n" + "Or close the wall up with our English dead. \n" + "In peace there's nothing so becomes a man \n" + "As modest stillness and humility: \n" + "But when the blast of war blows in our ears, \n" + "Then imitate the action of the tiger; \n" + "Stiffen the sinews, summon up the blood,"); switch (status) { case HttpStatusCode.OK: case HttpStatusCode.Accepted: { return req.CreateResponse(status, "Mail Successfully Sent"); } default: { return req.CreateResponse(status, "Unable to send e-mail"); } } } }
The `CallSendEmailAsync` helper method might look like this:
public static async Task<HttpStatusCode> CallSendEmailAsync(string from, string[] recipients, string subject, string body) { EmailAddress fromAddress = new EmailAddress(from); SendGridMessage message = new SendGridMessage() { From = fromAddress, Subject = subject, HtmlContent = body }; message.AddTos(recipients.Select(r => { return new EmailAddress(r); }).ToList()); string sendGridApiKey = "AB.keythisisthekey.nkfdhfkjfhkjfd0ei8L9xTyaTCzy_sV5gPJNX-3"; SendGridClient client = new SendGridClient(sendGridApiKey); Response response = await client.SendEmailAsync(message); return response.StatusCode; }
The key is the string that I said you should remember earlier.
You can just paste the URL into a browser, give it the e-mail addresses in the format:
https://[email protected]&[email protected]
As you will see from the link at the bottom of this post, OK (200) signifies that the message is valid, but not queued to be delivered; and Accepted (202) indicates that the message is valid and queued. My guess is that if you get an OK, it means that the mail has already been delivered.
Footnotes
* It probably took longer to type this out than to do it.
References
https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html