| Mail-SPF documentation | Contained in the Mail-SPF distribution. |
Mail::SPF::v2::Record - Sender ID ("spf2.0") record class
See Mail::SPF::Record.
An object of class Mail::SPF::v2::Record represents a Sender ID
(spf2.0) record.
The following constructors are provided:
Creates a new Sender ID ("spf2.0") record object.
%options is a list of key/value pairs representing any of the following options:
Required. See new in Mail::SPF::Record. The 'mfrom' and 'pra' scopes are supported. There is no default.
Creates a new Sender ID ("spf2.0") record object by parsing the string and any options given.
The following class methods are provided:
Returns a regular expression that matches a version tag of 'spf2.0/' plus a comma-separated list of any of the 'mfrom' and 'pra' scopes. The following are valid version tags:
spf2.0/mfrom
spf2.0/pra
spf2.0/mfrom,pra
spf2.0/pra,mfrom
The following instance methods are provided:
Returns 'spf2.0/' plus a comma-separated list of the scopes of the record. See version_tag_pattern for a list of possible return values.
Mail::SPF, Mail::SPF::Record, Mail::SPF::Term, Mail::SPF::Mech, Mail::SPF::Mod
http://www.ietf.org/rfc/rfc4408.txt
For availability, support, and license information, see the README file included with Mail::SPF.
Julian Mehnle <julian@mehnle.net>, Shevek <cpan@anarres.org>
| Mail-SPF documentation | Contained in the Mail-SPF distribution. |
# # Mail::SPF::v2::Record # Sender ID ("spf2.0") record class. # # (C) 2005-2008 Julian Mehnle <julian@mehnle.net> # 2005 Shevek <cpan@anarres.org> # $Id: Record.pm 50 2008-08-17 21:28:15Z Julian Mehnle $ # ############################################################################## package Mail::SPF::v2::Record;
use warnings; use strict; use base 'Mail::SPF::Record'; use constant TRUE => (0 == 0); use constant FALSE => not TRUE; use constant mech_classes => { all => 'Mail::SPF::Mech::All', ip4 => 'Mail::SPF::Mech::IP4', ip6 => 'Mail::SPF::Mech::IP6', a => 'Mail::SPF::Mech::A', mx => 'Mail::SPF::Mech::MX', ptr => 'Mail::SPF::Mech::PTR', 'exists' => 'Mail::SPF::Mech::Exists', include => 'Mail::SPF::Mech::Include' }; use constant mod_classes => { redirect => 'Mail::SPF::Mod::Redirect', 'exp' => 'Mail::SPF::Mod::Exp' }; eval("require $_") foreach values(%{mech_classes()}), values(%{mod_classes()}); use constant valid_scope => qr/^(?: mfrom | pra )$/x; use constant version_tag_pattern => qr{ spf(2\.0) / ( (?: mfrom | pra ) (?: , (?: mfrom | pra ) )* ) (?= \x20 | $ ) }ix;
sub new { my ($self, %options) = @_; $self = $self->SUPER::new(%options); if (not defined($self->{parse_text})) { # No parsing is intended, so scopes should have been specified: my $scopes = $self->{scopes} || []; @$scopes > 0 or throw Mail::SPF::EInvalidScope('No scopes for spf2.0 record'); foreach my $scope (@$scopes) { $scope =~ $self->valid_scope or throw Mail::SPF::EInvalidScope("Invalid scope '$scope' for spf2.0 record"); } } return $self; }
sub parse_version_tag { my ($self) = @_; if ($self->{parse_text} =~ s/^${\$self->version_tag_pattern}(?:\x20+|$)//) { my $scopes = $self->{scopes} = [ split(/,/, $2) ]; @$scopes > 0 or throw Mail::SPF::EInvalidScope('No scopes for spf2.0 record'); foreach my $scope (@$scopes) { $scope =~ $self->valid_scope or throw Mail::SPF::EInvalidScope("Invalid scope '$scope' for spf2.0 record"); } } else { throw Mail::SPF::EInvalidRecordVersion( "Not a 'spf2.0' record: '" . $self->text . "'"); } return; }
sub version_tag { my ($self) = @_; return 'spf2.0' if not ref($self) # called as class method or not defined($self->{scopes}) # no scopes parsed or not @{$self->{scopes}}; # no scopes specified in record return 'spf2.0/' . join(',', @{$self->{scopes}}); }
TRUE;