resolveMX method

  1. @override
Future<List<MXRecord>> resolveMX(
  1. String domain
)
override

Resolves MX records for a domain, returning both preference and address.

Implementation

@override
Future<List<MXRecord>> resolveMX(String domain) async {
  // Get full MX DNS records
  final record = await client.lookupHttpsByRRType(domain, RRType.MX);

  final answers = record.answer ?? [];

  final mxRecords = <MXRecord>[];

  for (var answer in answers) {
    if (answer.type == RRType.MX.value) {
      // MX data format: "priority mailserver"
      // Example: "10 mail.example.com."
      final parts = answer.data.split(' ');
      if (parts.length >= 2) {
        final preference = int.tryParse(parts[0]) ?? 0;
        final hostname = parts[1].replaceAll(RegExp(r'\.$'), '');

        if (hostname.isNotEmpty) {
          try {
            // Resolve the MX hostname to an IP
            final addresses = await InternetAddress.lookup(hostname);
            for (var addr in addresses) {
              mxRecords.add(MXRecord(preference, addr));
            }
          } catch (e, s) {
            _log.severe(
              "Error calling: `InternetAddress.lookup('$hostname')`",
              e,
              s,
            );
          }
        }
      }
    }
  }

  // Sort by preference (lowest first)
  mxRecords.sort();

  return mxRecords;
}