#spf #smtp #dns #domain


Data model and parser for Sender Policy Framework (SPF) records

6 releases

0.5.0 Sep 12, 2023
0.5.0-alpha.1 Jul 12, 2023
0.4.1 May 10, 2022
0.4.0 Mar 6, 2022
0.4.0-alpha.3 Jan 20, 2022

#304 in Email

Download history 346/week @ 2023-07-26 380/week @ 2023-08-02 388/week @ 2023-08-09 851/week @ 2023-08-16 667/week @ 2023-08-23 430/week @ 2023-08-30 311/week @ 2023-09-06 350/week @ 2023-09-13 368/week @ 2023-09-20 267/week @ 2023-09-27 200/week @ 2023-10-04 241/week @ 2023-10-11 289/week @ 2023-10-18 343/week @ 2023-10-25 281/week @ 2023-11-01 346/week @ 2023-11-08

1,305 downloads per month
Used in 18 crates (via viaspf)


2.5K SLoC


The viaspf-record library contains a data model and parser for SPF records. SPF records are described in the Sender Policy Framework specification, version 1 (RFC 7208).

The data structures in this library constitute a complete and faithful encoding of the ABNF in RFC 7208, section 12. Extensive checking ensures correctness and conformance with the specification.

This library is used in viaspf, where you can find a complete implementation of SPF, including APIs for performing SPF queries. The viaspf-record library is a stand-alone product and could also be used in other projects.

The minimum supported Rust version is 1.65.0.


This is a Rust library. Include viaspf-record in Cargo.toml as usual.

The struct SpfRecord represents a syntactically valid SPF record. An SpfRecord can be constructed programmatically or parsed from a string.

use std::net::Ipv4Addr;
use viaspf_record::*;

let spf_record = "v=spf1 mx ip4: -all".parse();

    Ok(SpfRecord {
        terms: vec![
            Term::Directive(Directive {
                qualifier: None,
                mechanism: Mechanism::Mx(Mx {
                    domain_spec: None,
                    prefix_len: None,
            Term::Directive(Directive {
                qualifier: None,
                mechanism: Mechanism::Ip4(Ip4 {
                    addr: Ipv4Addr::new(12, 34, 56, 78),
                    prefix_len: Some(Ip4CidrLength::new(24).unwrap()),
            Term::Directive(Directive {
                qualifier: Some(Qualifier::Fail),
                mechanism: Mechanism::All,

Refer to the API documentation for details.


Copyright © 2020–2023 David Bürgin

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

No runtime deps