---
name: "Mail::SpamAssassin::DnsResolver"
section: "3pm"
platform: "linux"
package: "spamassassin"
version: "4.0.2-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Mail::SpamAssassin::DnsResolver"
---

# Mail::SpamAssassin::DnsResolver(3pm)

DNS resolution engine

## NAME

Mail::SpamAssassin::DnsResolver - DNS resolution engine

## DESCRIPTION

This is a DNS resolution engine for SpamAssassin, implemented in order to reduce file descriptor usage by Net::DNS and avoid a response collision bug in that module.

## METHODS

- $res-\>**load\_resolver()**

  Load the `"Net::DNS::Resolver"` object.  Returns 0 if Net::DNS cannot be used, 1 if it is available.

- $resolver = $res-\>**get\_resolver()**

  Return the `"Net::DNS::Resolver"` object.

- $res-\>**configured\_nameservers()**

  Get a list of nameservers as configured by dns\_server directives or as provided by Net::DNS, typically from /etc/resolv.conf

- $res-\>**available\_nameservers()**

  Get or set a list of currently available nameservers, which is typically a known-to-be-good subset of configured nameservers

- $res-\>**connect\_sock()**

  Re-connect to the first nameserver listed in `"/etc/resolv.conf"` or similar platform-dependent source, as provided by `"Net::DNS"`.

- $res-\>**get\_sock()**

  Return the `"IO::Socket::INET"` object used to communicate with the nameserver.

- $packet = new\_dns\_packet ($domain, $type, $class)

  A wrapper for `Net::DNS::Packet::new()` which traps a die thrown by it.

  To use this, change calls to `"Net::DNS::Resolver::bgsend"` from:

  ```
      $res->bgsend($domain, $type);
  ```

  to:

  ```
      $res->bgsend(Mail::SpamAssassin::DnsResolver::new_dns_packet($domain, $type, $class));
  ```

- $id = $res-\>bgsend($domain, $type, $class, $cb)

  DIRECT USE DISCOURAGED, please use bgsend\_and\_start\_lookup in plugins.

  Quite similar to `"Net::DNS::Resolver::bgsend"`, except that when a reply packet eventually arrives, and `"poll_responses"` is called, the callback sub reference `$cb` will be called.

  Note that `$type` and `$class` may be `"undef"`, in which case they will default to `"A"` and `"IN"`, respectively.

  The callback sub will be called with three arguments -- the packet that was delivered, and an id string that fingerprints the query packet and the expected reply. The third argument is a timestamp (Unix time, floating point), captured at the time the packet was collected. It is expected that a closure callback be used, like so:

  ```
    my $id = $self->{resolver}->bgsend($domain, $type, undef, sub {
          my ($reply, $reply_id, $timestamp) = @_;
          $self->got_a_reply($reply, $reply_id);
        });
  ```

  The callback can ignore the reply as an invalid packet sent to the listening port if the reply id does not match the return value from bgsend.

- $id = $res-\>**bgread()**

  Similar to `"Net::DNS::Resolver::bgread"`.  Reads a DNS packet from a supplied socket, decodes it, and returns a Net::DNS::Packet object if successful.  Dies on error.

- $nfound = $res-\>**poll\_responses()**

  See if there are any `"bgsend"` reply packets ready, and return the number of such packets delivered to their callbacks.

- $res-\>**bgabort()**

  Call this to release pending requests from memory, when aborting backgrounded requests, or when the scan is complete. `"Mail::SpamAssassin::PerMsgStatus::check"` calls this before returning.

- $packet = $res-\>send($name, $type, $class)

  Emulates `Net::DNS::Resolver::send()`.

  This subroutine is a simple synchronous leftover from SpamAssassin version 3.3 and does not participate in packet query caching and callback grouping as implemented by **AsyncLoop::bgsend\_and\_start\_lookup()**.  As such it should be avoided for mainstream usage.  Currently used through Mail::SPF::Server by the SPF plugin.

- $res-\>**errorstring()**

  Little more than a stub for callers expecting this from `"Net::DNS::Resolver"`.

  If called immediately after a call to `$res`-\>send this will return `"query timed out"` if the `$res`-\>send DNS query timed out.  Otherwise  `"unknown error or no error"` will be returned.

  No other errors are reported.

- $res-\>**finish\_socket()**

  Reset socket when done with it.

- $res-\>**finish()**

  Clean up for destruction.
