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: https://pub.dev/packages/intl 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 from = message.decodeHeaderMailAddressValue('sender');
  if (from?.isEmpty ?? true) {
    from = message.decodeHeaderMailAddressValue('from');
  }
  if (from?.isNotEmpty ?? false) {
    definedVariables.add('from');
    template = template.replaceAll('<from>', from!.first.toString());
  }
  final date = message.decodeHeaderDateValue('date');
  if (date != null) {
    definedVariables.add('date');
    final dateStr = DateFormat.yMd().add_jm().format(date);
    template = template.replaceAll('<date>', dateStr);
  }
  final to = message.to;
  if (to?.isNotEmpty ?? false) {
    definedVariables.add('to');
    template = template.replaceAll('<to>', _renderAddresses(to!));
  }
  final cc = message.cc;
  if (cc?.isNotEmpty ?? false) {
    definedVariables.add('cc');
    template = template.replaceAll('<cc>', _renderAddresses(cc!));
  }
  final subject = message.decodeSubject();
  if (subject != null) {
    definedVariables.add('subject');
    template = template.replaceAll('<subject>', subject);
  }
  if (parameters != null) {
    for (final key in parameters.keys) {
      definedVariables.add(key);
      template = template.replaceAll('<$key>', parameters[key]!);
    }
  }
  // remove any undefined variables from template:
  final optionalInclusionsExpression = RegExp(r'\[\[\w+\s[\s\S]+?\]\]');
  RegExpMatch? match;
  while (
      (match = optionalInclusionsExpression.firstMatch(template)) != 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);
    }
    template = template.replaceAll(sequence, replacement);
  }
  return template;
}