getLatestMailTo method

Future<String> getLatestMailTo(
  1. String emailAddr, {
  2. int retry = 10,
  3. int delaySecs = 1,
  4. String? contains,
})

Implementation

Future<String> getLatestMailTo(
  String emailAddr, {
  int retry = 10,
  int delaySecs = 1,
  String? contains,
}) async {
  final searchUrl =
      Uri.parse('$mailHogURL/api/v2/search?kind=to&query=$emailAddr');

  for (var i = 0; i < retry; i++) {
    final resp = await http.get(searchUrl);
    assert(
      resp.statusCode == 200,
      'Error fetching $searchUrl [${resp.statusCode}]: ${resp.body}',
    );
    final decodedResponse = jsonDecode(resp.body) as Map;

    final items = decodedResponse['items'] as List;
    for (final item in items) {
      final msg = item as Map;
      if (contains != null) {
        final subject =
            ((item['Content'] as Map)['Headers'] as Map)['Subject'].first;
        if (!subject.contains(contains)) {
          print('Skipping email $subject');
          continue;
        }
      }
      final mime = MimeMessage.parseFromText((msg['Raw'] as Map)['Data']);
      return mime.decodeTextPlainPart()!;
    }

    await Future.delayed(
      Duration(seconds: delaySecs),
      () {},
    ); // let's wait a second
  }

  throw 'No Email found after $retry retries';
}