nodemailer
Version:
Easy to use module to send e-mails, supports unicode and SSL/TLS
263 lines (181 loc) • 9.11 kB
Markdown
Nodemailer
==========
**Nodemailer** is an easy to use module to send e-mails with Node.JS (using SMTP or sendmail).
You can use two ways to send an e-mail message: the *EmailMessage* constructor or the shortcut function *send_mail()*.
The *send_mail()* function takes all the fields of the e-mail message as a function parameter and sends the e-mail immediately.
*EmailMessage* allows to compose the message object first and send it later with its method *send()*. Nodemailers API is designed after Google App Engines [Mail Python API](http://code.google.com/intl/et-EE/appengine/docs/python/mail/).
**Nodemailer is Unicode friendly ✔**. You can use any characters you like.
Nodemailer supports
-------------------
- *Unicode* to use any characters
- *HTML content* as well as plain text alternative
- *Attachments*
- *Embedded images* in HTML
- *SSL/TLS* for secure e-mail delivery
Installation
------------
Install through *NPM*
npm install nodemailer
or download [ZIP archive](https://github.com/andris9/Nodemailer/zipball/master).
The source for Nodemailer is available at [GitHub](https://github.com/andris9/Nodemailer).
*NB!* If you are using the source and not the automagic of *NPM*, then you also need to install following dependencies:
* [mimelib](https://github.com/andris9/mimelib)
* [node-iconv](https://github.com/bnoordhuis/node-iconv)
If you use *NPM* then the module is available as
var nodemailer = require('nodemailer');
but if you're using the source then
var nodemailer = require('./path_to_nodemailer/lib/mail');
Usage
-----
Using *send_mail()*
var nodemailer = require('nodemailer');
nodemailer.SMTP = {
host: 'smtp.example.com'
}
nodemailer.send_mail({
sender: 'me@example.com',
to:'you@example.com',
subject:'Hello!',
body:'Hi, how are you doing?'
},
function(error, success){
console.log('Message ' + success ? 'sent' : 'failed');
});
Using *EmailMessage*
var nodemailer = require('nodemailer');
nodemailer.SMTP = {
host: 'smtp.example.com'
}
var mail = nodemailer.EmailMessage({
sender: 'me@example.com',
to:'you@example.com'
});
mail.subject = 'Hello!';
mail.body = 'Hi, how are you doing?';
mail.send(function(error, success){
console.log('Message ' + success ? 'sent' : 'failed');
});
The callback function gets two parameters - *error* and *success*. If there's an error, then sending failed and you should check where's the problem.
If there's no error value but *success* is not *true* then the server wasn't able to process the message correctly. Probably there was timeout while processing
the message etc - in this case you should re-schedule sending this e-mail. If *success* is *true* then the message was sent successfully.
### NB!
Before sending e-mails you need to set up SMTP server parameters.
nodemailer.SMTP = {
host: 'smtp.example.com', // required
port: 25, // optional, defaults to 25 or 465
use_authentication: false,
user: '',
pass: ''
}
Or alternatively if you don't want to use SMTP but the `sendmail` command then you could
set property *sendmail* to true or as the path to *sendmail*.
nodemailer.sendmail = true;
or
nodemailer.sendmail = '/path/to/sendmail';
If *sendmail* is set, then SMTP options are disregarded.
See [examples/example.js](https://github.com/andris9/Nodemailer/blob/master/examples/example.js) for a complete example.
### SSL Support (port 465)
If you want to use SSL (not TLS/STARTTLS, just SSL), you need to set the *ssl* parameter to true.
nodemailer.SMTP = {
host: 'smtp.gmail.com',
port: 465,
ssl: true,
use_authentication: true,
user: 'my.username@gmail.com',
pass: 'my.password'
}
### TLS Support (port 587)
If you want to use TLS/STARTTLS (port 587), leave *ssl* to false or do not set it, encryption will be started automatically when needed.
nodemailer.SMTP = {
host: 'smtp.gmail.com',
port: 587,
ssl: false,
use_authentication: true,
user: 'my.username@gmail.com',
pass: 'my.password'
}
E-mail Message Fields
--------------------
The following are the possible fields of an e-mail message:
- **sender** - The e-mail address of the sender. All e-mail addresses can be plain `sender@server.com` or formatted `Sender Name <sender@server.com>`
- **to** - Comma separated list of recipients e-mail addresses that will appear on the `To:` field
- **cc** - Comma separated list of recipients e-mail addresses that will appear on the `Cc:` field
- **bcc** - Comma separated list of recipients e-mail addresses that will appear on the `Bcc:` field
- **reply_to** - An e-mail address that will appear on the `Reply-To:` field
- **subject** - The subject of the e-mail
- **body** - The plaintext version of the message
- **html** - The HTML version of the message
- **attachments** - An array of attachment objects. Attachment object consists of two properties - `filename` and `contents`. Property `contents` can either be a String or a Buffer (for binary data). `filename` is the name of the attachment.
There's an optional extra field **headers** which holds custom header values in the form of `{key: value}`. These values will not overwrite any existing header but will be appended to the list.
mail_data = {
sender:'me@example.com',
to:'you@example.com',
....
headers: {
'X-My-Custom-Header-Value': 'Visit www.example.com for more info!'
}
}
For debugging set **debug** to true - then all the data passed between the client and the server will be output to console.
Address Formatting
------------------
All the e-mail addresses can be plain e-mail address
username@example.com
or with formatted name (includes unicode support)
'Ноде Майлер' <username@example.com>
To, Cc and Bcc fields accept comma separated list of e-mails. Formatting can be mixed.
username@example.com, 'Ноде Майлер' <username@example.com>, User Name <username@example.com>
Currently you can't use comma in a formatted name, even if the name is in quotes.
Creating HTML messages
----------------------
Message body in HTML format can be set with the message field `html`. If property `html` has contents but plain text alternative `body` has not (is left to empty), then existing text from the html version is also used in the plaintext version (without the html formatting).
The charset for `html` is UTF-8.
nodemailer.send_mail({
...
html: '<p>hello world!<br/>хелло ворлд!</p>'
});
Using Attachments
-----------------
An e-mail message can include one or several attachments. Attachments can be set with the message field `attachments` which accepts a list of attachment objects.
An attachment object primarly consists of two properties - `filename` which is the name of the file (not a filepath to an actual file on disk etc.) that will be reported to the receiver as the attachments name; and `contents` to hold the data in a String or Buffer format.
There's an additional property `cid` which can be used for embedding images in a HTML message.
Property `filename` is unicode safe.
var attachment_list = [
{
'filename': 'attachment1.txt',
'contents': 'contents for attachment1.txt'
},
{
'filename': 'аттачмент2.bin',
'contents': new Buffer('binary contents', 'binary');
}
];
nodemailer.send_mail({
...
attachments: attachment_list
});
Using Embedded Images
---------------------
Attachments can be used as embedded images in the HTML body. To use this feature, you need to set additional property
of the attachment - `cid` (unique identifier of the file) which is a reference to the attachment file.
The same `cid` value must be used as the image URL in HTML (using `cid:` as the URL protocol, see example below).
**NB!** the cid value should be as unique as possible!
var cid_value = Date.now() + '.image.jpg';
var html = 'Embedded image: <img src="cid:' + cid_value + '" />';
var attachments = [{
filename: 'image.png',
contents: IMAGE_CONTENTS,
cid: cid_value
}];
Issues
------
Use [Nodemailer Issue tracker](https://github.com/andris9/Nodemailer/issues) to report additional shortcomings, bugs, feature requests etc.
### Charsets
Currently the only allowed charset is UTF-8.
### Attachments
Do not use large attachments as the attachment contents are read into memory and the final message body is combined into one large string before sending.
Contributors
------------
See [Nodemailer/contributors](https://github.com/andris9/Nodemailer/contributors) for a live list
License
-------
**Nodemailer** is licensed under [MIT license](https://github.com/andris9/Nodemailer/blob/master/LICENSE). Basically you can do whatever you want to with it.