Sendgrid provides email service which we can use for sending emails from our app and we can even track every details of
any email sent through our Sendgrid account like whether it is delivered, opened, dropped and details of unsubscribed email
addresses etc.
There are also API endpoints provided by Sendgrid to access user subscribe/unsubscribe related data and email event data
with respect to emails sent through your sendgrid account for which documentation link is provided at bottom.
To understand this lets go through simple example to fetch sendgrid subscription groups data from your sendgrid account -
- Generate API key in your Sendgrid account and store it in your app based on different environments for which you use that Sendgrid account. While generating API key for your account you can set access permission as per your requirement for that API key. For example I just set
Read
permissions forSuppression Management Service
for my API key as I will be just reading suppression groups data from my account. You can any time change permissions for you API key once it is generated.
sendgrid_v3_api_config.yml
all: &ALL
url: "https://api.sendgrid.com/v3"
development:
<<: *ALL
api_key: "YOUR_API_KEY_FOR_DEVELOPMENT_SENDGRID"
staging:
<<: *ALL
api_key: "YOUR_API_KEY_FOR_STAGING_SENDGRID"
production:
<<: *ALL
api_key: "YOUR_API_KEY_FOR_PROD_SENDGRID"
- Request to any available Sendgrid V3 API endpoints by using API key in following way -
Example curl request to send email
-
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "your.email@example.com"}]}],
"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'
Rails service using Net HTTP library to access Sendgrid suppression management endpoint to get suppression groups
-
Here I have written service to make make get request only, you can make any other request as well using Net HTTP library and modify following snippet as per your need.
class SendgridApiService
SENDGRID_CONFIG = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'sendgrid_v3_api_config.yml'))).result)[Rails.env]
attr_accessor :api_key, :endpoint_url
def get_response
response = request_object.request(request_with_auth_header)
return unless response.is_a?(Net::HTTPSuccess)
response.body and JSON.parse(response.body)
end
def initialize(api_endpoint)
self.api_key = SENDGRID_CONFIG['api_key']
self.endpoint_url = SENDGRID_CONFIG['url'] + api_endpoint
end
def new_uri
URI.parse(endpoint_url)
end
def request_object
http_obj = Net::HTTP.new(new_uri.host, new_uri.port)
http_obj.use_ssl = true
http_obj.verify_mode = OpenSSL::SSL::VERIFY_NONE
http_obj
end
def request_with_auth_header
request = Net::HTTP::Get.new(new_uri.path)
request['Authorization'] = "Bearer #{api_key}"
request['content-type'] = "application/json"
request
end
end
And now you can pass any endpoint available for get request to above service and read from that endpoint.
For example in above case to fetch subscription groups data from sendgrid asm groups endpoint -
SendgridApiService.new("/asm/groups").get_response