Skip to content

Commit

Permalink
Merge pull request #262 from GoogleCloudPlatform/sendgrid
Browse files Browse the repository at this point in the history
Add Sengrid example
  • Loading branch information
waprin committed Apr 15, 2016
2 parents f81552c + 71d55bf commit 5467c10
Show file tree
Hide file tree
Showing 6 changed files with 142 additions and 0 deletions.
13 changes: 13 additions & 0 deletions appengine/sendgrid/README.md
Original file line number Diff line number Diff line change
@@ -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).
7 changes: 7 additions & 0 deletions appengine/sendgrid/app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: .*
script: main.app
18 changes: 18 additions & 0 deletions appengine/sendgrid/appengine_config.py
Original file line number Diff line number Diff line change
@@ -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')
66 changes: 66 additions & 0 deletions appengine/sendgrid/main.py
Original file line number Diff line number Diff line change
@@ -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('<strong>HTML message body</strong>')
message.set_text('plaintext message body')
message.set_from('from: Example Sender <mailgun@{}>'.format(
SENDGRID_DOMAIN))
message.set_from('App Engine App <sendgrid@{}>'.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("""
<!doctype html>
<html><body>
<form action="/send" method="POST">
<input type="text" name="recipient" placeholder="Enter recipient email">
<input type="submit" name="submit" value="Send simple email">
</form>
</body></html>
""")


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)
37 changes: 37 additions & 0 deletions appengine/sendgrid/main_test.py
Original file line number Diff line number Diff line change
@@ -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)
1 change: 1 addition & 0 deletions appengine/sendgrid/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sendgrid==2.2.1

0 comments on commit 5467c10

Please sign in to comment.