Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 41 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,79 +1,78 @@
## gulp-mail
# gulp-mail

<a href="https://www.npmjs.com/package/gulp-mail"><img width="134" height="20" src="https://img.shields.io/npm/dm/gulp-mail.svg"></a>&nbsp;&nbsp;<a href="https://github.com/fritx/gulp-mail"><img width="78" height="20" src="http://img.shields.io/badge/license-MIT-blue.svg"></a>

A [gulp](https://github.com/gulpjs/gulp) wrapper for [Nodemailer](https://nodemailer.com) used to quickly send emails from tasks and/or the command-line during development or testing.
> A [gulp](https://github.com/gulpjs/gulp) wrapper for [Nodemailer](https://nodemailer.com) used to quickly send emails from tasks and/or the command-line during development or testing.

`gulp-mail` is based on [gulp-mailer](https://github.com/meerkats/gulp-mailer), which is not available on [npm](https://www.npmjs.com/).

### Installation
## Installation

Installing via [npm](https://www.npmjs.org/package/gulp-mail):

```sh
npm install --save-dev gulp-mail
```

### Usage
## Usage

### `mail(options)`

#### `mail(options)`
- options: `Object`
* options: `Object`

### Options
## Options

`gulp-mail` uses Nodemailer v0.7.1, which has been deprecated for some time. It is, however, simple and stable. Available options for `gulp-mail` are:
`gulp-mail` uses **Nodemailer v0.7.1**, which has been deprecated for some time. It is, however, simple and stable. Available options for `gulp-mail` are:

##### options.smtp
Type: `Object`
Contains required SMTP configuration values. (See the example below.)
* ### `options.smtp`
Type: `Object`\
Contains required SMTP configuration values. (See the example below.)

##### options.to
Type: `String|Array`
A string or array containing one or more than one recipient address, respectively.
* ### `options.to`
Type: `String|Array`\
A string or array containing one or more than one recipient address, respectively.

##### options.from
Type: `String`
The display name for the sender.
* ### `options.from`
Type: `String`\
The display name for the sender.

##### options.subject
Type: `String`
The email subject line. If not provided, a default subject line is generated from the source filename as `[TEST] path.basename`.
* ### `options.subject`
Type: `String`\
The email subject line. If not provided, a default subject line is generated from the source filename as `[TEST] path.basename`.

##### options.html
Type: `String`
The HTML body of the email. If not provided, the source file becomes the message body.
* ### `options.html`
Type: `String`\
The HTML body of the email. If not provided, the source file becomes the message body.

##### options.text
Type: `String`
The plaintext body of the email. If not provided, Nodemailer generates this based on the source file.
* ### `options.text`
Type: `String`\
The plaintext body of the email. If not provided, Nodemailer generates this based on the source file.

### Example
## Example

Currently, `gulp-mail` takes in piped streams and sends emails via SMTP only.

```js
var gulp = require('gulp');
var mail = require('gulp-mail');

var smtpInfo = {
auth: {
user: 'foo@163.com',
pass: '123456'
},
host: 'smtp.163.com',
secureConnection: true,
port: 465
var smtpConfig = {
host: 'smtp.example.com',
port: 465,
secureConnection: true,
auth: {
user: 'user@example.com',
pass: 'correcthorsebatterystaple'
}
};

gulp.task('mail', function () {
return gulp.src('./mails/i-love-you.html')
return gulp.src('path/to/message.html')
.pipe(mail({
subject: 'Surprise!?',
to: [
'bar@gmail.com'
'bar@example.com'
],
from: 'Foo <foo@163.com>',
smtp: smtpInfo
from: 'Example <user@example.com>',
subject: 'A message from gulp-mail',
smtp: smtpConfig
}));
});
```
32 changes: 14 additions & 18 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
var mail = require('./')
var mailInfo = require('./test/mail-info') // private
var gulp = require('gulp')
'use strict';

gulp.task('test', function(){
// send mail
return gulp.src([
'./test/i-love-you.html',
'./test/1.html',
'./test/2.html'
])
.pipe(mail({
to: mailInfo.to,
from: mailInfo.from,
smtp: mailInfo.smtp
}))
// blocked after sending
// becase transporter remained working
})
var mail = require('./');
var smtpConfig = require('./test/smtp-config');
var gulp = require('gulp');

gulp.task('test', function () {
return gulp.src('./test/message.html').pipe(
mail({
to: smtpConfig.to,
from: smtpConfig.from,
smtp: smtpConfig.smtp,
})
);
});
99 changes: 45 additions & 54 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,63 +1,54 @@
// learnt from https://github.com/meerkats/gulp-mailer
// used old nodemailer@0.7.1 instead
'use strict';

var _ = require('underscore');
var colors = require('ansi-colors');
var flatOpts = require('flat-options');
var log = require('fancy-log');
var nodemailer = require('nodemailer');
var path = require('path');
var through2 = require('through2');
var util = require('util');
var log = require('fancy-log');
var colors = require('ansi-colors');

module.exports = function (options) {

options = _.defaults(options || {}, {
to: null,
from: null,
subject: null,
html: null,
text: null,
smtp: null
});

return through2.obj(function (file, enc, next) {

var transporter = nodemailer.createTransport("SMTP", options.smtp);

if (file.isNull()) {
this.push(file);
return next();
options = flatOpts(options, {
to: null,
from: null,
subject: null,
html: null,
text: null,
smtp: null,
});

return through2.obj(function (file, enc, callback) {
var transporter = nodemailer.createTransport('SMTP', options.smtp);

if (file.isNull()) {
this.push(file);
return callback();
}

var to = options.to.constructor === Array ? options.to.join(',') : options.to;
var subject = options.subject || path.basename(file.path);
var html = options.html || file.contents.toString();
var text = options.text || null;

return transporter.sendMail(
{
from: options.from,
to: to,
subject: subject,
generateTextFromHTML: true,
html: html,
text: text,
},
function (error, info) {
if (error) {
log.error(error);
} else {
log.info('Sent email', colors.cyan(subject), 'to', colors.red(to));
}

var to = options.to.join(',');
var subject = options.subject || _subjectFromFilename(file.path);
var html = options.html || file.contents.toString();
var text = options.text || null;

return transporter.sendMail({
from: options.from,
to: to,
subject: subject,
generateTextFromHTML: true, // added
html: html,
text: text
}, function (error, info) {

if (error) {
log.error(error);
transporter.close();
return next();
}

log.info('Sent email', colors.cyan(subject), 'to', colors.red(to));
transporter.close();
next();

});
});
transporter.close();
callback();
}
);
});
};

_subjectFromFilename = function (filename) {
var name = path.basename(filename).replace(path.extname(filename), '');
return util.format('[TEST] %s', name);
};
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "gulp-mail",
"description": "Send emails with gulp",
"version": "0.4.1",
"license": "MIT",
"homepage": "https://github.com/fritx/gulp-mail",
"repository": "git@github.com:fritx/gulp-mail.git",
"main": "./index.js",
Expand All @@ -15,14 +16,13 @@
"send"
],
"dependencies": {
"ansi-colors": "^1.1.0",
"ansi-colors": "^4.1.1",
"fancy-log": "^1.3.2",
"flat-options": "^0.1.3",
"nodemailer": "^0.7.1",
"through2": "^0.6.1",
"underscore": "^1.7.0"
"through2": "^4.0.2"
},
"devDependencies": {
"gulp": "^3.8.8"
},
"licenses": "MIT"
}
}
1 change: 0 additions & 1 deletion test/1.html

This file was deleted.

1 change: 0 additions & 1 deletion test/2.html

This file was deleted.

1 change: 0 additions & 1 deletion test/i-love-you.html

This file was deleted.

16 changes: 0 additions & 16 deletions test/mail-info.example.js

This file was deleted.

11 changes: 11 additions & 0 deletions test/message.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Message</title>
</head>
<body>
<h1>This email was sent with gulp-mail!</h1>
</body>
</html>
16 changes: 16 additions & 0 deletions test/smtp-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use strict';

// Replace the credentials below with your own in order to test
module.exports = {
to: 'to@example.com',
from: 'user@example.com',
smtp: {
host: 'smtp.example.com',
port: 465,
secureConnection: true,
auth: {
user: 'user@example.com',
pass: 'correcthorsebatterystaple',
},
},
};