fillTemplate static method
Fills the given template with values
extracted from the provided message.
Optionally extends the template fields by defining them in the
parameters field.
Currently the following templates are supported:
`<from>`: specifies the message sender (name plus email)
`<date>`: specifies the message date
`<to>`: the `to` recipients
`<cc>`: the `cc` recipients
`<subject>`: the subject of the message
Note that for date formatting Dart's intl library is used.
You might want to specify the default locale by setting
Intl.defaultLocale first.
Implementation
static String fillTemplate(
String template,
MimeMessage message, {
Map<String, String>? parameters,
}) {
final definedVariables = <String>[];
var result = template;
var from = message.decodeHeaderMailAddressValue('sender');
if (from?.isEmpty ?? true) {
from = message.decodeHeaderMailAddressValue('from');
}
if (from != null && from.isNotEmpty) {
definedVariables.add('from');
result = result.replaceAll('<from>', from.first.toString());
}
final date = message.decodeHeaderDateValue('date');
if (date != null) {
definedVariables.add('date');
final dateStr = DateFormat.yMd().add_jm().format(date);
result = result.replaceAll('<date>', dateStr);
}
final to = message.to;
if (to != null && to.isNotEmpty) {
definedVariables.add('to');
result = result.replaceAll('<to>', _renderAddresses(to));
}
final cc = message.cc;
if (cc != null && cc.isNotEmpty) {
definedVariables.add('cc');
result = result.replaceAll('<cc>', _renderAddresses(cc));
}
final subject = message.decodeSubject();
if (subject != null) {
definedVariables.add('subject');
result = result.replaceAll('<subject>', subject);
}
if (parameters != null) {
for (final key in parameters.keys) {
definedVariables.add(key);
result = result.replaceAll('<$key>', parameters[key]!);
}
}
// remove any undefined variables from result:
final optionalInclusionsExpression = RegExp(r'\[\[\w+\s[\s\S]+?\]\]');
RegExpMatch? match;
while ((match = optionalInclusionsExpression.firstMatch(result)) != null) {
final sequence = match?.group(0) ?? '';
//print('sequence=$sequence');
final separatorIndex = sequence.indexOf(' ', 2);
final name = sequence.substring(2, separatorIndex);
var replacement = '';
if (definedVariables.contains(name)) {
replacement =
sequence.substring(separatorIndex + 1, sequence.length - 2);
}
result = result.replaceAll(sequence, replacement);
}
return result;
}