Mail::SPF::Mech::MX - SPF record C<mx> mechanism class


Mail-SPF documentation Contained in the Mail-SPF distribution.

Index


Code Index:

NAME

Top

Mail::SPF::Mech::MX - SPF record mx mechanism class

DESCRIPTION

Top

An object of class Mail::SPF::Mech::MX represents an SPF record mechanism of type mx.

Constructors

The following constructors are provided:

new(%options): returns Mail::SPF::Mech::MX

Creates a new SPF record mx mechanism object.

%options is a list of key/value pairs representing any of the following options:

qualifier
domain_spec
ipv4_prefix_length
ipv6_prefix_length

See new in Mail::SPF::Mech.

new_from_string($text, %options): returns Mail::SPF::Mech::MX; throws Mail::SPF::ENothingToParse, Mail::SPF::EInvalidMech

Creates a new SPF record mx mechanism object by parsing the string and any options given.

Class methods

The following class methods are provided:

default_qualifier
default_ipv4_prefix_length
default_ipv6_prefix_length
qualifier_pattern

See Class methods in Mail::SPF::Mech.

name: returns string

Returns 'mx'.

name_pattern: returns Regexp

Returns a regular expression that matches a mechanism name of 'mx'.

Instance methods

The following instance methods are provided:

text
qualifier
params
stringify
domain
match_in_domain

See Instance methods in Mail::SPF::Mech.

domain_spec: returns Mail::SPF::MacroString

Returns the domain-spec parameter of the mechanism.

ipv4_prefix_length: returns integer

Returns the IPv4 network prefix length of the mechanism.

ipv6_prefix_length: returns integer

Returns the IPv6 network prefix length of the mechanism.

match($server, $request): returns boolean

Checks whether any MX hosts of the mechanism's target domain name (that is, any of the host addresses of its DNS MX records) matches the given request's IP address (see ip_address in Mail::SPF::Request), and returns true if it does, or false otherwise. The mechanism's IP network prefix lengths are respected when matching address records against the request's IP address. See RFC 4408, 5 and 5.4, for the exact algorithm used.

SEE ALSO

Top

Mail::SPF, Mail::SPF::Record, Mail::SPF::Term, Mail::SPF::Mech

http://www.ietf.org/rfc/rfc4408.txt

For availability, support, and license information, see the README file included with Mail::SPF.

AUTHORS

Top

Julian Mehnle <julian@mehnle.net>, Shevek <cpan@anarres.org>


Mail-SPF documentation Contained in the Mail-SPF distribution.
#
# Mail::SPF::Mech::MX
# SPF record "mx" mechanism class.
#
# (C) 2005-2008 Julian Mehnle <julian@mehnle.net>
#     2005      Shevek <cpan@anarres.org>
# $Id: MX.pm 50 2008-08-17 21:28:15Z Julian Mehnle $
#
##############################################################################

package Mail::SPF::Mech::MX;

use warnings;
use strict;

use base 'Mail::SPF::SenderIPAddrMech';

use constant TRUE   => (0 == 0);
use constant FALSE  => not TRUE;

use constant name           => 'mx';
use constant name_pattern   => qr/${\name}/i;

sub parse_params {
    my ($self) = @_;
    $self->parse_domain_spec();
    $self->parse_ipv4_ipv6_prefix_lengths();
    return;
}

sub params {
    my ($self) = @_;
    my $params;
    $params .= ':' . $self->{domain_spec}
        if  defined($self->{domain_spec});
    $params .= '/' . $self->{ipv4_prefix_length}
        if  defined($self->{ipv4_prefix_length})
        and $self->{ipv4_prefix_length} != $self->default_ipv4_prefix_length;
    $params .= '//' . $self->{ipv6_prefix_length}
        if  defined($self->{ipv6_prefix_length})
        and $self->{ipv6_prefix_length} != $self->default_ipv6_prefix_length;
    return $params;
}

# Make read-only accessors:
__PACKAGE__->make_accessor($_, TRUE)
    foreach qw(domain_spec ipv4_prefix_length ipv6_prefix_length);

sub match {
    my ($self, $server, $request) = @_;
    
    $server->count_dns_interactive_term($request);
    
    my $target_domain = $self->domain($server, $request);
    my $mx_packet     = $server->dns_lookup($target_domain, 'MX');
    my @mx_rrs        = $mx_packet->answer
        or $server->count_void_dns_lookup($request);
    
    # Respect the MX mechanism lookups limit (RFC 4408, 5.4/3/4):
    @mx_rrs = splice(@mx_rrs, 0, $server->max_name_lookups_per_mx_mech)
        if defined($server->max_name_lookups_per_mx_mech);
    
    # TODO Use A records from packet's "additional" section?  Probably not.
    
    # Check MX records:
    foreach my $rr (@mx_rrs) {
        if ($rr->type eq 'MX') {
            return TRUE
                if $self->match_in_domain($server, $request, $rr->exchange);
        }
        else {
            # Unexpected RR type.
            # TODO Generate debug info or ignore silently.
        }
    }
    
    return FALSE;
}

TRUE;