fillTemplate static method

String fillTemplate(
  1. String template,
  2. MimeMessage message, {
  3. Map<String, String>? parameters,
})

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;
}