Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

add sendmail.js

  • Loading branch information...
commit fd9e4fcfeefd3a6ff82c9247e595e791537bdb57 1 parent fb435bd
Aaron Heckmann authored
Showing with 210 additions and 0 deletions.
  1. +83 −0 README.md
  2. +114 −0 sendmail.js
  3. +13 −0 test.js
83 README.md
View
@@ -0,0 +1,83 @@
+# sendmail for nodejs
+
+A simple wrapper for the sendmail command
+
+## Installation
+
+[Sendmail](http://www.sendmail.org/) must be installed.
+
+## Example
+ var Email = require('path/to/sendmail').Email
+ myMsg = new Email({
+ from: 'me@example.com',
+ to: 'you@example.com',
+ subject: 'Knock knock...',
+ body: "Who's there?"
+ })
+
+ // callback is optional
+ myMsg.send(function(err){
+ ...
+ })
+
+## Options
+
+ new email(config)
+
+ config options:
+
+ - to {array|string}
+ - Email address(es) to which this msg will be sent
+ - from {string}
+ - Email address from which this msg is sent. If not set
+ defaults to the `exports.from` global setting.
+ - replyTo {string}
+ - Email address to which replies will be sent. If not set
+ defaults to `from`
+ - cc {array|string}
+ - Email address(es) who receive a copy
+ - bcc {array|string}
+ - Email address(es) who receive a blind copy
+ - subject {string}
+ - The subject of the email
+ - body {string}
+ - The message of the email
+ - bodyType {string}
+ - Content type of body. Only valid option is 'html' (for now).
+ Defaults to text/plain.
+ - timeout {number}
+ - Duration in milliseconds to wait before killing the process.
+ If not set, defaults to `exports.timeout` global setting.
+
+ Global settings
+ - exports.timeout {number}
+ - Duration in milliseconds to wait before killing the process.
+ Defaults to 3000. Used when `timeout` is not set on a message.
+ - exports.from {string}
+ - Email address from which messages are sent. Used
+ when `from` was not set on a message.
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2010 Aaron Heckmann <aaron.heckmann+github@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
114 sendmail.js
View
@@ -0,0 +1,114 @@
+var sys = require('sys'),
+ exec = require('child_process').exec
+
+exports.version = '0.0.1'
+
+/**
+ * Email : Sends email using the sendmail command.
+ *
+ * Note: sendmail must be installed: see http://www.sendmail.org/
+ *
+ * @param {object} config - optional configuration object
+ * - to {array|string} Email address(es) to which this msg will be sent
+ * - from {string} Email address from which this msg is sent. If not set
+ * defaults to the `exports.from` global setting.
+ * - replyTo {string} Email address to which replies will be sent. If not
+ * set defaults to `from`
+ * - cc {array|string} Email address(es) who receive a copy
+ * - bcc {array|string} Email address(es) who receive a blind copy
+ * - subject {string} The subject of the email
+ * - body {string} The message of the email
+ * - bodyType {string} Content type of body. Only valid option is
+ * 'html' (for now). Defaults to text/plain.
+ * - timeout {number} Duration in milliseconds to wait before killing the
+ * process. If not set, defaults to `exports.timeout` global setting.
+ *
+ * Global settings
+ * - exports.timeout {number} Duration in milliseconds to wait before
+ * killing the process. Defaults to 3000. Used when `timeout` is not set
+ * on a message.
+ * - exports.from {string} Email address from which messages are sent. Used
+ * when `from` was not set on a message.
+ *
+ * Example:
+ * var Email = require('path/to/sendmail').Email
+ * myMsg = new Email({
+ * from: 'me@example.com',
+ * to: 'you@example.com',
+ * subject: 'Knock knock...',
+ * body: "Who's there?"
+ * })
+ * myMsg.send(function(err){
+ * ...
+ * })
+ *
+ **/
+
+function Email(config) {
+ var self = this
+ config = config || {};
+ ['to','from','cc','bcc','replyTo','subject','body','bodyType','timeout'].forEach(function(val){
+ self[val] = config[val]
+ })
+}
+
+Email.prototype.send = function(callback) {
+ exec('echo "' + this._buildMsg() + '" | sendmail -t',
+ { timeout: this.timeout || exports.timeout }, callback)
+}
+
+Email.prototype._buildMsg = function() {
+ if (!this.from && !exports.from)
+ error('from is required')
+
+ if (!this.to)
+ error('to is required')
+
+ if (!this.subject)
+ error('subject is required')
+
+ if (!this.body)
+ error('body is required')
+
+ var bcc = formatAddress(this.bcc),
+ cc = formatAddress(this.cc),
+ to = formatAddress(this.to),
+ mail = ''
+
+ mail += 'To:' + to + '\n'
+ mail += 'From:'+ (this.from || exports.from) +'\n'
+ mail += 'Reply-To:' + (this.replyTo || this.from || exports.from) +'\n'
+
+ if (cc)
+ mail += 'CC:'+ cc +'\n'
+
+ if (bcc)
+ mail += 'BCC:'+ bcc +'\n'
+
+ if (this.bodyType && 'html' === this.bodyType.toLowerCase()) {
+ mail += 'MIME-Version: 1.0\n'
+ mail += 'Content-Type: text/html; charset=UTF-8\n'
+ mail += 'Content-Transfer-Encoding: 8bit\n'
+ }
+
+ mail += 'Subject:'+ this.subject +'\n'
+ mail += '\n' + this.body + '\n'
+
+ return mail
+
+}
+exports.timeout = 3000
+exports.from = undefined
+exports.Email = Email
+
+
+
+function error(msg) {
+ throw new Error('sendmail error: ' + msg)
+}
+
+function formatAddress(what) {
+ return Array.isArray(what)
+ ? what.join(', ')
+ : what
+}
13 test.js
View
@@ -0,0 +1,13 @@
+
+var sendmail = require('./sendmail'),
+ Email = sendmail.Email
+var myMail = new Email({
+ to: 'you@example.com',
+ from: 'me@example.net',
+ replyTo:'else@example.com',
+ subject:'greetings',
+ body:'This is the <b>message</b>, enjoy.',
+ bodyType: 'html',
+ timeout: 5000
+})
+myMail.send(function(err){if (err) require('sys').p(err)})
Please sign in to comment.
Something went wrong with that request. Please try again.