%%{
  machine smtp_address;

  # SMTP address spec
  # Source: https://tools.ietf.org/html/rfc5321#section-4.1.2
  # Dependencies: smtp_base + smtp_ip
  # Required actions:
  #  - User_has_backslash
  #  - User_end
  #  - Quoted_addr
  #  - Domain_start
  #  - Domain_end
  #  - Addr_end
  #  - Addr_has_angle
  #  - Valid_addr
  #  - Empty_addr
  # + from deps:
  #  - IP4_start
  #  - IP4_end
  #  - IP6_start
  #  - IP6_end
  #  - Domain_addr_start
  #  - Domain_addr_end

  # SMTP address spec
  # Obtained from: https://tools.ietf.org/html/rfc5321#section-4.1.2
  # Additions from rfc6532 (smtputf8): https://tools.ietf.org/html/rfc6532#section-3.2

  QcontentSMTP   = qtextSMTP | quoted_pairSMTP %User_has_backslash;
  Quoted_string  = ( DQUOTE QcontentSMTP* >User_start %User_end DQUOTE ) %Quoted_addr;
  Local_part     = Dot_string >User_start %User_end | Quoted_string;
  Mailbox        = Local_part "@" (address_literal | Domain >Domain_start %Domain_end);
  UnangledPath = ( Adl ":" )? Mailbox >Addr_start %Addr_end "."?;
  AngledPath = "<" space* UnangledPath space* ">" %Addr_has_angle;
  Path = AngledPath | UnangledPath;
  SMTPAddr = space* (Path | "<>" %Empty_addr ) %Valid_addr space*;
}%%
