menu

SiteGenesis / Server-side JS / Source: app_storefront_controllers/cartridge/scripts/models/EmailModel.js

'use strict';

/**
 * Model for email functionality. Creates an EmailModel class with methods to prepare and get email.
 *
 * @module models/EmailModel
 */

var AbstractModel = require('./AbstractModel');
var Mail = require('dw/net/Mail');
var Site = require('dw/system/Site');
var Template = require('dw/util/Template');

/**
 * Email helper providing enhanced email functionality
 * @class module:models/EmailModel~EmailModel
 *
 * @extends module:models/AbstractModel
 * @extends dw.net.Mail
 * @example
 * require('~/models/EmailModel').get('mail/resetpasswordemail', Customer.profile.email)
 *     .setSubject(dw.web.Resource.msg('email.passwordassistance', 'email', null)).send({
 *          Customer : Customer,
 *          ResetPasswordToken : ResetPasswordToken
 *     });
 *
 * @param {String} template The template that is rendered and then sent as email.
 * @param {String} recipient The email address where the text of the rendered template is sent.
 */
var EmailModel = AbstractModel.extend({
    template: null,

    init: function (template, recipient) {
        this._super(new Mail());
        this.template = template;

        // prepare the email object
        var mail = this.object;
        mail.addTo(recipient);
        mail.setFrom(Site.getCurrent().getCustomPreferenceValue('customerServiceEmail') || '[email protected]');
    },

    /**
     * Prepares the email that is queued to the internal mail system for delivery.
     *
     * @alias module:models/EmailModel~EmailModel/send
     * @param {Object} args object added to the HashMap used when rendering the email template.
     * @returns {dw.system.Status} Status tells whether the mail was successfully queued ( Status.OK) or not ( Status.ERROR).
     * If an error is thrown, more information about the reason for the failure can be found within the log files.
     * If the mandatory fields from, content, and subject are empty an IllegalArgumentException is thrown. An
     * llegalArgumentException is thrown if neither to, cc, nor bcc are set.
     */
    send: function (args) {
        // Add some default keys
        var params = require('~/cartridge/scripts/object').toHashMap(args);
        params.CurrentForms = session.forms;
        params.CurrentHttpParameterMap = request.httpParameterMap;
        params.CurrentCustomer = customer;

        // Creates a body template. Renders the template using the params HashMap.
        var contentTemplate = new Template(this.template);
        params.put('MainContent', contentTemplate.render(params).text);

        // @TODO Enable this to allow for a shared pt_email which creates consistent header/footer
        // integrate the body in the global content
        //var template = new dw.util.Template('mail/pt_email');
        //var content = template.render(params);

        // Sets the content and sends it.
        this.object.setContent(params.MainContent, 'text/html', 'UTF-8');
        return this.object.send();
    },

    __noSuchMethod__: function (methodName, methodArgs) {
        var result = this._super(methodName, methodArgs);
        return result === this.object ? this : result;
    }
});

/**
 * Gets a wrapped email instance.
 *
 * @alias module:models/EmailModel~EmailModel/get
 * @param {String} template The template that is rendered and sent as email.
 * @param {String} recipient The email address where the text of the rendered template is sent.
 * @returns {module:models/EmailModel~EmailModel}
 */
EmailModel.get = function (template, recipient) {
    return new EmailModel(template, recipient);
};

/**
 * Send an email
 * @example
 * ```
 * require('~/cartridge/scripts/models/EmailModel').sendMail({
 *     recipient: '[email protected]',
 *     template: 'mail/templatename',
 *     subject: 'Your order was placed successfully',
 *     from: '[email protected]',
 *     context: {
 *         Order: order
 *     }
 * });
 * ````
 * @param {Object} options
 * @param {String} options.recipient
 * @param {String} options.template
 * @param {String} options.subject
 * @param {String} options.from
 * @param {Object} options.context
 * @return {dw.system.Status} whether the mail was successfully queued (Status.OK) or not (Status.ERROR).
 */
EmailModel.sendMail = function (options) {
    if (!options.template || !options.recipient || !options.subject) {
        return;
    }
    var mail = new Mail();
    mail.addTo(options.recipient);
    mail.setSubject(options.subject);
    mail.setFrom(options.from || Site.getCurrent().getCustomPreferenceValue('customerServiceEmail') || '[email protected]');
    var context = require('~/cartridge/scripts/object').toHashMap(options.context);
    context.CurrentForms = session.forms;
    context.CurrentHttpParameterMap = request.httpParameterMap;
    context.CurrentCustomer = customer;
    var template = new Template(options.template);
    var content = template.render(context).text;
    mail.setContent(content, 'text/html', 'UTF-8');
    return mail.send();
};

/** The Email Model class */
module.exports = EmailModel;

X Privacy Update: We use cookies to make interactions with our websites and services easy and meaningful, to better understand how they are used. By continuing to use this site you are giving us your consent to do this. Privacy Policy.