• Stars
    star
    200
  • Rank 191,420 (Top 4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 12 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An Amazon SES api for nodejs with proper error handling.

node-ses

==========

A simple and reliable Node.js mail for sending mail through Amazon SES.

Benefits

  • Does only one thing and does it well. Only the SendEmail and SendRawEmail API methods are implemented.
  • Good error handling:
    • Only "2xx" and "3xx" responses from Amazon are considered successful.
    • Returned error objects are the Error elements of Amazon's error responses with Type, Code, Message etc.
    • Support for the debug module is included if debugging is needed.
  • Tested and reliable. Includes test suite. Sending email to SES since 2012.

Synopsis

Start by creating a client object, and then call either the sendEmail or sendRawEmail method depending on your needs.

var ses = require('node-ses')
  , client = ses.createClient({key: 'key', secret: 'secret'});

// Give SES the details and let it construct the message for you.
client.sendEmail({
   to: '[email protected]'
 , from: '[email protected]'
 , cc: '[email protected]'
 , bcc: ['[email protected]', '[email protected]']
 , subject: 'greetings'
 , message: 'your <b>message</b> goes here'
 , altText: 'plain text'
}, function (err, data, res) {
 // ...
});

// ... or build a message from scratch yourself and send it.
client.sendRawEmail({
 , from: '[email protected]'
 , rawMessage: rawMessage
}, function (err, data, res) {
 // ...
});

Installation

npm install node-ses

The module has one primary export:

createClient()

You'll probably only be using this method. It takes an options object with the following properties:

`key` -  your AWS SES key. Defaults to checking `process.env.AWS_ACCESS_KEY_ID` and `process.env.AWS_ACCESS_KEY`
`secret` - your AWS SES secret. Defaults to `process.env.AWS_SECRET_ACCESS_KEY` and `process.env.AWS_SECRET_KEY`
`amazon` - [optional] the amazon end-point uri. defaults to `https://email.us-east-1.amazonaws.com`

Not all AWS regions support SES. Check SES region support to be sure the region you are in is supported.

var ses = require('node-ses')
  , client = ses.createClient({ key: 'key', secret: 'secret' });

client.sendEmail(options, function (err, data, res))

Composes an email message based on input data, and then immediately queues the message for sending.

There are several important points to know about SendEmail:

  • You can only send email from verified email addresses and domains; otherwise, you will get an "Email address not verified" error. If your account is still in the Amazon SES sandbox, you must also verify every recipient email address except for the recipients provided by the Amazon SES mailbox simulator. For more information, go to the Amazon SES Developer Guide.
  • The total size of the message cannot exceed 10 MB. This includes any attachments that are part of the message.
  • Amazon SES has a limit on the total number of recipients per message. The combined number of To:, CC: and BCC: email addresses cannot exceed 50. If you need to send an email message to a larger audience, you can divide your recipient list into groups of 50 or fewer, and then call Amazon SES repeatedly to send the message to each group.
  • For every message that you send, the total number of recipients (To:, CC: and BCC:) is counted against your sending quota - the maximum number of emails you can send in a 24-hour period. For information about your sending quota, go to the Amazon SES Developer Guide.

sendEmail receives an options object with the following properties:

`from` - email address from which to send (required)
`subject` - string (required). Must be encoded as UTF-8
`message` - can be html (required). Must be encoded as UTF-8.
`altText` - plain text version of message. Must be encoded as UTF-8.
`to` - email address or array of addresses
`cc` - email address or array of addresses
`bcc` - email address or array of addresses
`replyTo` - email address
`configurationSet` - SES configuration set name
`messageTags` - SES message tags: array of name/value objects, e.g. { name: xid, value: 1 }

At least one of to, cc or bcc is required.

Optional properties (overrides the values set in createClient):

`key` - AWS key
`secret` - AWS secret
`amazon` - AWS end point. Defaults to `https://email.us-east-1.amazonaws.com`

If you want to add a different end point than us-east-1, you can find a list here. (Note: Don't forget to add https://) The sendEmail method transports your message to the AWS SES service. If AWS returns an HTTP status code that's less than 200 or greater than or equal to 400, we will callback with an err object that is a direct tranalation of the Error element of the AWS error response.

See Error Handling section below for details on the structure of returned errors.

Check for errors returned since a 400 status is not uncommon.

The data returned in the callback is an object containing the parsed AWS response.

See the SES API Response docs for details.

The res returned by the callback represents the HTTP response to calling the SES REST API as the request module returns it.

The sendEmail method also be provided in all lowercase as sendemail for backwards compatibility.

client.sendRawEmail(options, function (err, data, res))

Sends an email message, with header and content specified by the client. The SendRawEmail action is useful for sending multipart MIME emails. The raw text of the message must comply with Internet email standards; otherwise, the message cannot be sent.

There are several important points to know about SendRawEmail:

  • You can only send email from verified email addresses and domains; otherwise, you will get an "Email address not verified" error. If your account is still in the Amazon SES sandbox, you must also verify every recipient email address except for the recipients provided by the Amazon SES mailbox simulator. For more information, go to the Amazon SES Developer Guide.
  • The total size of the message cannot exceed 10 MB. This includes any attachments that are part of the message.
  • Amazon SES has a limit on the total number of recipients per message. The combined number of To:, CC: and BCC: email addresses cannot exceed 50. If you need to send an email message to a larger audience, you can divide your recipient list into groups of 50 or fewer, and then call Amazon SES repeatedly to send the message to each group.
  • The To:, CC:, and BCC: headers in the raw message can contain a group list. Note that each recipient in a group list counts towards the 50-recipient limit. For every message that you send, the total number of recipients (To:, CC: and BCC:) is counted against your sending quota - the maximum number of emails you can send in a 24-hour period. For information about your sending quota, go to the Amazon SES Developer Guide.

sendRawEmail receives an options object with the following properties:

`from` - email address from which to send (required)
`rawMessage` - the raw text of the message which includes a header and a body (required)

Within the raw text of the message, the following must be observed:

  • The rawMessage value must contain a header and a body, separated by a blank line.
  • All required header fields must be present.
  • Each part of a multipart MIME message must be formatted properly.
  • MIME content types must be among those supported by AWS SES. For more information, see the SES Developer Guide.
  • The rawMessage content must be base64-encoded, if MIME requires it.

The sendRawEmail method transports your message to the AWS SES service. If Amazon returns an HTTP status code that's less than 200 or greater than or equal to 400, we will callback with an err object that is a direct translation of the Error element of aws error response.

See Error Handling section below for details on the structure of returned errors.

Example

var CRLF = '\r\n'
  , ses = require('node-ses')
  , client = ses.createClient({ key: 'key', secret: 'secret' })
  , rawMessage = [
    'From: "Someone" <[email protected]>',
    'To: "Someone Else" <[email protected]>',
    'Subject: greetings',
    'Content-Type: multipart/mixed;',
    '    boundary="_003_97DCB304C5294779BEBCFC8357FCC4D2"',
    'MIME-Version: 1.0',
    '',
    '--_003_97DCB304C5294779BEBCFC8357FCC4D2',
    'Content-Type: text/plain; charset="us-ascii"',
    'Content-Transfer-Encoding: quoted-printable',
    'Hi brozeph,',
    '',
    'I have attached a code file for you.',
    '',
    'Cheers.',
    '',
    '--_003_97DCB304C5294779BEBCFC8357FCC4D2',
    'Content-Type: text/plain; name="code.txt"',
    'Content-Description: code.txt',
    'Content-Disposition: attachment; filename="code.txt"; size=4;',
    '    creation-date="Mon, 03 Aug 2015 11:39:39 GMT";',
    '    modification-date="Mon, 03 Aug 2015 11:39:39 GMT"',
    'Content-Transfer-Encoding: base64',
    '',
    'ZWNobyBoZWxsbyB3b3JsZAo=',
    '',
    '--_003_97DCB304C5294779BEBCFC8357FCC4D2',
    ''
  ].join(CRLF);

client.sendRawEmail({
 , from: '[email protected]'
 , rawMessage: rawMessage
}, function (err, data, res) {
 // ...
});

Check for errors returned since a 400 status is not uncommon.

The data returned in the callback is an object containing the parsed Amazon json response.

See the SES API Response docs for details.

The res returned by the callback represents the HTTP response to calling the SES REST API as the request module returns it.

Error Handling

The errors returned when sending failed are JavaScript objects that correspond to the Error element as seen in Structure of an Error Response from the official documentation. The properties in error object we return include:

  • A Type element that identifies whether the error was a Receiver, Sender, or NodeSesInternal error
  • A Code element that identifies the type of error that occurred
  • A Message element that describes the error condition in a human-readable form
  • A Detail element that might give additional details about the error or might be empty

An error of Type NodeSesInternal is returned in three cases:

  • If the HTTP request to AWS fails so that we don't get a normal response from AWS. The Code will be RequestError and the Message will contain the HTTP request error.
  • If aws error response has invalid schema (Error element is missing), then the Code will be set to XmlError and the Message will contain explanation and the original response.

Example error response:

{
  "Type": "Sender",
  "Code": "ValidationError",
  "Message": "Value null at 'message.subject' failed to satisfy constraint: Member must not be null"
}

Debugging

# Enable in the shell
DEBUG="node-ses" ./server.js
// ... or temporarily set in your code before `node-ses` is required.
process.env.DEBUG='node-ses';

When debugging, it's useful to inspect the raw HTTP request and response send to Amazon. These can then checked against Amazon's documentation for the SendMail API method and the common errors that Amazon might return.

To turn on debugging printed to STDERR, set DEBUG=node-ses in the environment before running your script. You can also set process.env.DEBUG='node-ses'; in your code, before the node-ses module is required.

See the debug module docs for more debug output possibilities.

Running the Tests

Unit tests

npm test

To run the full tests, including actually using the AWS SES REST APIs with your credentials, set the following environment variables:

# Your SES Key and secret
NODE_SES_KEY
NODE_SES_SECRET

# An email that is both an verified sende that can also receive test emails. Possibly your own email address
NODE_SES_EMAIL

See Also

  • node-ses-any-promise is a fork with a promise-based API.
  • nodemailer has more features, including attachment support. There are many "transport" plugins available for it, including one for SES.

License

MIT

More Repositories

1

gm

GraphicsMagick for node
JavaScript
6,923
star
2

gridfs-stream

Easily stream files to and from MongoDB
JavaScript
614
star
3

m

mongodb version management
Shell
257
star
4

observed

ES6 Object.observe with nested object support - the way I want it (DEPRECATED)
JavaScript
159
star
5

sliced

A faster JavaScript alternative to [].slice.call(arguments)
JavaScript
96
star
6

mpromise

Promises/A+ conformant implementation
JavaScript
86
star
7

node-email

Simple wrapper for sendmail
JavaScript
83
star
8

greadme

Locally preview your markdown, Github style
JavaScript
77
star
9

gleak

Global variable leak detection for Node.js
JavaScript
70
star
10

gridform

Stream formidable uploads into MongoDB GridFS
JavaScript
59
star
11

muri

Muri is your friendly neighborhood MongoDB URI parser for Node.js
JavaScript
32
star
12

jquery.hook

Enables hooking into any jQuery method
31
star
13

js-styleguide

A javascript style guide.
27
star
14

mongooser

Mongoose REPL
JavaScript
23
star
15

connect-multipart-gridform

Connect multipart middleware configured to use MongoDB GridFS for file storage.
JavaScript
18
star
16

gm-demo

image manipulation demo on heroku
JavaScript
16
star
17

Nodal-Kombat

Multiplayer realtime fighting game
JavaScript
16
star
18

koa-mongodb-session

MongoDB backed session middleware for koa.js
JavaScript
15
star
19

graceful-shutdown

Shuts down a server gracefully upon the first specified signal received
JavaScript
13
star
20

mongodb-schema-miner

Generate schemata from MongoDB collections
JavaScript
12
star
21

jQuery.use

jQuery.use provides you on demand asynchronously loaded jQuery plugins at your fingertips.
JavaScript
11
star
22

channel9

channel9 demo of nodejs + mongodb + graphicsmagick
JavaScript
9
star
23

regexp-clone

Clones RegExps with flag and lastIndex preservation
JavaScript
9
star
24

gomon

MongoDB shell written in Node.js
JavaScript
8
star
25

.vim

vim
Vim Script
8
star
26

koa-session-mongodb

MongoDB backed session middleware for Koa
JavaScript
8
star
27

mongorc.js

.mongorc.js helpers
JavaScript
8
star
28

node-gameroom

My basic starter kit for creating realtime web-based games with nodejs.
JavaScript
7
star
29

once-upon

Executes a callback at most once upon the first of any number of events
JavaScript
7
star
30

express-custom-errors

What if you want to serve customized views for 403, 502, etc? That's what this plugin is for.
JavaScript
3
star
31

jquery-ui-lasso

A simple mouse lasso for jQuery ui
3
star
32

npm-downloads

Prints the number of downloads for a given npm package and the packages that directly depend on it
JavaScript
3
star
33

mongo-replset-test

Quickly set up a mongodb replica set test with authentication enabled
JavaScript
3
star
34

groups-of

Divides arrays into groups of a specified cardinality.
JavaScript
2
star
35

node-gmp

gmp for node
JavaScript
2
star
36

tic-tac-node

A silly demo of node and express
JavaScript
1
star
37

talks

My talks
JavaScript
1
star
38

workshop-04-2013

JavaScript
1
star
39

npm-update-test

Test repo for https://github.com/npm/npm/issues/19107
1
star
40

nproj

bare bones node project generator
Shell
1
star