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