Warning! This documentation is a work in progress. Expect things to be out of date and not actually work according to instructions.

Sending Email

First you need to define an SMTP server in your stallion.toml settings. You can get an SMTP email sending service for free from services such as Postmark, Sendgrid, or Mailgun.

[email]
host = "smtp.postmarkapp.com"
username = "yourusername"
password = "yourpassword"
defaultFromAddress = "someone@stallion.io"
adminEmails = ["admin@stallion.io"]
port = 587
canSpamText = "Sent by Stallion Software LLC 123 AnyStreet, Anytown USA"

(Remember, that if you do not want to put your password in plain-text, you can use encrypted secrets management).

Here is how to send a basic email using io.stallion.email.EmailSender, which itself just wraps javax.mail.

var EmailSender = Packages.io.stallion.email.EmailSender; var emailer = EmailSender.newSender(); emailer .setFrom(transformMaybe(getFromAddress())) .setHtml(html) .setReplyTo(transformMaybe(getReplyTo())) .setSubject(transformMaybe(getSubject())) .setTo(user.getEmail()); EmailSender emailer = EmailSender.newSender(); emailer .setFrom("me@service.com") .setHtml(html) .setReplyTo("service@service.com") .setSubject("You are the luck winner!") .setTo("customer@somewhere.com") .send();

The option above is very basic. There is a more complete option that gives you a bunch of nice helpers, and can be used for sending an email to any object that implements the Contactable interface (such as a User or a Contact).

Use it by creating a subclass of the io.stallion.email.ContactableEmailer

Features include:

  • easy support for sending emails based on Jinja templates
  • respect default user email opt-out
  • safe-guards for preventing accidentally sending duplicate emails

Here is an example of the built-in password reset emailer:

var JsExtendableContactableEmailer = Packages.io.stallion.email.JsExtendableContactableEmailer; var EventEmailer = Java.extend(JsExtendableContactableEmailer, { // If true, ignore default user email opt-out isTransactional: function(self) { return false; }, // Get the jinja template for the email getTemplate: function(self) { return 'emails/comment.jinja'; }, // Who is sending the email getFromAddress: function(self) { return '{ commenter.displayName } via UpFor '; }, // The email subject getSubjectJs: function(self) { return 'RE: ' + self.get('event').emailSubject; } }); // Send one email to a particular user: (new EventEmailer(user, {event: event, commenter: commenter})).sendEmail(); public class ResetEmailEmailer extends ContactableEmailer { public ResetEmailEmailer(T user, String resetToken, String returnUrl) { super(user); // Add variables to the template context put("resetToken", resetToken); put("returnUrl", url); } /** * As a transactional email, will be sent even if the user has opted out of * of marketing emails */ @Override public boolean isTransactional() { return true; } /** * Get the template for this email */ @Override public String getTemplate() { return "stallion:email/reset-password.jinja"; } /** * The subject is a simple template string that can interpolate context variables */ @Override public String getSubject() { return "Reset your password for {user.username} on " + Settings.instance().getSiteName(); } /** * Unique keys get stored in memory, and ensure we never send the same email twice */ public String getUniqueKey() { return truncate(GeneralUtils.slugify(getSubject()), 150) + "-" + user.getEmail() + "-" + minuteStamp + getEmailType(); } } // An email can then me sent as so: new ResetEmailEmailer(user, encryptedToken, returnUrl).sendEmail();

Additional stallion.toml Settings

There a few more optional settings to note:

[email]
# Defaults to true. If true, in non-prod mode, disables sending emails to
# anybody who is not match the white-list patterns. All emails instead will
# go to the outboundEmailTestAddress
restrictOutboundEmails = true
# A list of regular expressions defining which email addresses are allowed in
# non-prod mode
allowedTestingOutboundEmailPatterns = [".*@stallion.io"]
# List of email addresses that are allowed in non-prod mode
allowedOutboundEmails = ["test@stallion.io"]
# A test email address that all non-whitelisted email addresses will be routed to.
outboundEmailTestAddress = "test@stallion.io"
© 2024 Stallion Software LLC