
com.mastfrog.email.server.DefaultHtmlMessageFormatter Maven / Gradle / Ivy
package com.mastfrog.email.server;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.mastfrog.settings.Settings;
import com.mastfrog.util.preconditions.Exceptions;
import com.mastfrog.util.streams.Streams;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
@Singleton
final class DefaultHtmlMessageFormatter implements HtmlMessageFormatter {
private final HtmlTemplateProvider provider;
private final boolean escape;
@Inject
DefaultHtmlMessageFormatter(HtmlTemplateProvider prov, Settings settings) {
this.provider = prov;
escape = settings.getBoolean("email.escape.html", true);
}
private String escape(String s) {
if (!escape) {
return s;
}
return s.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace("\n", "")
.replace("@", "@");
}
@Override
public String format(EmailAddress sender, String subject, String body, Map injected) {
Template tpl = provider.template(null);
Map model = new HashMap<>(injected);
model.put("subject", escape(subject));
model.put("message", escape(body));
model.put("from", sender.toString());
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
tpl.process(model, new OutputStreamWriter(out, "UTF-8"));
String result = Streams.readString(new ByteArrayInputStream(out.toByteArray()), "UTF-8", 256);
return result;
} catch (TemplateException | IOException ex) {
return Exceptions.chuck(ex);
}
}
@Override
public > String format(T template, EmailAddress sender, String subject, String body, Map injected) {
Template tpl = provider.template(template);
Map model = new HashMap<>(injected);
model.put("subject", escape(subject));
model.put("message", escape(body));
model.put("from", sender.toString());
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
tpl.process(model, new OutputStreamWriter(out, "UTF-8"));
String result = Streams.readString(new ByteArrayInputStream(out.toByteArray()), "UTF-8", 256);
return result;
} catch (TemplateException | IOException ex) {
return Exceptions.chuck(ex);
}
}
}