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