( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End );
Extended_Domain = Domain >Real_Domain_Start %Real_Domain_End | # Used to be a real domain
( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side
- ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" );
+ ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ) |
+ address_literal >Real_IP_Start %Real_IP_End; # Not RFC conforming, but many MTA try this
ccontent = ctext | FWS | '(' @{ fcall balanced_ccontent; };
balanced_ccontent := ccontent* ')' @{ fret; };
CFWS = ((FWS? comment)+ FWS?) | FWS;
From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End;
- By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End;
+ By_domain = "BY"i FWS Extended_Domain >By_Start %By_End;
Via = CFWS "VIA"i FWS Link;
With = CFWS "WITH"i FWS Protocol;
For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End;
Additional_Registered_Clauses = CFWS Atom FWS String;
Opt_info = Via? With? ID? For? Additional_Registered_Clauses?;
- Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?;
+ # Here we make From part optional just because many received headers lack it
+ Received = From_domain? CFWS? By_domain? CFWS? Opt_info CFWS? ";" FWS date_time >Date_Start %Date_End CFWS?;
prepush {
if (top >= st_storage.size) {