Rendering using EEx
You are free to pass any plaintext and HTML strings to the :html
and :text
fields of the %Mailman.Email{}
struct.
However, for any serious emailing purposes, you will want to use a templating engine to handle the find-and-replace effort of personalized, event-triggered emails, as well as wrap your email bodies in a responsive, battle-tested HTML template (like Cerberus, Pine or Foundation). To that end, what better templating engine than Elixir's very own EEx!
There are three ways to use EEx with Mailman:
Using the data
field
You can use EEx strings for the :text
and :html
values of the email struct, and pass a Keyword list of values to the :data
field like so:
email = %Mailman.Email{
subject: "Hello Mailman!",
from: "mailman@elixir.com",
to: ["test1@tester123456.com"],
cc: ["test2@tester1234.com", "abcd@defd.com"],
bcc: ["1234@wsd.com"],
data: [
name: "Yo"
],
text: "Hello! <%= name %> These are Unicode: qżźół",
html: """
<html>
<body>
<b>Hello! <%= name %></b> These are Unicode: qżźół
</body>
</html>
"""
}
Using EEx templates
If your email bodies are long, you may prefer to keep them in separate files, in which case you need to tell Mailman where to find them.
You can do so using the fields in the %Mailman.EexComposeConfig{}
struct:
%Mailman.Context{
composer: %Mailman.EexComposeConfig{
root_path: "",
assets_path: "",
text_file: false,
html_file: false,
text_file_path: "",
html_file_path: ""
},
config: %Mailman.SmtpConfig{...},
}
If e.g. text_file == true
, then Mailman will assume that your emails' :text
value wil be the filename of your Eex template in the text_file_path
directory (instead of a raw, plaintext, email body string).
For now, only the %Mailman.EexComposeConfig{}
is available for configuring the existing EexComposer (although the library is happy to instead use any other composer module you might want to implement).
Using Phoenix views with templates
If you are already using Phoenix, you may prefer using your existing template/
and views/
folders and rendering the EEx through Phoenix yourself:
data = %{foo: "bar"}
rendered_html = Phoenix.View.render_to_string(App.YourEmailView, "your_email_template.html", data)
You can then use the rendered email bodies directly:
email = %Mailman.Email{
...
html: rendered_html,
...
}