Azure Functions SendGrid bindings
This article explains how to send email by using SendGrid bindings in Azure Functions. Azure Functions supports an output binding for SendGrid.
This is reference information for Azure Functions developers. If you're new to Azure Functions, start with the following resources:
C# developer references:
Install extension
The extension NuGet package you install depends on the C# mode you're using in your function app:
Functions execute in an isolated C# worker process. To learn more, see Guide for running C# Azure Functions in an isolated worker process.
The functionality of the extension varies depending on the extension version:
Add the extension to your project by installing the NuGet package, version 3.x.
Install bundle
Starting with Functions version 2.x, the HTTP extension is part of an extension bundle, which is specified in your host.json project file. To learn more, see extension bundle.
This version of the extension should already be available to your function app with extension bundle, version 2.x.
Example
A C# function can be created by using one of the following C# modes:
- Isolated worker model: Compiled C# function that runs in a worker process that's isolated from the runtime. Isolated worker process is required to support C# functions running on LTS and non-LTS versions .NET and the .NET Framework.
- In-process model: Compiled C# function that runs in the same process as the Functions runtime.
- C# script: Used primarily when you create C# functions in the Azure portal.
Important
Support will end for the in-process model on November 10, 2026. We highly recommend that you migrate your apps to the isolated worker model for full support.
We don't currently have an example for using the SendGrid binding in a function app running in an isolated worker process.
The following example shows a SendGrid output binding in a function.json file and a JavaScript function that uses the binding.
Here's the binding data in the function.json file:
{
"bindings": [
{
"name": "$return",
"type": "sendGrid",
"direction": "out",
"apiKey" : "MySendGridKey",
"to": "{ToEmail}",
"from": "{FromEmail}",
"subject": "SendGrid output bindings"
}
]
}
The configuration section explains these properties.
Here's the JavaScript code:
module.exports = function (context, input) {
var message = {
"personalizations": [ { "to": [ { "email": "sample@sample.com" } ] } ],
from: { email: "sender@contoso.com" },
subject: "Azure news",
content: [{
type: 'text/plain',
value: input
}]
};
return message;
};
Complete PowerShell examples aren't currently available for SendGrid bindings.
The following example shows an HTTP-triggered function that sends an email using the SendGrid binding. You can provide default values in the binding configuration. For instance, the from email address is configured in function.json.
{
"scriptFile": "__init__.py",
"bindings": [
{
"type": "httpTrigger",
"authLevel": "function",
"direction": "in",
"name": "req",
"methods": ["get", "post"]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "sendGrid",
"name": "sendGridMessage",
"direction": "out",
"apiKey": "SendGrid_API_Key",
"from": "sender@contoso.com"
}
]
}
The following function shows how you can provide custom values for optional properties.
import logging
import json
import azure.functions as func
def main(req: func.HttpRequest, sendGridMessage: func.Out[str]) -> func.HttpResponse:
value = "Sent from Azure Functions"
message = {
"personalizations": [ {
"to": [{
"email": "user@contoso.com"
}]}],
"subject": "Azure Functions email with SendGrid",
"content": [{
"type": "text/plain",
"value": value }]}
sendGridMessage.set(json.dumps(message))
return func.HttpResponse(f"Sent")
The following example uses the @SendGridOutput
annotation from the Java functions runtime library to send an email using the SendGrid output binding.
package com.function;
import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
public class HttpTriggerSendGrid {
@FunctionName("HttpTriggerSendGrid")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = { HttpMethod.GET, HttpMethod.POST },
authLevel = AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
@SendGridOutput(
name = "message",
dataType = "String",
apiKey = "SendGrid_API_Key",
to = "user@contoso.com",
from = "sender@contoso.com",
subject = "Azure Functions email with SendGrid",
text = "Sent from Azure Functions")
OutputBinding<String> message,
final ExecutionContext context) {
final String toAddress = "user@contoso.com";
final String value = "Sent from Azure Functions";
StringBuilder builder = new StringBuilder()
.append("{")
.append("\"personalizations\": [{ \"to\": [{ \"email\": \"%s\"}]}],")
.append("\"content\": [{\"type\": \"text/plain\", \"value\": \"%s\"}]")
.append("}");
final String body = String.format(builder.toString(), toAddress, value);
message.setValue(body);
return request.createResponseBuilder(HttpStatus.OK).body("Sent").build();
}
}
Attributes
Both in-process and isolated worker process C# libraries use attributes to define the output binding. C# script instead uses a function.json configuration file.
In isolated worker process function apps, the SendGridOutputAttribute
supports the following parameters:
Attribute/annotation property | Description |
---|---|
ApiKey | The name of an app setting that contains your API key. If not set, the default app setting name is AzureWebJobsSendGridApiKey . |
To | (Optional) The recipient's email address. |
From | (Optional) The sender's email address. |
Subject | (Optional) The subject of the email. |
Text | (Optional) The email content. |
Annotations
The SendGridOutput annotation allows you to declaratively configure the SendGrid binding by providing the following configuration values.
Configuration
The following table lists the binding configuration properties available in the function.json file and the SendGrid
attribute/annotation.
function.json property | Description |
---|---|
type | Must be set to sendGrid . |
direction | Must be set to out . |
name | The variable name used in function code for the request or request body. This value is $return when there is only one return value. |
apiKey | The name of an app setting that contains your API key. If not set, the default app setting name is AzureWebJobsSendGridApiKey. |
to | (Optional) The recipient's email address. |
from | (Optional) The sender's email address. |
subject | (Optional) The subject of the email. |
text | (Optional) The email content. |
Optional properties may have default values defined in the binding and either added or overridden programmatically.
When you're developing locally, add your application settings in the local.settings.json file in the Values
collection.
host.json settings
This section describes the configuration settings available for this binding in versions 2.x and higher. Settings in the host.json file apply to all functions in a function app instance. The example host.json file below contains only the version 2.x+ settings for this binding. For more information about function app configuration settings in versions 2.x and later versions, see host.json reference for Azure Functions.
Note
For a reference of host.json in Functions 1.x, see host.json reference for Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"sendGrid": {
"from": "Azure Functions <samples@functions.com>"
}
}
}
Property | Default | Description |
---|---|---|
from | n/a | The sender's email address across all functions. |