aboutsummaryrefslogtreecommitdiffstats
path: root/tools/node_modules/nodemailer/node_modules/mailcomposer/README.md
blob: d5e53b437fe70e59c42034680d4c9c8f8cce5b45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# mailcomposer

**mailcomposer** is a Node.JS module for generating e-mail messages that can be
streamed to SMTP or file. 

This is a standalone module that only generates raw e-mail source, you need to 
write your own or use an existing transport mechanism (SMTP client, Amazon SES, 
SendGrid etc). **mailcomposer** frees you from the tedious task of generating 
[rfc822](http://tools.ietf.org/html/rfc2822) compatible messages.

[![Build Status](https://secure.travis-ci.org/andris9/mailcomposer.png)](http://travis-ci.org/andris9/mailcomposer)

**mailcomposer** supports:

  * **Unicode** to use any characters ✔
  * **HTML** content as well as **plain text** alternative
  * **Attachments** and streaming for larger files (use strings, buffers, files or binary streams as attachments)
  * **Embedded images** in HTML
  * **DKIM** signing
  * usage of **your own** transport mechanism

## Support mailcomposer 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)

## Installation

Install through NPM

    npm install mailcomposer

## Usage

### Include mailcomposer module

    var MailComposer = require("mailcomposer").MailComposer;

### Create a new `MailComposer` instance

    var mailcomposer = new MailComposer([options]);

Where `options` is an optional options object with the following possible properties:

  * **escapeSMTP** - if set replaces dots in the beginning of a line with double dots
  * **encoding** - sets transfer encoding for the textual parts (defaults to `"quoted-printable"`)
  * **keepBcc** - if set to true, includes `Bcc:` field in the message headers. Useful for *sendmail* command. 

### Simple example

The following example generates a simple e-mail message with plaintext and html
body.

    var MailComposer = require("mailcomposer").MailComposer;
        mailcomposer = new MailComposer(),
        fs = require("fs");
    
    // add additional header field
    mailcomposer.addHeader("x-mailer", "Nodemailer 1.0");
    
    // setup message data
    mailcomposer.setMessageOption({
        from: "andris@tr.ee",
        to: "andris@node.ee",
        body: "Hello world!",
        html: "<b>Hello world!</b>"
    }); 
    
    mailcomposer.streamMessage();
    
    // pipe the output to a file
    mailcomposer.pipe(fs.createWriteStream("test.eml"));

The output for such a script (the contents for "test.eml") would look like:

    MIME-Version: 1.0
    X-Mailer: Nodemailer 1.0
    From: andris@tr.ee
    To: andris@node.ee
    Content-Type: multipart/alternative;
            boundary="----mailcomposer-?=_1-1328088797399"
    
    ------mailcomposer-?=_1-1328088797399
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: quoted-printable
    
    Hello world!
    ------mailcomposer-?=_1-1328088797399
    Content-Type: text/html; charset=utf-8
    Content-Transfer-Encoding: quoted-printable
    
    <b>Hello world!</b>
    ------mailcomposer-?=_1-1328088797399--

## API

### Add custom headers

Headers can be added with `mailcomposer.addHeader(key, value)`

    var mailcomposer = new MailComposer();
    mailcomposer.addHeader("x-mailer", "Nodemailer 1.0");

If you add an header value with the same key several times, all of the values will be used
in the generated header. For example:

    mailcomposer.addHeader("x-mailer", "Nodemailer 1.0");
    mailcomposer.addHeader("x-mailer", "Nodemailer 2.0");
    
Will be generated into

    ...
    X-Mailer: Nodemailer 1.0
    X-Mailer: Nodemailer 2.0
    ...

The contents of the field value is not edited in any way (except for the folding),
so if you want to use unicode symbols you need to escape these to mime words
by yourself. Exception being object values - in this case the object
is automatically JSONized and mime encoded.

    // using objects as header values is allowed (will be converted to JSON)
    var apiOptions = {};
    apiOptions.category = "newuser";
    apiOptions.tags = ["user", "web"];
    mailcomposer.addHeader("X-SMTPAPI", apiOptions)

### Add message parts

You can set message sender, receiver, subject line, message body etc. with
`mailcomposer.setMessageOption(options)` where options is an object with the
data to be set. This function overwrites any previously set values with the
same key

The following example creates a simple e-mail with sender being `andris@tr.ee`, 
receiver `andris@node.ee` and plaintext part of the message as `Hello world!`:

    mailcomposer.setMessageOption({
        from: "andris@tr.ee",
        to: "andris@node.ee",
        body: "Hello world!"
    }); 

Possible options that can be used are (all fields accept unicode):

  * **from** (alias `sender`) - the sender of the message. If several addresses are given, only the first one will be used
  * **to** - receivers for the `To:` field
  * **cc** - receivers for the `Cc:` field
  * **bcc** - receivers for the `Bcc:` field
  * **replyTo** (alias `reply_to`) - e-mail address for the `Reply-To:` field
  * **inReplyTo** - The message-id this message is replying
  * **references** - Message-id list
  * **subject** - the subject line of the message
  * **body** (alias `text`) - the plaintext part of the message
  * **html** - the HTML part of the message
  * **envelope** - optional SMTP envelope, if auto generated envelope is not suitable

This method can be called several times

    mailcomposer.setMessageOption({from: "andris@tr.ee"});
    mailcomposer.setMessageOption({to: "andris@node.ee"});
    mailcomposer.setMessageOption({body: "Hello world!"});

Trying to set the same key several times will yield in overwrite

    mailcomposer.setMessageOption({body: "Hello world!"});
    mailcomposer.setMessageOption({body: "Hello world?"});
    // body contents will be "Hello world?"

### Address format

All e-mail address fields take structured e-mail lists (comma separated)
as the input. Unicode is allowed for all the parts (receiver name, e-mail username
and domain) of the address. If the domain part contains unicode symbols, it is
automatically converted into punycode, user part will be converted into UTF-8
mime word.

E-mail addresses can be a plain e-mail addresses

    username@example.com

or with a formatted name

    'Ноде Майлер' <username@example.com>

Or in case of comma separated lists, the formatting can be mixed

    username@example.com, 'Ноде Майлер' <username@example.com>, "Name, User" <username@example.com>

### 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.

    mailOptions = {
        ...,
        from: "mailer@node.ee",
        to: "daemon@node.ee",
        envelope: {
            from: "Daemon <deamon@node.ee>",
            to: "mailer@node.ee, Mailer <mailer2@node.ee>"
        }
    }

### Add attachments

Attachments can be added with `mailcomposer.addAttachment(attachment)` where
`attachment` is an object with attachment (meta)data with the following possible
properties:

  * **fileName** (alias `filename`) - filename to be reported as the name of the attached file, use of unicode is allowed
  * **cid** - 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** - content type for the attachment, if not set will be derived from the `fileName` property
  * **contentDisposition** - content disposition type for the attachment, defaults to "attachment" 
  * **userAgent** - User-Agent string to be used if the fileName points to an URL

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.

**Using embedded images in HTML**

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 attachment = {
        fileName: "image.png",
        filePath: "/static/images/image.png",
        cid: cid_value
    };

### DKIM Signing

**mailcomposer** 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 - in this case the streaming capability offered by mailcomposer is illusionary,
there will only be one `'data'` event with the entire message. 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:

    mailcomposer.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

**NB!** Currently if several header fields with the same name exists, only the last one (the one in the bottom) is signed.

Example:

    mailcomposer.setMessageOption({from: "andris@tr.ee"});
    mailcomposer.setMessageOption({to: "andris@node.ee"});
    mailcomposer.setMessageOption({body: "Hello world!"});
    mailcomposer.useDKIM({
        domainName: "node.ee",
        keySelector: "dkim",
        privateKey: fs.readFileSync("private_key.pem")
    });

### Start streaming

When the message data is setup, streaming can be started. After this it is not
possible to add headers, attachments or change body contents.

    mailcomposer.streamMessage();

This generates `'data'` events for the message headers and body and final `'end'` event.
As `MailComposer` objects are Stream instances, these can be piped

    // save the output to a file
    mailcomposer.streamMessage();
    mailcomposer.pipe(fs.createWriteStream("out.txt"));

## Envelope

Envelope can be generated with an `getEnvelope()` which returns an object
that includes a `from` address (string) and a list of `to` addresses (array of
strings) suitable for forwarding to a SMTP server as `MAIL FROM:` and `RCPT TO:`.

    console.log(mailcomposer.getEnvelope());
    // {from:"sender@example.com", to:["receiver@example.com"]}

**NB!** both `from` and `to` properties might be missing from the envelope object
if corresponding addresses were not detected from the e-mail.

## Running tests

Tests are run with [nodeunit](https://github.com/caolan/nodeunit)

Run

    npm test

or alternatively

    node run_tests.js

## License

**MIT**