diff --git a/appengine/sendgrid/README.md b/appengine/sendgrid/README.md
new file mode 100644
index 00000000000..fc4b596d290
--- /dev/null
+++ b/appengine/sendgrid/README.md
@@ -0,0 +1,13 @@
+# Sendgrid & Google App Engine
+
+This sample application demonstrates how to use [Sendgrid with Google App Engine](https://cloud.google.com/appengine/docs/python/mail/sendgrid)
+
+Refer to the [App Engine Samples README](../../README.md) for information on how to run and deploy this sample.
+
+# Setup
+
+Before running this sample:
+
+1. You will need a [Sendgrid account](http://sendgrid.com/partner/google).
+2. Update the `SENGRID_DOMAIN_NAME` and `SENGRID_API_KEY` constants in `main.py`. You can use
+the [Sendgrid sandbox domain](https://support.sendgrid.com/hc/en-us/articles/201995663-Safely-Test-Your-Sending-Speed).
diff --git a/appengine/sendgrid/app.yaml b/appengine/sendgrid/app.yaml
new file mode 100644
index 00000000000..42ad35ed2a8
--- /dev/null
+++ b/appengine/sendgrid/app.yaml
@@ -0,0 +1,7 @@
+runtime: python27
+threadsafe: yes
+api_version: 1
+
+handlers:
+- url: .*
+ script: main.app
diff --git a/appengine/sendgrid/appengine_config.py b/appengine/sendgrid/appengine_config.py
new file mode 100644
index 00000000000..c903d9a0ac5
--- /dev/null
+++ b/appengine/sendgrid/appengine_config.py
@@ -0,0 +1,18 @@
+# Copyright 2016 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from google.appengine.ext import vendor
+
+# Add any libraries installed in the "lib" folder.
+vendor.add('lib')
diff --git a/appengine/sendgrid/main.py b/appengine/sendgrid/main.py
new file mode 100644
index 00000000000..4fdf64294e8
--- /dev/null
+++ b/appengine/sendgrid/main.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright 2016 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sendgrid
+import webapp2
+
+# make a secure connection to SendGrid
+SENDGRID_API_KEY = 'your-sendgrid-api-key'
+SENDGRID_DOMAIN = 'your-sendgrid-domain'
+
+sg = sendgrid.SendGridClient(SENDGRID_API_KEY)
+
+
+def send_simple_message(recipient):
+ message = sendgrid.Mail()
+ message.set_subject('message subject')
+ message.set_html('HTML message body')
+ message.set_text('plaintext message body')
+ message.set_from('from: Example Sender '.format(
+ SENDGRID_DOMAIN))
+ message.set_from('App Engine App '.format(SENDGRID_DOMAIN))
+ message.add_to(recipient)
+ status, msg = sg.send(message)
+ return (status, msg)
+
+
+class MainPage(webapp2.RequestHandler):
+ def get(self):
+ self.response.content_type = 'text/html'
+ self.response.write("""
+
+
+
+
+""")
+
+
+class SendEmailHandler(webapp2.RequestHandler):
+ def post(self):
+ recipient = self.request.get('recipient')
+ (status, msg) = send_simple_message(recipient)
+ self.response.set_status(status)
+ if status == 200:
+ self.response.write(msg)
+
+
+app = webapp2.WSGIApplication([
+ ('/', MainPage),
+ ('/send', SendEmailHandler)
+], debug=True)
diff --git a/appengine/sendgrid/main_test.py b/appengine/sendgrid/main_test.py
new file mode 100644
index 00000000000..f03ad69e9a0
--- /dev/null
+++ b/appengine/sendgrid/main_test.py
@@ -0,0 +1,37 @@
+# Copyright 2016 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import main
+
+import mock
+import pytest
+import webtest
+
+
+@pytest.fixture
+def app():
+ return webtest.TestApp(main.app)
+
+
+def test_get(app):
+ response = app.get('/')
+ assert response.status_int == 200
+
+
+@mock.patch.object(main.sg, 'send', return_value=(200, "OK"))
+def test_post(send_mock, app):
+ app.post('/send', {
+ 'recipient': 'waprin@google.com'
+ })
+ send_mock.assert_called_once_with(mock.ANY)
diff --git a/appengine/sendgrid/requirements.txt b/appengine/sendgrid/requirements.txt
new file mode 100644
index 00000000000..6efb6fdf814
--- /dev/null
+++ b/appengine/sendgrid/requirements.txt
@@ -0,0 +1 @@
+sendgrid==2.2.1