Skip to content

Commit

Permalink
Added mailgun example.
Browse files Browse the repository at this point in the history
  • Loading branch information
jmdobry committed Oct 23, 2015
1 parent e941b43 commit 78ff1d9
Show file tree
Hide file tree
Showing 7 changed files with 259 additions and 0 deletions.
64 changes: 64 additions & 0 deletions appengine/mailgun/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## Mailgun on Google App Engine

> [Mailgun](https://www.mailgun.com/): The Email Service For Developers
### Sign up for Mailgun

1. Sign up for a [Mailgun account](https://mailgun.com/signup).
1. Add a [new domain](https://mailgun.com/app/domains).
1. Find your API key in your new domain's settings.

### Create a new Node.js app

This example uses [Express.js](http://expressjs.com) and
[node-mailgun](http://github.com/shz/node-mailgun).

### Configure

Create an `app.yaml` in the root of your application with the following
contents:

```yaml
runtime: nodejs
vm: true
api_version: 1
env_variables:
PORT: 8080
MAILGUN_API_KEY: <your-mailgun-api-key>
```
### Start the app locally
```
$ MAILGUN_API_KEY=<your-mailgun-api-key> npm start
```

Now visit http://localhost:8080 and try sending yourself an email.

When the app is deployed to Google Cloud Platform the `MAILGUN_API_KEY`
environment variable will automatically be supplied to the app.

### Deploy

Ensure your gcloud sdk is setup by running:

```
$ gcloud init
```

For convenience, you can use an npm script to run the `gcloud` command. Add
these lines to your `package.json` file:

```json
"scripts": {
"start": "node app.js",
"deploy": "gcloud preview app deploy app.yaml --promote"
}
```

At the terminal you can now run the following command to deploy your
application:

```
$ npm deploy
```
89 changes: 89 additions & 0 deletions appengine/mailgun/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright 2015, 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.

'use strict';

var http = require('http');
var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');

// [START setup]
var Mailgun = require('mailgun').Mailgun;
var mg = new Mailgun(process.env.MAILGUN_API_KEY);

var app = express();
// [END setup]

var link = 'https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/mailgun'; // jshint ignore:line

// Setup view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Parse form data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// [START index]
app.get('/', function(req, res) {
res.render('index', {
title: 'Hello World! Express.js + Mailgun on Google App Engine.'
});
});
// [END index]

// [START hello]
app.post('/hello', function(req, res, next) {
var servername = '';
var options = {};

mg.sendText(
// From
'no-reply@appengine-mailgun-demo.com',
// To
req.body.email,
// Subject
'Hello World!',
// Body
'Go to ' + link + ' to read about using Mailgun on Google App Engine.',
servername,
options,
function (err) {
if (err) {
return next(new Error('Failed to send email!'));
} else {
// Render the index route on success
return res.render('index', {
title: 'Hello World! Express.js + Mailgun on Google App Engine.',
sent: true
});
}
}
);
});
// [END hello]

// [START server]
var server = http.createServer(app).listen(
process.env.PORT || 8080,
'0.0.0.0',
function () {
var address = server.address().address;
var port = server.address().port;
console.log('App listening at http://' + address + ':' + port);
console.log('Press Ctrl+C to quit.');
}
);
// [END server]

21 changes: 21 additions & 0 deletions appengine/mailgun/app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2015, 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.
#
# [START app_yaml]
runtime: nodejs
vm: true
api_version: 1
env_variables:
PORT: 8080
MAILGUN_API_KEY: <your-mailgun-api-key>
# [END app_yaml]
21 changes: 21 additions & 0 deletions appengine/mailgun/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "appengine-mailgun",
"description": "An example of using Mailgun in Node.js on Google App Engine.",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"engines": {
"node": "~0.12.7"
},
"scripts": {
"start": "node app.js",
"deploy": "gcloud preview app deploy app.yaml --promote"
},
"dependencies": {
"body-parser": "^1.14.1",
"express": "^4.13.3",
"jade": "^1.11.0",
"mailgun": "^0.5.0",
"serve-favicon": "^2.3.0"
}
}
19 changes: 19 additions & 0 deletions appengine/mailgun/views/error.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2015, 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.
extends layout

block content
h1= message
h2= error.status
pre #{error.stack}
25 changes: 25 additions & 0 deletions appengine/mailgun/views/index.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright 2015, 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.
extends layout

block content
h1= title
p Welcome to #{title}
hr
if sent
p Email sent!
else
form(name="hello", action="/hello", method="post")
input(type="email", placeholder="Enter your email to send yourself a Hello World message", name="email", style="width: 50%; margin-right: 15px;")
input(type="submit", value="Send")
20 changes: 20 additions & 0 deletions appengine/mailgun/views/layout.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright 2015, 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.
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content

0 comments on commit 78ff1d9

Please sign in to comment.