// 编排层:一封原始邮件 + 客户端 IP → 完整认证报告。
///|
/// 从 From 头取域名。
pub fn from_domain(message : Message) -> String? {
let fields = message.headers_named("From")
if fields.length() == 0 {
return None
}
let value = header_value_text(fields[0])
match value.split_once("@") {
None => None
Some((_, rest)) => {
let chars = rest.to_array()
let out = StringBuilder()
let mut i = 0
while i < chars.length() {
let c = chars[i]
if c == '>' ||
c == ' ' ||
c == '\t' ||
c == '\r' ||
c == '\n' ||
c == ';' ||
c == ',' {
break
}
out.write_char(c)
i = i + 1
}
let domain = trim_wsp(out.to_string())
if domain.length() == 0 {
None
} else {
Some(normalize_name(domain))
}
}
}
}
///|
/// 对一封邮件做完整认证。
///
/// `ip` 是建立 SMTP 连接的对端地址,SPF 必须依赖它,邮件本身不携带。
/// `now = 0` 表示不校验签名过期时间;`sample < 0` 表示 DMARC pct 使用完整策略。
pub fn[R : Resolver] verify_message(
resolver : R,
raw : BytesView,
ip : String,
mail_from : String,
helo : String,
now : Int,
sample : Int,
) -> AuthReport {
let message = parse_message(raw)
let dkim = if now > 0 {
verify_dkim_all(resolver, message, now~)
} else {
verify_dkim_all(resolver, message)
}
let sender_domain = match from_domain(message) {
Some(domain) => domain
None => ""
}
let spf_domain = if mail_from.length() > 0 {
normalize_name(mail_from)
} else {
sender_domain
}
let spf = if spf_domain.length() == 0 {
None
} else {
let sender = if mail_from.length() > 0 {
mail_from
} else {
"postmaster@" + spf_domain
}
if helo.length() > 0 {
Some(evaluate_spf(resolver, spf_domain, ip, helo~, sender~))
} else {
Some(evaluate_spf(resolver, spf_domain, ip, sender~))
}
}
let dmarc = if sender_domain.length() == 0 {
None
} else if sample >= 0 {
Some(evaluate_dmarc(resolver, sender_domain, dkim, spf, sample~))
} else {
Some(evaluate_dmarc(resolver, sender_domain, dkim, spf))
}
{ dkim, spf, dmarc, }
}