aboutsummaryrefslogtreecommitdiffstats
path: root/src/ragel/smtp_address.rl
blob: eb0fc2d9d1a5501e8e195b06ad190cfd49b716d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
%%{
  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*;
}%%