diff options
Diffstat (limited to 'tools/node_modules/nodemailer/README.md')
-rw-r--r-- | tools/node_modules/nodemailer/README.md | 619 |
1 files changed, 619 insertions, 0 deletions
diff --git a/tools/node_modules/nodemailer/README.md b/tools/node_modules/nodemailer/README.md new file mode 100644 index 0000000..2ff1e8e --- /dev/null +++ b/tools/node_modules/nodemailer/README.md @@ -0,0 +1,619 @@ +Nodemailer +========== + +**Nodemailer** is an easy to use module to send e-mails with Node.JS (using +SMTP or sendmail or Amazon SES) and is unicode friendly - You can use any characters you like ✔ + +Nodemailer is Windows friendly, you can install it with *npm* on Windows just like any other module, there are no compiled dependencies. Use it from Azure or from your Windows box hassle free. + +Version v0.3 of Nodemailer is built from scratch and might break some existing scripts, so beware while upgrading. Nodemailer should be backwards compatible - if your script worked before, then it should work now, even if Nodemailer documentation differs from your code (method names, properties etc.). + +Use [DocumentUp](http://documentup.com/andris9/nodemailer/) to read this README +in a more structured way (with TOC). + +[![Build Status](https://secure.travis-ci.org/andris9/Nodemailer.png)](http://travis-ci.org/andris9/Nodemailer) + +## Nodemailer supports + + * **Unicode** to use any characters + * **HTML content** as well as **plain text** alternative + * **Attachments** (including attachment **streaming** for sending larger files) + * **Embedded images** in HTML + * **SSL/STARTTLS** for secure e-mail delivery + * Different transport methods - **SMTP**, **sendmail** and **Amazon SES** + * SMTP **Connection pool** and connection reuse for rapid delivery + * **Preconfigured** services for using SMTP with Gmail, Hotmail etc. + * Use objects as header values for **SendGrid** SMTP API + * **XOAUTH** authentication support and token generation (3-legged OAuth) - useful with Gmail + * **DKIM** signing + +## Support Nodemailer development + +[![Donate to author](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DB26KWR2BQX5W) + +## Check out my other mail related modules + +If you want to parse generated or received e-mail instead of sending it, check +out [MailParser](https://github.com/andris9/mailparser). + +If you only want to generate the raw e-mail stream, check out +[MailComposer](https://github.com/andris9/mailcomposer). + +If you only want to communicate with the SMTP (both as client and the server), +check out [simplesmtp](https://github.com/andris9/simplesmtp). + +## Templates + +To use Nodemailer with templates, please see documentation for [node-email-templates](https://github.com/niftylettuce/node-email-templates). + +## Example + +This is a complete example to send an e-mail with plaintext and HTML body + +```javascript +var nodemailer = require("nodemailer"); + +// create reusable transport method (opens pool of SMTP connections) +var smtpTransport = nodemailer.createTransport("SMTP",{ + service: "Gmail", + auth: { + user: "gmail.user@gmail.com", + pass: "userpass" + } +}); + +// setup e-mail data with unicode symbols +var mailOptions = { + from: "Sender Name ✔ <sender@example.com>", // sender address + to: "receiver1@example.com, receiver2@example.com", // list of receivers + subject: "Hello ✔", // Subject line + text: "Hello world ✔", // plaintext body + html: "<b>Hello world ✔</b>" // html body +} + +// send mail with defined transport object +smtpTransport.sendMail(mailOptions, function(error, response){ + if(error){ + console.log(error); + }else{ + console.log("Message sent: " + response.message); + } + + // if you don't want to use this transport object anymore, uncomment following line + //smtpTransport.close(); // shut down the connection pool, no more messages +}); +``` + +See also the [examples folder](https://github.com/andris9/Nodemailer/tree/master/examples) +for full featured examples + +## Installation + +Install through NPM + +``` +npm install nodemailer +``` + +## Usage + +Include the module + +```javascript +var nodemailer = require("nodemailer"); +``` + +An e-mail can be sent with `sendMail(mailOptions[, callback])` command + +```javascript +transport.sendMail(mailOptions, callback); +``` + +Where + + * `transport` is a transport method defined with `nodemailer.createTransport` + * **mailOptions** defines the e-mail (set its subject, body text, receivers etc.), see **E-mail Message Fields** for details + * **callback** is the callback function that will be run after the e-mail is sent or the sending failed (see **Return callback** for details) + +## Setting up a transport method + +Before you can send any e-mails you need to set up a transport method. This can +be done with `nodemailer.createTransport(type, options)` where `type` indicates +the transport protocol and `options` defines how it is used. + +```javascript +var transport = nodemailer.createTransport("SMTP", {smtp_options}); +``` + +The same transport object can and should be reused several times. + +When the transport method is defined, it can be used to send e-mail with `sendMail` + +```javascript +var transport = nodemailer.createTransport("SMTP", {smtp_options}); + +transport.sendMail({ + from: "sender@tr.ee", + to: "receiver@tr.ee" + ... +}); +``` + +### Possible transport methods + +Required `type` parameter can be one of the following: + + * **SMTP** for using SMTP + * **SES** for using Amazon SES + * **Sendmail** for utilizing systems *sendmail* command + +### Setting up SMTP + +SMTP is different from the other transport mechanisms, as in its case a connection +pool is created. All the connections try to stay alive as long as possible and +are reusable to minimize the protocol overhead delay - for example setting up +TLS for authenticating is relatively lengthy process (in CPU terms, not by human +terms), you do not want to do it several times. + +Possible SMTP options are the following: + + * **service** - an optional well known service identifier ("Gmail", "Hotmail" etc., see **Well known Services** for a list of supported services) to auto-configure host, port and secure connection settings + * **host** - hostname of the SMTP server (defaults to "localhost", not needed with `service`) + * **port** - port of the SMTP server (defaults to 25, not needed with `service`) + * **secureConnection** - use SSL (default is `false`, not needed with `service`). If you're using port 587 then keep `secureConnection` false, since the connection is started in insecure plain text mode and only later upgraded with STARTTLS + * **name** - the name of the client server (defaults to machine name) + * **auth** - authentication object as `{user:"...", pass:"..."}` or `{XOAuthToken: "base64data"}` + * **ignoreTLS** - ignore server support for STARTTLS (defaults to `false`) + * **debug** - output client and server messages to console + * **maxConnections** - how many connections to keep in the pool (defaults to 5) + +Example: + +```javascript +var transport = nodemailer.createTransport("SMTP", { + service: "Gmail", + auth: { + user: "gmail.user@gmail.com", + pass: "userpass" + } +}); +``` + +or the same without `service` parameter + +```javascript +var transport = nodemailer.createTransport("SMTP", { + host: "smtp.gmail.com", // hostname + secureConnection: true, // use SSL + port: 465, // port for secure SMTP + auth: { + user: "gmail.user@gmail.com", + pass: "userpass" + } +}); +``` + +**NB!** if you want to close the pool (cancel all open connections) you can use `transport.close()` + +```javascript + +var transport = nodemailer.createTransport("SMTP",{}); +... +transport.close(); // close the pool +``` + + +#### SMTP XOAUTH and token generation + +**nodemailer** supports XOAUTH authentication for SMTP. To use this, include `XOAuthToken` option in `auth` instead of the regular `user` and `pass`. + +```javascript +var transportOptions = { + ..., + auth: { + XOAuthToken: "R0VUIGh0dHBzOi8vbWFpbC5nb29...." + } +} +``` + +**nodemailer** includes also built in XOAUTH token generator which can be used +with `nodemailer.createXOAuthGenerator()`. The function is preconfigured for +Gmail, so in this case only mandatory options are `user`, `token` and `tokenSecret`. + +```javascript +var XOAuthTokenGenerator = nodemailer.createXOAuthGenerator({ + user: "test.nodemailer@gmail.com", + // requestUrl: "https://oauth.access.point", + // consumerKey: "anonymous", + // consumerSecret: "anonymous", + token: "1/O_HgoO4h2uOUfpus0V--7mygICXrQQ0ZajB3ZH52KqM", + tokenSecret: "_mUBkIwNPnfQBUIWrJrpXJ0c" + }); +``` + +One of `user` or `requestUrl` is mandatory. `consumerKey` and `consumerSecret` both +default to `"anonymous"`. + +```javascript +var transportOptions = { + service: "Gmail", + auth: { + XOAuthToken: nodemailer.createXOAuthGenerator({ + user: "test.nodemailer@gmail.com", + token: "1/O_HgoO4h2uOUfpus0V--7mygICXrQQ0ZajB3ZH52KqM", + tokenSecret: "_mUBkIwNPnfQBUIWrJrpXJ0c" + }) + } +} +``` + +### Setting up SES + +SES is actually a HTTP based protocol, the compiled e-mail and related info +(signatures and such) are sent as a HTTP request to SES servers. + +Possible SES options are the following: + + * **AWSAccessKeyID** - AWS access key (required) + * **AWSSecretKey** - AWS secret (required) + * **ServiceUrl** - optional API end point URL (defaults to *"https://email.us-east-1.amazonaws.com"*) + +Example: + +```javascript +var transport = nodemailer.createTransport("SES", { + AWSAccessKeyID: "AWSACCESSKEY", + AWSSecretKey: "AWS/Secret/key" +}); +``` + +### Setting up Sendmail + +Sendmail transport method streams the compiled message to the *stdin* of *sendmail* +command. + +Options object is optional, possible sendmail options are the following: + + * **path** - path to the `sendmail` command (defaults to *"sendmail"*) + * **args** - an array of extra command line options to pass to the `sendmail` command (ie. `["-f sender@example.com"]`) + +Example: + +```javascript +var transport = nodemailer.createTransport("sendmail"); +``` + +or + +```javascript +var transport = nodemailer.createTransport("sendmail", { + path: "/usr/local/bin/sendmail", + args: ["-f sender@example.com"] +}); +``` + +### DKIM Signing + +**Nodemailer** supports DKIM signing with very simple setup. Use this with caution +though since the generated message needs to be buffered entirely before it can be +signed. Not a big deal with small messages but might consume a lot of RAM when +using larger attachments. + +Set up the DKIM signing with `useDKIM` method for a transport object: + +```javascript +transport.useDKIM(dkimOptions) +``` + +Where `dkimOptions` includes necessary options for signing + + * **domainName** - the domainname that is being used for signing + * **keySelector** - key selector. If you have set up a TXT record with DKIM public key at *zzz._domainkey.example.com* then `zzz` is the selector + * **privateKey** - DKIM private key that is used for signing as a string + * **headerFieldNames** - optional colon separated list of header fields to sign, by default all fields suggested by RFC4871 #5.5 are used + +All messages transmitted through this transport objects are from now on DKIM signed. + +Currently if several header fields with the same name exists, only the last one (the one in the bottom) is signed. + +Example: + +```javascript +var transport = nodemailer.createTransport("Sendmail"); + +transport.useDKIM({ + domainName: "node.ee", + keySelector: "dkim", + privateKey: fs.readFileSync("private_key.pem") +}); + +transport.sendMail(mailOptions); +``` + +See examples/example_dkim.js for a complete example. + +**NB!** Be careful when using services like Gmail, SES etc. through SMTP +(SES API is handled by Nodemailer automatically) - these tend to modify some +headers like Message-Id or Date which invalidates the signature. In this case use +`headerFieldNames` property to define only fields that won't be changed and leave +out `Date` or any other unsupported field. + +### Well known services for SMTP + +If you want to use a well known service as the SMTP host, you do not need +to enter the hostname or port number, just use the `service` parameter (**NB!** case sensitive). + +Currently cupported services are: + + * **"Gmail"** for Google Mail + * **"hot.ee"** for www.hot.ee + * **"Hotmail"** for Microsoft Live Hotmail + * **"iCloud"** for Apple iCloud + * **"mail.ee"** for www.mail.ee + * **"Postmark"** for Postmark App + * **"SendGrid"** for SendGrid + * **"SES"** for Amazon SES + * **"Yahoo"** for Yahoo Mail + * **"Zoho"** for Zoho Mail + +Predefined service data covers `host`, `port` and secure connection settings, +any other parameters (ie. `auth`) need to be set separately. + +## E-mail message fields + +The following are the possible fields of an e-mail message: + + - **from** - 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 + - **replyTo** - An e-mail address that will appear on the `Reply-To:` field + - **inReplyTo** - The message-id this message is replying + - **references** - Message-id list + - **subject** - The subject of the e-mail + - **text** - The plaintext version of the message + - **html** - The HTML version of the message + - **generateTextFromHTML** - if set to true uses HTML to generate plain text body part from the HTML if the text is not defined + - **headers** - An object of additional header fields `{"X-Key-Name": "key value"}` (NB! values are passed as is, you should do your own encoding to 7bit if needed) + - **attachments** - An array of attachment objects. + - **envelope** - optional SMTP envelope, if auto generated envelope is not suitable + - **messageId** - optional Message-Id value, random value will be generated if not set. Set to false to omit the Message-Id header + - **encoding** - optional transfer encoding for the textual parts (defaults to "quoted-printable") + +All text fields (e-mail addresses, plaintext body, html body) use UTF-8 as the encoding. +Attachments are streamed as binary. + +Example: + +```javascript +var transport = nodemailer.createTransport("Sendmail"); + +var mailOptions = { + from: "me@tr.ee", + to: "me@tr.ee", + subject: "Hello world!", + text: "Plaintext body" +} + +transport.sendMail(mailOptions); +``` + +### SendGrid support + +Nodemailer supports SendGrid [SMTP API](http://docs.sendgrid.com/documentation/api/smtp-api/) out of the box - you can +use objects as header values and these are automatically JSONized (and mime encoded if needed). + +```javascript +var mailOptions = { + ..., + headers: { + 'X-SMTPAPI': { + category : "newuser", + sub:{ + "%name%": ["Žiguli Õllepruul"] + } + } + }, + subject: "Hello, %name%" +} +``` + +This also applies to any other service that expects a JSON string as a header value for specified key. + +### Generate Text from HTML + +If `generateTextFromHTML` option is set to true, then HTML contents of the mail is automatically converted +to plaintext format when plaintext content is empty or missing. + +For example + +```javascript +mailOptions = { + ..., + generateTextFromHTML: true, + html: '<h1>Hello world</h1><p><b>How</b> are you?', + // text: '' // no text part +} +``` + +is automatically converted in the backround by Nodemailer to: + +```javascript +mailOptions = { + ..., + // source html: + html: '<h1>Hello world</h1><p><b>How</b> are you?', + // automatically generated plaintext message: + text: "Hello world\n"+ + "===========\n"+ + "\n"+ + "**How** are you?" +} +``` + +As you can see the output syntax for `generateTextFromHTML` looks similar to markdown, and that +is exactly the case here - Nodemailer includes a simple HTML to markdown converter. But don't +expect too much from it, it's not full featured or perfect, just some regexes here and there. + +### Attachment fields + +Attahcment object consists of the following properties: + + * **fileName** - filename to be reported as the name of the attached file, use of unicode is allowed (except when using Amazon SES which doesn't like it) + * **cid** - optional content id for using inline images in HTML message source + * **contents** - String or a Buffer contents for the attachment + * **filePath** - path to a file or an URL if you want to stream the file instead of including it (better for larger attachments) + * **streamSource** - Stream object for arbitrary binary streams if you want to stream the contents (needs to support *pause*/*resume*) + * **contentType** - optional content type for the attachment, if not set will be derived from the `fileName` property + * **contentDisposition** - optional content disposition type for the attachment, defaults to "attachment" + +One of `contents`, `filePath` or `streamSource` must be specified, if none is +present, the attachment will be discarded. Other fields are optional. + +Attachments can be added as many as you want. + +```javascript +var mailOptions = { + ... + attachments: [ + { // utf-8 string as an attachment + fileName: "text1.txt", + contents: "hello world! + }, + { // binary buffer as an attachment + fileName: "text2.txt", + contents: new Buffer("hello world!,"utf-8") + }, + { // file on disk as an attachment + fileName: "text3.txt", + filePath: "/path/to/file.txt" // stream this file + }, + { // fileName and content type is derived from filePath + filePath: "/path/to/file.txt" + }, + { // stream as an attachment + fileName: "text4.txt", + streamSource: fs.createReadStream("file.txt") + }, + { // define custom content type for the attachment + fileName: "text.bin", + contents: "hello world!, + contentType: "text/plain" + }, + { // use URL as an attachment + fileName: "license.txt", + filePath: "https://raw.github.com/andris9/Nodemailer/master/LICENSE" + } + ] +} +``` + +### 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>, "Name, User" <username@example.com> +``` + +You can even use unicode domain and user names, these are automatically converted +to the supported form + +``` +"Uncode Domain" <info@müriaad-polüteism.info> +``` + +### SMTP envelope + +SMTP envelope is usually auto generated from `from`, `to`, `cc` and `bcc` fields but +if for some reason you want to specify it yourself, you can do it with `envelope` property. + +`envelope` is an object with the following params: `from`, `to`, `cc` and `bcc` just like +with regular mail options. You can also use the regular address format. + +```javascript +mailOptions = { + ..., + from: "mailer@node.ee", + to: "daemon@node.ee", + envelope: { + from: "Daemon <deamon@node.ee>", + to: "mailer@node.ee, Mailer <mailer2@node.ee>" + } +} +``` + +### 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! + +```javascript +var mailOptions = { + ... + html: "Embedded image: <img src='cid:unique@node.ee' />", + attachments: [{ + filename: "image.png", + filePath: "/path/to/file", + cid: "unique@node.ee" //same cid value as in the html img src + }] +} +``` + +## Return callback + +Return callback gets two parameters + + * **error** - an error object if the message failed + * **responseStatus** - an object with some information about the status on success + +Example: + +```javascript +nodemailer.sendMail(mailOptions, function(error, responseStatus){ + if(!error){ + console.log(responseStatus.message); // response from the server + } +}); +``` + +## Tests + +Run the tests with npm in Nodemailer's directory + +``` +npm test +``` + +There aren't currently many tests for Nodemailer but there are a lot of tests +in the modules that are used to generate the raw e-mail body and to use the +SMTP client connection. + +## Tweaking + +Nodemailer in itself is actually more like a wrapper for my other modules +[mailcomposer](https://github.com/andris9/mailcomposer) for composing the raw message stream +and [simplesmtp](https://github.com/andris9/simplesmtp) for delivering it, by providing an +unified API. If there's some problems with particular parts of the +message composing/sending process you should look at the appropriate module. + +## 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. |