MoonBit-native DMARC and SPF policy parser with mail-domain risk scoring
moon add JM-ai-nb/mailshieldtest {
let report = @mailshield.analyze_suite(
"example.com",
"v=spf1 ip4:203.0.113.0/24 include:_spf.example.net -all",
"v=DMARC1; p=reject; sp=reject; pct=100; rua=mailto:dmarc@example.com",
"v=DKIM1; k=ed25519; p=AbCdEfGhIjKlMnOpQrStUvWxYz1234567890; s=email; h=sha256",
"version: STSv1\nmode: enforce\nmx: mail.example.com\nmax_age: 604800",
"v=TLSRPTv1; rua=mailto:tls@example.com",
"",
)
inspect(report.coverage_label(), content="broad")
}moon run examples/basicmoon run cmd/mainmoon check --deny-warn
moon build
moon test --deny-warn
moon fmt --check
moon info
moon run examples/basic
moon run cmd/mainpub(all) struct BatchSecurityReport {
reports : Array[MailSecuritySuiteReport]
domains_checked : Int
average_score : Int
lowest_score : Int
highest_score : Int
summary : ReportSummary
actions : Array[ActionItem]
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct BimiRecord {
raw : String
valid_version : Bool
version : String
logo_url : String
authority_url : String
logo_svg : Bool
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct DkimRecord {
raw : String
valid_version : Bool
key_type : String
key_length_hint : Int
public_key_length : Int
testing_mode : Bool
service_count : Int
hash_count : Int
notes : String
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct DmarcRecord {
raw : String
valid_version : Bool
policy : String
subdomain_policy : String
pct : Int
rua_count : Int
ruf_count : Int
alignment_spf : String
alignment_dkim : String
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct MailPolicyReport {
domain : String
spf : SpfRecord
dmarc : DmarcRecord
score : Int
verdict : String
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct MailSecuritySuiteReport {
domain : String
spf : SpfRecord
dmarc : DmarcRecord
dkim : DkimRecord
mtasts : MtastsRecord
tlsrpt : TlsRptRecord
bimi : BimiRecord
score : Int
verdict : String
summary : ReportSummary
actions : Array[ActionItem]
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct MtastsRecord {
raw : String
valid_version : Bool
version : String
mode : String
max_age : Int
id : String
mx_count : Int
mx_hosts : Array[String]
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct ProfileAssessment {
profile_name : String
passed : Bool
score : Int
missing_count : Int
failed_requirements : Array[String]
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct SpfRecord {
raw : String
valid_version : Bool
mechanisms : Array[SpfMechanism]
redirect : String
explanation : String
dns_lookup_count : Int
all_qualifier : String
findings : Array[PolicyFinding]
} derive(Eq, Debug)pub(all) struct TlsRptRecord {
raw : String
valid_version : Bool
version : String
rua_count : Int
mailto_count : Int
https_count : Int
findings : Array[PolicyFinding]
} derive(Eq, Debug)fn analyze_suite(domain : String, spf_text : String, dmarc_text : String, dkim_text : String, mtasts_text : String, tlsrpt_text : String, bimi_text : String) -> MailSecuritySuiteReportfn assess_profile(report : MailSecuritySuiteReport, profile : MailSecurityProfile) -> ProfileAssessmentfn report_markdown(domain : String, spf_text : String, dmarc_text : String) -> Stringfn suite_input(domain : String, spf_text : String, dmarc_text : String, dkim_text : String, mtasts_text : String, tlsrpt_text : String, bimi_text : String) -> MailSecuritySuiteInputfn suite_report_json(domain : String, spf_text : String, dmarc_text : String, dkim_text : String, mtasts_text : String, tlsrpt_text : String, bimi_text : String) -> Stringfn suite_report_markdown(domain : String, spf_text : String, dmarc_text : String, dkim_text : String, mtasts_text : String, tlsrpt_text : String, bimi_text : String) -> StringMoonBit-native DMARC and SPF policy parser with mail-domain risk scoring