Transactional emails

Open up email.ex and you will see a list of functions that generate Swoosh email structs. Eg:
def confirm_register_email(email, url) do
|> to(email)
|> subject("Confirm instructions")
|> render_body("confirm_register_email.html", %{url: url})
|> premail()
If I run this function in IEX I can see the Swoosh struct:
An Swoosh.Email struct can be delivered to an email address by a Swoosh mailer (see mailer.ex). Eg:
Remindly.Email.confirm_register_email(user.email, url)
|> Remindly.Mailer.deliver()
So email.ex creates the Swoosh structs and the functions for actually delivering emails like the previous code example are in user_notifier.ex. Think of email.ex functions like view templates, and user_notifer.ex functions like controller actions.
So the steps to creating a new email will be:
  1. 1.
    Create the function to generate a Swoosh struct in email.ex
  2. 2.
    Ensure it looks good by navigating to "http://localhost:4000/dev/emails" and creating a new action in email_testing_controller.ex that simply renders the html_body value of the struct
  3. 3.
    Create a new user_notifier.ex function for use in our application
To see a more detailed write up on creating an email - see this section in the "Complete web app" guide.

Marketing emails with MailBluster

Marketing emails are emails you wish to send to your whole subscriber base or some segment of them to push some kind of marketing or product updates email. It differs from a transactional email in that you haven't programmed it in your codebase - instead, you create it manually.
Since Petal Pro doesn't come with an email campaign builder, you'll have to rely on a third-party service. Some services, like Sendgrid, will do both your transactional emails and marketing emails. Others, like Postmark and SES, will only send transactional emails.
We chose MailBluster as the default service to send marketing emails because of its very lost cost, and it uses SES under the hood.
All you need to do is drop in an API key in the form of MAIL_BLUSTER_API_KEY in your .envrc file and you users will start syncing with MailBluster (see lib/petal_pro/vendor/mail_bluster.ex ). If you have already deployed to production and have some users, then you can sync them up by running PetalPro.MailBluster.sync_all_users() in IEX on your production server.
If you add some functionality that modifies a user - eg their name, you will need to re-sync that user with Mailbluster - PetalPro.MailBluster.sync_user(user).
Once you're all synced you can just log in to MailBluster and send a mass email.


MailBluster allows you to tag your users so you can segment your users. For example, we currently send the tags is_confirmed or is_suspended based on whether a user is either of those things. That way you can send emails only to users with confirmed email addresses.
To add/remove tags you can modify the code in mail_bluster.ex:
# To add another tag, firstly add it to this list:
defp all_potential_user_tags(),
do: [
# Secondly, add a function for whether or the tag should be included (eg return true if the tag should be added for a given user)
defp apply_tag?("is_confirmed", user), do: !!user.confirmed_at
defp apply_tag?("is_suspended", user), do: !!user.is_suspended