use std::str::from_utf8;
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub enum EmailHeaders {
#[serde(rename = "Accept-Language")]
AcceptLanguage, #[serde(rename = "Alternate-Recipient")]
AlternateRecipient, #[cfg(feature = "smtp-experimental")]
#[serde(rename = "ARC-Authentication-Results")]
ARCAuthenticationResults, #[cfg(feature = "smtp-experimental")]
#[serde(rename = "ARC-Message-Signature")]
ARCMessageSignature, #[cfg(feature = "smtp-experimental")]
#[serde(rename = "ARC-Seal")]
ARCSeal, #[serde(rename = "Archived-At")]
ArchivedAt, #[serde(rename = "Authentication-Results")]
AuthenticationResults, #[serde(rename = "Auto-Submitted")]
AutoSubmitted, #[serde(rename = "Autoforwarded")]
AutoForwarded, #[serde(rename = "Autosubmitted")]
Autosubmitted,
#[serde(rename = "Bcc")]
Bcc,
#[serde(rename = "Cc")]
Cc, #[serde(rename = "Comments")]
Comments, #[serde(rename = "Content-Identifier")]
ContentIdentifier, #[serde(rename = "Content-Return")]
ContentReturn, #[serde(rename = "Conversion")]
Conversion, #[serde(rename = "Conversion-With-Loss")]
ConversionWithLoss,
#[serde(rename = "DL-Expansion-History")]
DLExpansionHistory, #[serde(rename = "Date")]
Date, #[serde(rename = "Deferred-Delivery")]
DeferredDelivery, #[serde(rename = "Delivery-Date")]
DeliveryDate, #[serde(rename = "Discarded-X400-IPMS-Extensions")]
DiscardedX400IPMSExtensions, #[serde(rename = "Discarded-X400-MTS-Extensions")]
DiscardedX400MTSExtensions, #[serde(rename = "Disclose-Recipients")]
DiscloseRecipients, #[serde(rename = "Disposition-Notification-Options")]
DispositionNotificationOptions, #[serde(rename = "Disposition-Notification-To")]
DispositionNotificationTo, #[serde(rename = "DKIM-Signature")]
DKIMSignature, #[serde(rename = "Downgraded-Final-Recipient")]
DowngradedFinalRecipient, #[serde(rename = "Downgraded-In-Reply-To")]
DowngradedInReplyTo, #[serde(rename = "Downgraded-Message-Id")]
DowngradedMessageId, #[serde(rename = "Downgraded-Original-Recipient")]
DowngradedOriginalRecipient, #[serde(rename = "Downgraded-References")]
DowngradedReferences,
#[serde(rename = "Encoding")]
Encoding, #[serde(rename = "Encrypted")]
Encrypted, #[serde(rename = "Expires")]
Expires, #[serde(rename = "Expiry-Date")]
ExpiryDate,
#[serde(rename = "From")]
From,
#[serde(rename = "Generate-Delivery-Report")]
GenerateDeliveryReport,
#[serde(rename = "Importance")]
Importance, #[serde(rename = "In-Reply-To")]
InReplyTo, #[serde(rename = "Incomplete-Copy")]
IncompleteCopy,
#[serde(rename = "Keywords")]
Keywords,
#[serde(rename = "Language")]
Language, #[serde(rename = "Latest-Delivery-Time")]
LatestDeliveryTime, #[serde(rename = "List-Archive")]
ListArchive, #[serde(rename = "List-Help")]
ListHelp, #[serde(rename = "List-Id")]
ListId, #[serde(rename = "List-Owner")]
ListOwner, #[serde(rename = "List-Post")]
ListPost, #[serde(rename = "List-Subscribe")]
ListSubscribe, #[serde(rename = "List-Unsubscribe")]
ListUnsubscribe, #[serde(rename = "List-Unsubscribe-Post")]
ListUnsubscribePost,
#[serde(rename = "Message-Context")]
MessageContext, #[serde(rename = "Message-Id")]
MessageId, #[serde(rename = "Message-Type")]
MessageType, #[serde(rename = "MT-Priority")]
MTPriority,
#[serde(rename = "Obsoletes")]
Obsoletes, #[serde(rename = "Organization")]
Organization, #[serde(rename = "Original-Encoded-Information-Types")]
OriginalEncodedInformationTypes, #[serde(rename = "Original-From")]
OriginalFrom, #[serde(rename = "Original-Message-Id")]
OriginalMessageId, #[serde(rename = "Original-Recipient")]
OriginalRecipient, #[serde(rename = "Originator-Return-Address")]
OriginatorReturnAddress, #[serde(rename = "Original-Subject")]
OriginalSubject,
#[serde(rename = "PICS-Label")]
PICSLabel, #[serde(rename = "Prevent-NonDelivery-Report")]
PreventNonDeliveryReport, #[serde(rename = "Priority")]
Priority,
#[serde(rename = "Received")]
Received, #[serde(rename = "Received-SPF")]
ReceivedSPF, #[serde(rename = "References")]
References, #[serde(rename = "Reply-By")]
ReplyBy, #[serde(rename = "Reply-To")]
ReplyTo, #[serde(rename = "Require-Recipient-Valid-Since")]
RequireRecipientValidSince, #[serde(rename = "Resent-Bcc")]
ResentBcc, #[serde(rename = "Resent-Cc")]
ResentCc, #[serde(rename = "Resent-Date")]
ResentDate, #[serde(rename = "Resent-From")]
ResentFrom, #[serde(rename = "Resent-Message-Id")]
ResentMessageId, #[serde(rename = "Resent-Reply-To")]
ResentReplyTo, #[serde(rename = "Resent-Sender")]
ResentSender, #[serde(rename = "Resent-To")]
ResentTo, #[serde(rename = "Return-Path")]
ReturnPath,
#[serde(rename = "Sender")]
Sender, #[serde(rename = "Sensitivity")]
Sensitivity, #[serde(rename = "Solicitation")]
Solicitation, #[serde(rename = "Subject")]
Subject, #[serde(rename = "Supersedes")]
Supersedes,
#[serde(rename = "TLS-Report-Domain")]
TLSReportDomain, #[serde(rename = "TLS-Report-Submitter")]
TLSReportSubmitter, #[serde(rename = "TlS-Required")]
TLSRequired, #[serde(rename = "To")]
To,
#[serde(rename = "VBR-Info")]
VBRInfo,
#[serde(rename = "X400-Content-Identifier")]
X400ContentIdentifier, #[serde(rename = "X400-Content-Return")]
X400ContentReturn, #[serde(rename = "X400-Content-Type")]
X400ContentType, #[serde(rename = "X400-MTS-Identifier")]
X400MTSIdentifier, #[serde(rename = "X400-Originator")]
X400Originator, #[serde(rename = "X400-Received")]
X400Received, #[serde(rename = "X400-Recipients")]
X400Recipients, #[serde(rename = "X400-Trace")]
X400Trace, }
impl EmailHeaders {
pub fn get_header_hashmap() -> HashMap<String, EmailHeaders> {
vec![
("Accept-Language", EmailHeaders::AcceptLanguage),
("Alternate-Recipient", EmailHeaders::AlternateRecipient),
#[cfg(feature = "smtp-experimental")]
("ARC-Authentication-Results", EmailHeaders::ARCAuthenticationResults),
#[cfg(feature = "smtp-experimental")]
("ARC-Message-Signature", EmailHeaders::ARCMessageSignature),
#[cfg(feature = "smtp-experimental")]
("ARC-Seal", EmailHeaders::ARCSeal),
("Archived-At", EmailHeaders::ArchivedAt),
("Authentication-Results", EmailHeaders::AuthenticationResults),
("Auto-Submitted", EmailHeaders::AutoSubmitted),
("Autoforwarded", EmailHeaders::AutoForwarded),
("Autosubmitted", EmailHeaders::Autosubmitted),
("Bcc", EmailHeaders::Bcc),
("Cc", EmailHeaders::Cc),
("Comments", EmailHeaders::Comments),
("Content-Identifier", EmailHeaders::ContentIdentifier),
("Content-Return", EmailHeaders::ContentReturn),
("Conversion", EmailHeaders::Conversion),
("Conversion-With-Loss", EmailHeaders::ConversionWithLoss),
("DL-Expansion-History", EmailHeaders::DLExpansionHistory),
("Date", EmailHeaders::Date),
("Deferred-Delivery", EmailHeaders::DeferredDelivery),
("Delivery-Date", EmailHeaders::DeliveryDate),
("Discarded-X400-IPMS-Extensions", EmailHeaders::DiscardedX400IPMSExtensions),
("Discarded-X400-MTS-Extensions", EmailHeaders::DiscardedX400MTSExtensions),
("Disclose-Recipients", EmailHeaders::DiscloseRecipients),
("Disposition-Notification-Options", EmailHeaders::DispositionNotificationOptions),
("Disposition-Notification-To", EmailHeaders::DispositionNotificationTo),
("DKIM-Signature", EmailHeaders::DKIMSignature),
("Downgraded-Final-Recipient", EmailHeaders::DowngradedFinalRecipient),
("Downgraded-In-Reply-To", EmailHeaders::DowngradedInReplyTo),
("Downgraded-Message-Id", EmailHeaders::DowngradedMessageId),
("Downgraded-Original-Recipient", EmailHeaders::DowngradedOriginalRecipient),
("Downgraded-References", EmailHeaders::DowngradedReferences),
("Encoding", EmailHeaders::Encoding),
("Encrypted", EmailHeaders::Encrypted),
("Expires", EmailHeaders::Expires),
("Expiry-Date", EmailHeaders::ExpiryDate),
("From", EmailHeaders::From),
("Generate-Delivery-Report", EmailHeaders::GenerateDeliveryReport),
("Importance", EmailHeaders::Importance),
("In-Reply-To", EmailHeaders::InReplyTo),
("Incomplete-Copy", EmailHeaders::IncompleteCopy),
("Keywords", EmailHeaders::Keywords),
("Language", EmailHeaders::Language),
("Latest-Delivery-Time", EmailHeaders::LatestDeliveryTime),
("List-Archive", EmailHeaders::ListArchive),
("List-Help", EmailHeaders::ListHelp),
("List-Id", EmailHeaders::ListId),
("List-Owner", EmailHeaders::ListOwner),
("List-Post", EmailHeaders::ListPost),
("List-Subscribe", EmailHeaders::ListSubscribe),
("List-Unsubscribe", EmailHeaders::ListUnsubscribe),
("List-Unsubscribe-Post", EmailHeaders::ListUnsubscribePost),
("Message-Context", EmailHeaders::MessageContext),
("Message-Id", EmailHeaders::MessageId),
("Message-Type", EmailHeaders::MessageType),
("MT-Priority", EmailHeaders::MTPriority),
("Obsoletes", EmailHeaders::Obsoletes),
("Organization", EmailHeaders::Organization),
("Original-Encoded-Information-Types", EmailHeaders::OriginalEncodedInformationTypes),
("Original-From", EmailHeaders::OriginalFrom),
("Original-Message-Id", EmailHeaders::OriginalMessageId),
("Original-Recipient", EmailHeaders::OriginalRecipient),
("Originator-Return-Address", EmailHeaders::OriginatorReturnAddress),
("Original-Subject", EmailHeaders::OriginalSubject),
("PICS-Label", EmailHeaders::PICSLabel),
("Prevent-NonDelivery-Report", EmailHeaders::PreventNonDeliveryReport),
("Priority", EmailHeaders::Priority),
("Received", EmailHeaders::Received),
("Received-SPF", EmailHeaders::ReceivedSPF),
("References", EmailHeaders::References),
("Reply-By", EmailHeaders::ReplyBy),
("Reply-To", EmailHeaders::ReplyTo),
("Require-Recipient-Valid-Since", EmailHeaders::RequireRecipientValidSince),
("Resent-Bcc", EmailHeaders::ResentBcc),
("Resent-Cc", EmailHeaders::ResentCc),
("Resent-Date", EmailHeaders::ResentDate),
("Resent-From", EmailHeaders::ResentFrom),
("Resent-Message-Id", EmailHeaders::ResentMessageId),
("Resent-Reply-To", EmailHeaders::ResentReplyTo),
("Resent-Sender", EmailHeaders::ResentSender),
("Resent-To", EmailHeaders::ResentTo),
("Return-Path", EmailHeaders::ReturnPath),
("Sender", EmailHeaders::Sender),
("Sensitivity", EmailHeaders::Sensitivity),
("Solicitation", EmailHeaders::Solicitation),
("Subject", EmailHeaders::Subject),
("Supersedes", EmailHeaders::Supersedes),
("TLS-Report-Domain", EmailHeaders::TLSReportDomain),
("TLS-Report-Submitter", EmailHeaders::TLSReportSubmitter),
("TlS-Required", EmailHeaders::TLSRequired),
("To", EmailHeaders::To),
("VBR-Info", EmailHeaders::VBRInfo),
("X400-Content-Identifier", EmailHeaders::X400ContentIdentifier),
("X400-Content-Return", EmailHeaders::X400ContentReturn),
("X400-Content-Type", EmailHeaders::X400ContentType),
("X400-MTS-Identifier", EmailHeaders::X400MTSIdentifier),
("X400-Originator", EmailHeaders::X400Originator),
("X400-Received", EmailHeaders::X400Received),
("X400-Recipients", EmailHeaders::X400Recipients),
("X400-Trace", EmailHeaders::X400Trace),
]
.into_iter()
.map(|(k, v)| (k.to_string(), v))
.collect()
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, String> {
let s = from_utf8(bytes).map_err(|_| "Invalid header")?.trim().to_string();
let header_map = Self::get_header_hashmap();
header_map
.get(&s[..])
.cloned()
.ok_or_else(|| "Unknown header".to_string())
}
}