docs: function Email (template, options) {
  	debug('email %s', template);
  
  	options = options || {};
  
  	if (!template) {
  		throw new Error('You must provide an email template');
  	}
  
  	// init extension and engine
  	// options.ext is supported for backwards compatibility with keystone.Email
  	this.ext = path.extname(template) || options.ext;
  	var engine = options.engine;
  	if (!this.ext && !engine) {
  		throw new Error('You must provide options.engine or include the extension in your template path');
  	} else if (!this.ext && typeof engine === 'function') {
  		throw new Error('You must include the extension in your template path when options.engine is a function');
  	} else if (!this.ext) {
  		this.ext = '.' + engine;
  	} else if (!engine) {
  		engine = this.ext.substr(1);
  	}
  	this.engine = getEngine(engine);
  	if (typeof this.engine !== 'function') {
  		throw new Error('Invalid engine (' + engine + ')');
  	}
  	// this corrects for if options.ext is passed in without the `.`
  	if (this.ext[0] !== '.') {
  		this.ext = '.' + this.ext;
  	}
  
  	// init template
  	this.root = options.root || process.cwd();
  	this.template = this.resolve(template);
  	if (!isFile(this.template)) {
  		throw new Error('Invalid template (' + template + '), could not find file "' + this.template + '"');
  	}
  
  	// init transport
  	if (options.transport) {
  		this.transport = getTransport(options.transport);
  	}
  
  	// stash options without consumed properties, this.send() uses it as defaults
  	this.options = assign({}, options);
  	delete this.options.engine;
  	delete this.options.ext;
  	delete this.options.root;
  	delete this.options.transport;
  }