SlideShare a Scribd company logo
1 of 22
Internet Message
Format
RFC 822 - Standard for ARPA Internet Text Messages
RFC 2822 - Internet Message Format
2014-03-14
김주아
RFC 822 (1982)
Standard for ARPA
Internet Text
Messages
• 유저들 사이에 보내지는
텍스트 메시지의 문법
RFC 2822 (2001)
Internet Message
Format
• 전자 메일 메시지에서 사
용되는 텍스트 문법
RFC 5322 (2008)
Internet Message For
mat
History of Internet Message Format
NOTATIONAL CONVENTIONS
표기 규정
RULE
Rule Naming
"<", ">"을 생략하고 이름만 표시
SPACE, TAB, CRLF, DIGIT, ALPHA 등은 대문자로 표시
RULE1 / RULE2 "foo / bar" = foo or bar
(RULE1 RULE2) "(elem (foo / bar) elem)" = "elem foo elem", "elem bar elem"
*RULE “<l>*<m>element” = 최소 l번, 최대 m번 표시 (기본값 l=0, m=∞)
[RULE] [foo bar] : foo bar가 없어도 되고 한번 있어도 됨. *1(foo bar)
NRULE <n>(element) = <n>*<n>(element)
#RULE <l>#<m>element
; 코멘트
Mail Message
General Description메일 구조
메일의 전송 및
배달 과정에서 필요한 정보
Mail Message
General Description메일 구조
수신자에게 배달되어야 하는 메일 객체로 구성
아스키 문자를 포함한 라인들로 구성
RFC 2822는 content의 형태와 의미에 대해 적용되고, envelope에 대한 표준을 포함하지 않는다.
CRLF로 구분
General description
메시지는 문자를 나열한 것이고, US-ASCII로 구성
메시지는 문자들의 라인으로 나뉘고, 라인은 CRLF의 두 문자의 연속으로 구분된다.
CR : carriage return, value 13
커서를 현재 행의 맨 좌측으로 옮기기
LF : line feed, value 10
커서의 현재 행의 다음 행으로 옮기기
Line Length Limits
각 라인은 CRLF를 제외하고 998문자보다 많으면 절대 안 되며, 78문자 이하인
것이 좋다.
LEXICAL ANALYSIS OF MESSAGES
바디 필드Body Fields
• 메시지의 바디는 US-ASCII 문자로 구성된 라인
• 998/78 제한
• CR, LF는 따로 나타나면 안 되고 CRLF로 붙어서 나타나야 한다.
LEXICAL ANALYSIS OF MESSAGES
Header Fields헤더 필드
field-name과 field-body를 아스키 문자로 표현한 한 줄의 라인으로 구성
필드 이름 : 필드바디 CRLF
FROM Jua Kim<jjuakim@daumcorp.com>
Field Name
• “:”를 제외한 US-ASCII 문자
Field Body
• CR, LF를 제외한 US-ASCII 문자
• atom, quoted-string, special tokens, text등의 조합으로 구성된 아스키 문자열
:
LEXICAL ANALYSIS OF MESSAGES
Header Fields
To: "Joe & J. Harvey" <ddd@Org>,
JJY@BBN
↓folding
To: "Joe & J. Harvey" <ddd@Org>,
헤더 필드
• Unstructured Header Field Bodies
folding, unfolding을 제외한 별다른 문법제한이 없는 필드 바디
구조화 되지 않은 단순 텍스트
• Structured Header Field Bodies
lexical symbol들의 집합이며, 엄격한 문법적 제한을 가지는 필드 바디
• Long Header Fields
편의상의 이유와 라인의 998/78 문자 제한 때문에 여러 줄로 나뉘어서
표현 할 수 있음
lexical symbol : individual special characters, quoted-strings, domain-literals, comments, atoms
"obs-"로 시작하는 구식의 토큰들은 생성하지 말아야 하지만 해석할 때는 적합한 문법으로 취급되어야 함.
NO-WS-CTL = %d1-8 / ; CR, LF, white space 문자를 제외한 US-ASCI
%d11 / ;
%d12 / ;
%d14-31 / ;
%d127
text = %d1-9 / ; CR, LF를 제외한 문자
%d11 /
%d12 /
%d14-127 /
obs-text
specials = "(" / ")" /
"<" / ">" /
"[" / "]" /
":" / ";" /
"@" / "" /
"," / "." /
DQUOTE
Primitive Tokens(기본 토큰)
명칭 %d아스키번호 • CR, LF, white space문자를 제외한 US-ASCII
컨트롤 문자
• CR,LF를 제외한 문자
• "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / ""
/ <"> / "." / "[" / "]"
Quoted characters(인용문자)
quoted-pair = ("" text) / obs-qp
• 특수 목적으로 사용되는 문자열을 “” 을 이용하여 문자 그대로 표현
Syntax Lexical Tokens
(참고) 아스키 문자표
Syntax Lexical Tokens
Folding white space and comments(폴딩 여백 및 설정)
FWS = ([*WSP CRLF] 1*WSP) / ; Folding white space
obs-FWS
ctext = NO-WS-CTL / ; Non white space controls,
%d33-39 / ; 나머지 ASCII 문자 중 (, ),  제외
%d42-91 / ;
%d93-126 ;
ccontent = ctext / quoted-pair / comment
comment = "(" *([FWS] ccontent) [FWS] ")"
CFWS = *([FWS] comment) (([FWS] comment) / FWS)
Syntax Lexical Tokens
• FWS : 폴딩에 사용되는 공백문자들.
• FWS가 나타나면 헤더 폴딩이 일어났을 수 있는 부분이라는 것을 의미하고, 문법적인 분석이
시작되기 전에 헤더 unfolding이 되어야 함
• ctext : NO-WS-CTL와 나머지 ASCII 문자 중 (, ), 제외
• CFWS : 주석 또는 FWS 가 삽입될 수 있는 곳을 위해 정의된 토큰
• CFWS가 나타나는 곳에서 folding된 헤더 필드는 WSP 외의 다른 문자를 반드시 포함해야 한다.
• comment : 주석
• 주석은 사람이 읽을 수 있는 정보를 제공하기 위해 구조화된 필드 바디에서 사용된다.
• 구조화된 필드 바디에 나오는 괄호로 둘러싸이고 quoted-string 안에 있지 않은 문자열 “(”은
주석으로 취급
• 주석은 중첩 가능하며 FWS를 포함할 수 있고, folding될 수 있다.
Atom(원자)
atext = ALPHA / DIGIT / ; 컨트롤 문자, 공백, special 문자를 제외한 문자
"!" / "#" /
"$" / "%" /
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
atom = [CFWS] 1*atext [CFWS]
dot-atom = [CFWS] dot-atom-text [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
Syntax Lexical Tokens
• atext : 컨트롤문자, 공백, special문자를 제외한 문자
• atom : atext로 구성되는 문자열
• dot-atom : “.”으로 연결된 atom문자열 집합
Miscellaneous tokens (기타토큰)
word = atom / quoted-string
phrase = 1*word / obs-phrase
utext = NO-WS-CTL / ; Non white space controls
%d33-126 / ; 나머지 ASCII 문자
obs-utext
unstructured = *([FWS] utext) [FWS]
Syntax Lexical Tokens
• word와 phrase : atom이나 quoted-string의 조합을 위해 정의되는 토큰
• unstructured : 비구조화된 헤더 필드나 구조화된 헤더 필드 모드에서 사용 가능
Quoted strings(인용 문자열)
qtext = NO-WS-CTL / ; Non white space controls
%d33 / ; 나머지 ASCII 문자 중  제외
%d35-91 /
%d93-126
qcontent = qtext / quoted-pair
quoted-string = [CFWS]
DQUOTE *([FWS] qcontent) [FWS] DQUOTE
[CFWS]
• qtext : 컨트롤 문자와 “”을 제외한 나머지 ASCII 문자열
• quoted-string : “로 감싸진 문자열, atom과 같이 하나의 단위로 취급된다.
atom에서 허용하지 않는 문자들을 포함하는 문자열은 quoted string 형태로 표현되고, "로 둘러싸여야 함.
date-time = [ day-of-week "," ] date FWS time [CFWS]
day-of-week = ([FWS] day-name) / obs-day-of-week
day-name = "Mon" / "Tue" / "Wed" / "Thu" /
"Fri" / "Sat" / "Sun"
date = day month year
year = 4*DIGIT / obs-year
month = (FWS month-name FWS) / obs-month
month-name = "Jan" / "Feb" / "Mar" / "Apr" /
"May" / "Jun" / "Jul" / "Aug" /
"Sep" / "Oct" / "Nov" / "Dec"
day = ([FWS] 1*2DIGIT) / obs-day
time = time-of-day FWS zone
time-of-day = hour ":" minute [ ":" second ]
hour = 2DIGIT / obs-hour
minute = 2DIGIT / obs-minute
second = 2DIGIT / obs-second
zone = (( "+" / "-" ) 4DIGIT) / obs-zone
Syntax Date and Time Specification
• day는 해당 월에서의 날짜를 숫자로 표현한 것
• year는 1900 이상의 숫자
• time-of-day는 시간, 분, 부가적으로 초를 포함
• date와 time-of-day는 로컬 시간으로 표현
• zone은 세계 표준시와의 차이
• day-of-the-week, day-of-month는 실제 가질 수 있는 값을 가져야 함
• time-of-day는 00:00:00에서 23:59:60 범위 내여야 함
• zone은 -9959에서 +9959 범위 내여야함
rfc 822와의 차이점
구식 문법은 2자리의 연도 표기를 허용하고, time zone을 알파벳으로 표현하는 것을 허용
address = mailbox / group
mailbox = name-addr / addr-spec
name-addr = [display-name] angle-addr
angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr
group = display-name ":" [mailbox-list / CFWS] ";"
[CFWS]
display-name = phrase
mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
address-list = (address *("," address)) / obs-addr-list
Addr-spec specification
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
domain = dot-atom / domain-literal / obs-domain
domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
dcontent = dtext / quoted-pair
dtext = NO-WS-CTL / ; Non white space controls
%d33-90 / ; 나머지 ASCII 문자 중 [, ],  제외
%d94-126
Syntax Address Specification (주소 규격)
• 메일박스는 두 개의 부분으로 구성됨
• 메일 프로그램에서 부가적으로 보여줄 수 있는 수신자의 이름
• <>로 둘러싸인 addr-spec 주소
예) Jua Kim <jjuakim@daumcorp.com>
• 여러 메일박스를 하나의 단위로 다루고 싶을 때 그룹을 생성하여 사용한다.
• 그룹이 보여질 이름 + ":" + ,로 구분되는 메일박스 리스트 + ";"로 표현
예) mail-list : Jua Kim <jjuakim@daumcorp.com>, abc@example.com ;
• addr-spec은 local-part + "@" + domain의 형태
• local-part는 quoted-string이거나 dot-atom이다(dot-atom 형태를 사용하는 것이 더 좋음)
• 주석과 FWS를 @ 근처에서 사용하지 않는 것이 좋다.
• 두 가지 경우에서 해당 주소로 메시지가 전송되는 방법은 RFC2821에서 다룬다.
message = (fields / obs-fields)
[CRLF body]
body = *(*998text CRLF) *998text
Syntax
Overall message syntax
• 메시지 : 헤더필드 + 메시지바디
메시지의 라인은 CRLF를 제외하고 최대 998문자여야 하고, CRLF를 제외하고 78자를 넘지 않는
것을 추천
Field definitions
필드 이름 + ":" + 필드 바디
• 헤더필드의 순서는 중요하지 않지만 trace 헤더 필드와 resent 헤더 필드는 재정렬되면 절대 안 됨
• 필수적인 헤더 필드는 origination date와 originator address이고, 나머지 헤더 필드는 부가적
fields = *(trace
*(resent-date /
resent-from /
resent-sender /
resent-to /
resent-cc /
resent-bcc /
resent-msg-id))
*(orig-date /
from /
sender /
reply-to /
to /
cc /
bcc /
message-id /
in-reply-to /
references /
subject /
comments /
keywords /
optional-field)
Field Min number Max number
trace 0 unlimited
resent-date 0* unlimited*
resent-from 0 unlimited*
resent-sender 0* unlimited*
resent-to 0 unlimited*
resent-cc 0 unlimited*
resent-bcc 0 unlimited*
resent-msg-id 0 unlimited*
orig-date 1 1
from 1 1
sender 0* 1
reply-to 0 1
to 0 1
cc 0 1
bcc 0 1
message-id 0* 1
in-reply-to 0* 1
references 0* 1
subject 0 1
comments 0 unlimited
keywords 0 unlimited
optional-field 0 unlimited
Syntax Field definitions
The origination date field
orig-date = "Date:" date-time CRLF
Originator fields
from = "From:" mailbox-list CRLF
sender = "Sender:" mailbox CRLF
reply-to = "Reply-To:" address-list CRLF
Syntax Field definitions
• 메시지의 작성자가 메시지를 전송할 수 있는 최종 형태로 만든 시간
originator 필드는 메시지에 대한 회신을 보낼 때 필요한 정보를 제공
• From : 메일의 작성자
• Sender : 실제 전송 시에 메시지를 전송할 책임이 있는 우편함 주소
• Reply-To : 메시지 회신 시에 작성자가 답장을 받아 볼 수 있는 우편함
Destination address fields
to = "To:" address-list CRLF
cc = "Cc:" address-list CRLF
bcc = "Bcc:" (address-list / [CFWS]) CRLF
• To : 일차적인 수신자
• Cc : 참조로 받을 다른 수신자
• Bcc : 메시지를 참조로 받지만 주소가 공개되지 않는 수신자
Identification fields
message-id = "Message-ID:" msg-id CRLF
in-reply-to = "In-Reply-To:" 1*msg-id CRLF
references = "References:" 1*msg-id CRLF
msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
id-left = dot-atom-text / no-fold-quote / obs-id-left
id-right = dot-atom-text / no-fold-literal / obs-id-right
no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE
no-fold-literal = "[" *(dtext / quoted-pair) "]"
Syntax Field definitions
In-Reply-To와 References 필드는 메시지에 대한 응답을 만들 때 사용
• Message-ID : 특정 메시지에 대한 특정 버전을 나타내는 고유한 값
@ 우측에 메시지 id가 생성된 도메인 이름이나 IP 주소를 넣고,
@ 좌측에 날짜나 시간 또는 시스템에서 유일한 id(예: process id)들의 조합을 넣는다.
• In-Reply-To : 해당 메시지가 답하는 메시지(부모 메시지)의 Message-ID 필드를 포함
• References : 부모의 Reference 필드와 부모의 Message-ID 필드를 포함
subject = "Subject:" unstructured CRLF
comments = "Comments:" unstructured CRLF
keywords = "Keywords:" phrase *("," phrase) CRLF
Informational fields
세 필드는 부가적인 필드이고 메시지에 대한 사람이 읽을 수 있는 정보를 포함한다.
• Subject : 메시지의 제목을 나타내는 짧은 문자열을 포함한다.
답장으로 사용되는 경우 "Re: "와 원본 메시지의 Subject 필드 내용으로 구성
• Comments : 메시지의 바디에 대한 부가적인 설명을 포함
• Keywords : 수신자에게 유용할 수 있는 단어나 어절의 리스트를 포함
Resent fields
resent-date = "Resent-Date:" date-time CRLF
resent-from = "Resent-From:" mailbox-list CRLF
resent-sender = "Resent-Sender:" mailbox CRLF
resent-to = "Resent-To:" address-list CRLF
resent-cc = "Resent-Cc:" address-list CRLF
resent-bcc = "Resent-Bcc:" (address-list / [CFWS]) CRLF
resent-msg-id = "Resent-Message-ID:" msg-id CRLF
Syntax Field definitions
• Resent 필드는 사용자가 전송 시스템에 메일을 다시 가져올 때마다 추가
• 새로운 Resent 필드는 앞부분에 삽입되고, 새 필드가 추가될 때 다른 필드들은 바뀌지 않음
• 각 필드들은 Resent-가 없는 필드들과 같은 문법을 따름
• Resent 필드를 사용하는 목적
최초 송신자가 최후의 발신자에게 메시지를 직접 전송한 것처럼 나타나게 하기 위해서
Obsolete Syntax
구식 문법들은 생성되면 안 되지만, 수신자는 구식 문법들을 받아들이고 파싱 할 수 있어야 한다.
구식 문법과 현재 문법의 중요한 차이
• 구조화된 헤더 필드 바디에서 FWS를 포함한 공백 문자들과 주석들이 토큰 사이에서 자유롭게
삽입될 수 있다.
• folding 시에 공백으로만 구성된 라인을 허용하지 않는다.
• NUL(ASCII value 0)문자는 과거에 허용되었지만, 호환성 문제로 현재는 사용하지 않는다.
• CR과 LF는 따로 나타날 수 있었지만, 현재는 CRLF로 붙어서 사용되어야 한다.
끝

More Related Content

Viewers also liked

Viewers also liked (10)

Email
EmailEmail
Email
 
Mime presentation
Mime presentationMime presentation
Mime presentation
 
Mime presentation
Mime presentationMime presentation
Mime presentation
 
Dns server
Dns serverDns server
Dns server
 
Mime
MimeMime
Mime
 
Domain Name Server
Domain Name ServerDomain Name Server
Domain Name Server
 
Simple Mail Transfer Protocol
Simple Mail Transfer ProtocolSimple Mail Transfer Protocol
Simple Mail Transfer Protocol
 
Smtp
SmtpSmtp
Smtp
 
Email - Electronic Mail
Email - Electronic MailEmail - Electronic Mail
Email - Electronic Mail
 
Dns ppt
Dns pptDns ppt
Dns ppt
 

Similar to Internet Message Protocol (rfc822, rfc 2822)

Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino영욱 김
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2Jinkyoung Kim
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장HolyTak
 
Java Class File Format
Java Class File FormatJava Class File Format
Java Class File FormatJongyoung Park
 
Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Choonghyun Yang
 

Similar to Internet Message Protocol (rfc822, rfc 2822) (8)

Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 
Java Class File Format
Java Class File FormatJava Class File Format
Java Class File Format
 
Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)
 
Javascript
JavascriptJavascript
Javascript
 

Internet Message Protocol (rfc822, rfc 2822)

  • 1. Internet Message Format RFC 822 - Standard for ARPA Internet Text Messages RFC 2822 - Internet Message Format 2014-03-14 김주아
  • 2. RFC 822 (1982) Standard for ARPA Internet Text Messages • 유저들 사이에 보내지는 텍스트 메시지의 문법 RFC 2822 (2001) Internet Message Format • 전자 메일 메시지에서 사 용되는 텍스트 문법 RFC 5322 (2008) Internet Message For mat History of Internet Message Format
  • 3. NOTATIONAL CONVENTIONS 표기 규정 RULE Rule Naming "<", ">"을 생략하고 이름만 표시 SPACE, TAB, CRLF, DIGIT, ALPHA 등은 대문자로 표시 RULE1 / RULE2 "foo / bar" = foo or bar (RULE1 RULE2) "(elem (foo / bar) elem)" = "elem foo elem", "elem bar elem" *RULE “<l>*<m>element” = 최소 l번, 최대 m번 표시 (기본값 l=0, m=∞) [RULE] [foo bar] : foo bar가 없어도 되고 한번 있어도 됨. *1(foo bar) NRULE <n>(element) = <n>*<n>(element) #RULE <l>#<m>element ; 코멘트
  • 4. Mail Message General Description메일 구조 메일의 전송 및 배달 과정에서 필요한 정보
  • 5. Mail Message General Description메일 구조 수신자에게 배달되어야 하는 메일 객체로 구성 아스키 문자를 포함한 라인들로 구성 RFC 2822는 content의 형태와 의미에 대해 적용되고, envelope에 대한 표준을 포함하지 않는다. CRLF로 구분
  • 6. General description 메시지는 문자를 나열한 것이고, US-ASCII로 구성 메시지는 문자들의 라인으로 나뉘고, 라인은 CRLF의 두 문자의 연속으로 구분된다. CR : carriage return, value 13 커서를 현재 행의 맨 좌측으로 옮기기 LF : line feed, value 10 커서의 현재 행의 다음 행으로 옮기기 Line Length Limits 각 라인은 CRLF를 제외하고 998문자보다 많으면 절대 안 되며, 78문자 이하인 것이 좋다. LEXICAL ANALYSIS OF MESSAGES 바디 필드Body Fields • 메시지의 바디는 US-ASCII 문자로 구성된 라인 • 998/78 제한 • CR, LF는 따로 나타나면 안 되고 CRLF로 붙어서 나타나야 한다.
  • 7. LEXICAL ANALYSIS OF MESSAGES Header Fields헤더 필드 field-name과 field-body를 아스키 문자로 표현한 한 줄의 라인으로 구성 필드 이름 : 필드바디 CRLF FROM Jua Kim<jjuakim@daumcorp.com> Field Name • “:”를 제외한 US-ASCII 문자 Field Body • CR, LF를 제외한 US-ASCII 문자 • atom, quoted-string, special tokens, text등의 조합으로 구성된 아스키 문자열 :
  • 8. LEXICAL ANALYSIS OF MESSAGES Header Fields To: "Joe & J. Harvey" <ddd@Org>, JJY@BBN ↓folding To: "Joe & J. Harvey" <ddd@Org>, 헤더 필드 • Unstructured Header Field Bodies folding, unfolding을 제외한 별다른 문법제한이 없는 필드 바디 구조화 되지 않은 단순 텍스트 • Structured Header Field Bodies lexical symbol들의 집합이며, 엄격한 문법적 제한을 가지는 필드 바디 • Long Header Fields 편의상의 이유와 라인의 998/78 문자 제한 때문에 여러 줄로 나뉘어서 표현 할 수 있음 lexical symbol : individual special characters, quoted-strings, domain-literals, comments, atoms
  • 9. "obs-"로 시작하는 구식의 토큰들은 생성하지 말아야 하지만 해석할 때는 적합한 문법으로 취급되어야 함. NO-WS-CTL = %d1-8 / ; CR, LF, white space 문자를 제외한 US-ASCI %d11 / ; %d12 / ; %d14-31 / ; %d127 text = %d1-9 / ; CR, LF를 제외한 문자 %d11 / %d12 / %d14-127 / obs-text specials = "(" / ")" / "<" / ">" / "[" / "]" / ":" / ";" / "@" / "" / "," / "." / DQUOTE Primitive Tokens(기본 토큰) 명칭 %d아스키번호 • CR, LF, white space문자를 제외한 US-ASCII 컨트롤 문자 • CR,LF를 제외한 문자 • "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "" / <"> / "." / "[" / "]" Quoted characters(인용문자) quoted-pair = ("" text) / obs-qp • 특수 목적으로 사용되는 문자열을 “” 을 이용하여 문자 그대로 표현 Syntax Lexical Tokens
  • 11. Folding white space and comments(폴딩 여백 및 설정) FWS = ([*WSP CRLF] 1*WSP) / ; Folding white space obs-FWS ctext = NO-WS-CTL / ; Non white space controls, %d33-39 / ; 나머지 ASCII 문자 중 (, ), 제외 %d42-91 / ; %d93-126 ; ccontent = ctext / quoted-pair / comment comment = "(" *([FWS] ccontent) [FWS] ")" CFWS = *([FWS] comment) (([FWS] comment) / FWS) Syntax Lexical Tokens • FWS : 폴딩에 사용되는 공백문자들. • FWS가 나타나면 헤더 폴딩이 일어났을 수 있는 부분이라는 것을 의미하고, 문법적인 분석이 시작되기 전에 헤더 unfolding이 되어야 함 • ctext : NO-WS-CTL와 나머지 ASCII 문자 중 (, ), 제외 • CFWS : 주석 또는 FWS 가 삽입될 수 있는 곳을 위해 정의된 토큰 • CFWS가 나타나는 곳에서 folding된 헤더 필드는 WSP 외의 다른 문자를 반드시 포함해야 한다. • comment : 주석 • 주석은 사람이 읽을 수 있는 정보를 제공하기 위해 구조화된 필드 바디에서 사용된다. • 구조화된 필드 바디에 나오는 괄호로 둘러싸이고 quoted-string 안에 있지 않은 문자열 “(”은 주석으로 취급 • 주석은 중첩 가능하며 FWS를 포함할 수 있고, folding될 수 있다.
  • 12. Atom(원자) atext = ALPHA / DIGIT / ; 컨트롤 문자, 공백, special 문자를 제외한 문자 "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" atom = [CFWS] 1*atext [CFWS] dot-atom = [CFWS] dot-atom-text [CFWS] dot-atom-text = 1*atext *("." 1*atext) Syntax Lexical Tokens • atext : 컨트롤문자, 공백, special문자를 제외한 문자 • atom : atext로 구성되는 문자열 • dot-atom : “.”으로 연결된 atom문자열 집합
  • 13. Miscellaneous tokens (기타토큰) word = atom / quoted-string phrase = 1*word / obs-phrase utext = NO-WS-CTL / ; Non white space controls %d33-126 / ; 나머지 ASCII 문자 obs-utext unstructured = *([FWS] utext) [FWS] Syntax Lexical Tokens • word와 phrase : atom이나 quoted-string의 조합을 위해 정의되는 토큰 • unstructured : 비구조화된 헤더 필드나 구조화된 헤더 필드 모드에서 사용 가능 Quoted strings(인용 문자열) qtext = NO-WS-CTL / ; Non white space controls %d33 / ; 나머지 ASCII 문자 중 제외 %d35-91 / %d93-126 qcontent = qtext / quoted-pair quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] • qtext : 컨트롤 문자와 “”을 제외한 나머지 ASCII 문자열 • quoted-string : “로 감싸진 문자열, atom과 같이 하나의 단위로 취급된다. atom에서 허용하지 않는 문자들을 포함하는 문자열은 quoted string 형태로 표현되고, "로 둘러싸여야 함.
  • 14. date-time = [ day-of-week "," ] date FWS time [CFWS] day-of-week = ([FWS] day-name) / obs-day-of-week day-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date = day month year year = 4*DIGIT / obs-year month = (FWS month-name FWS) / obs-month month-name = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" day = ([FWS] 1*2DIGIT) / obs-day time = time-of-day FWS zone time-of-day = hour ":" minute [ ":" second ] hour = 2DIGIT / obs-hour minute = 2DIGIT / obs-minute second = 2DIGIT / obs-second zone = (( "+" / "-" ) 4DIGIT) / obs-zone Syntax Date and Time Specification • day는 해당 월에서의 날짜를 숫자로 표현한 것 • year는 1900 이상의 숫자 • time-of-day는 시간, 분, 부가적으로 초를 포함 • date와 time-of-day는 로컬 시간으로 표현 • zone은 세계 표준시와의 차이 • day-of-the-week, day-of-month는 실제 가질 수 있는 값을 가져야 함 • time-of-day는 00:00:00에서 23:59:60 범위 내여야 함 • zone은 -9959에서 +9959 범위 내여야함 rfc 822와의 차이점 구식 문법은 2자리의 연도 표기를 허용하고, time zone을 알파벳으로 표현하는 것을 허용
  • 15. address = mailbox / group mailbox = name-addr / addr-spec name-addr = [display-name] angle-addr angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr group = display-name ":" [mailbox-list / CFWS] ";" [CFWS] display-name = phrase mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list address-list = (address *("," address)) / obs-addr-list Addr-spec specification addr-spec = local-part "@" domain local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS] dcontent = dtext / quoted-pair dtext = NO-WS-CTL / ; Non white space controls %d33-90 / ; 나머지 ASCII 문자 중 [, ], 제외 %d94-126 Syntax Address Specification (주소 규격) • 메일박스는 두 개의 부분으로 구성됨 • 메일 프로그램에서 부가적으로 보여줄 수 있는 수신자의 이름 • <>로 둘러싸인 addr-spec 주소 예) Jua Kim <jjuakim@daumcorp.com> • 여러 메일박스를 하나의 단위로 다루고 싶을 때 그룹을 생성하여 사용한다. • 그룹이 보여질 이름 + ":" + ,로 구분되는 메일박스 리스트 + ";"로 표현 예) mail-list : Jua Kim <jjuakim@daumcorp.com>, abc@example.com ; • addr-spec은 local-part + "@" + domain의 형태 • local-part는 quoted-string이거나 dot-atom이다(dot-atom 형태를 사용하는 것이 더 좋음) • 주석과 FWS를 @ 근처에서 사용하지 않는 것이 좋다. • 두 가지 경우에서 해당 주소로 메시지가 전송되는 방법은 RFC2821에서 다룬다.
  • 16. message = (fields / obs-fields) [CRLF body] body = *(*998text CRLF) *998text Syntax Overall message syntax • 메시지 : 헤더필드 + 메시지바디 메시지의 라인은 CRLF를 제외하고 최대 998문자여야 하고, CRLF를 제외하고 78자를 넘지 않는 것을 추천 Field definitions 필드 이름 + ":" + 필드 바디 • 헤더필드의 순서는 중요하지 않지만 trace 헤더 필드와 resent 헤더 필드는 재정렬되면 절대 안 됨 • 필수적인 헤더 필드는 origination date와 originator address이고, 나머지 헤더 필드는 부가적 fields = *(trace *(resent-date / resent-from / resent-sender / resent-to / resent-cc / resent-bcc / resent-msg-id)) *(orig-date / from / sender / reply-to / to / cc / bcc / message-id / in-reply-to / references / subject / comments / keywords / optional-field)
  • 17. Field Min number Max number trace 0 unlimited resent-date 0* unlimited* resent-from 0 unlimited* resent-sender 0* unlimited* resent-to 0 unlimited* resent-cc 0 unlimited* resent-bcc 0 unlimited* resent-msg-id 0 unlimited* orig-date 1 1 from 1 1 sender 0* 1 reply-to 0 1 to 0 1 cc 0 1 bcc 0 1 message-id 0* 1 in-reply-to 0* 1 references 0* 1 subject 0 1 comments 0 unlimited keywords 0 unlimited optional-field 0 unlimited Syntax Field definitions
  • 18. The origination date field orig-date = "Date:" date-time CRLF Originator fields from = "From:" mailbox-list CRLF sender = "Sender:" mailbox CRLF reply-to = "Reply-To:" address-list CRLF Syntax Field definitions • 메시지의 작성자가 메시지를 전송할 수 있는 최종 형태로 만든 시간 originator 필드는 메시지에 대한 회신을 보낼 때 필요한 정보를 제공 • From : 메일의 작성자 • Sender : 실제 전송 시에 메시지를 전송할 책임이 있는 우편함 주소 • Reply-To : 메시지 회신 시에 작성자가 답장을 받아 볼 수 있는 우편함 Destination address fields to = "To:" address-list CRLF cc = "Cc:" address-list CRLF bcc = "Bcc:" (address-list / [CFWS]) CRLF • To : 일차적인 수신자 • Cc : 참조로 받을 다른 수신자 • Bcc : 메시지를 참조로 받지만 주소가 공개되지 않는 수신자
  • 19. Identification fields message-id = "Message-ID:" msg-id CRLF in-reply-to = "In-Reply-To:" 1*msg-id CRLF references = "References:" 1*msg-id CRLF msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] id-left = dot-atom-text / no-fold-quote / obs-id-left id-right = dot-atom-text / no-fold-literal / obs-id-right no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE no-fold-literal = "[" *(dtext / quoted-pair) "]" Syntax Field definitions In-Reply-To와 References 필드는 메시지에 대한 응답을 만들 때 사용 • Message-ID : 특정 메시지에 대한 특정 버전을 나타내는 고유한 값 @ 우측에 메시지 id가 생성된 도메인 이름이나 IP 주소를 넣고, @ 좌측에 날짜나 시간 또는 시스템에서 유일한 id(예: process id)들의 조합을 넣는다. • In-Reply-To : 해당 메시지가 답하는 메시지(부모 메시지)의 Message-ID 필드를 포함 • References : 부모의 Reference 필드와 부모의 Message-ID 필드를 포함 subject = "Subject:" unstructured CRLF comments = "Comments:" unstructured CRLF keywords = "Keywords:" phrase *("," phrase) CRLF Informational fields 세 필드는 부가적인 필드이고 메시지에 대한 사람이 읽을 수 있는 정보를 포함한다. • Subject : 메시지의 제목을 나타내는 짧은 문자열을 포함한다. 답장으로 사용되는 경우 "Re: "와 원본 메시지의 Subject 필드 내용으로 구성 • Comments : 메시지의 바디에 대한 부가적인 설명을 포함 • Keywords : 수신자에게 유용할 수 있는 단어나 어절의 리스트를 포함
  • 20. Resent fields resent-date = "Resent-Date:" date-time CRLF resent-from = "Resent-From:" mailbox-list CRLF resent-sender = "Resent-Sender:" mailbox CRLF resent-to = "Resent-To:" address-list CRLF resent-cc = "Resent-Cc:" address-list CRLF resent-bcc = "Resent-Bcc:" (address-list / [CFWS]) CRLF resent-msg-id = "Resent-Message-ID:" msg-id CRLF Syntax Field definitions • Resent 필드는 사용자가 전송 시스템에 메일을 다시 가져올 때마다 추가 • 새로운 Resent 필드는 앞부분에 삽입되고, 새 필드가 추가될 때 다른 필드들은 바뀌지 않음 • 각 필드들은 Resent-가 없는 필드들과 같은 문법을 따름 • Resent 필드를 사용하는 목적 최초 송신자가 최후의 발신자에게 메시지를 직접 전송한 것처럼 나타나게 하기 위해서
  • 21. Obsolete Syntax 구식 문법들은 생성되면 안 되지만, 수신자는 구식 문법들을 받아들이고 파싱 할 수 있어야 한다. 구식 문법과 현재 문법의 중요한 차이 • 구조화된 헤더 필드 바디에서 FWS를 포함한 공백 문자들과 주석들이 토큰 사이에서 자유롭게 삽입될 수 있다. • folding 시에 공백으로만 구성된 라인을 허용하지 않는다. • NUL(ASCII value 0)문자는 과거에 허용되었지만, 호환성 문제로 현재는 사용하지 않는다. • CR과 LF는 따로 나타날 수 있었지만, 현재는 CRLF로 붙어서 사용되어야 한다.
  • 22.

Editor's Notes

  1. (RULE1 RULE2) 괄호 안에 포함된 요소들은 하나의 요소로 취급 NRULE element가 정확히 n번 나타나야 한다. #RULE 최소 l번, 최대 m번 표시되고 각각은 ","로 분리되어 있는 리스트를 말한다.
  2. 메시지는 헤더와 바디로 구성되고, 헤더는 이 표준에 정의된 문법을 따르는 라인들로 구성된다. 바디는 헤더와 한 줄의 빈 라인으로 구분된다. 998자 제한의 이유는 많은 구현이 메시지를 송신, 수신, 저장할 때 998자보다 많은 라인에 대해서 처리를 하지 못하기 때문이다. 78자 이하를 추천하는 이유는 많은 구현들에서 메시지를 디스플레이 할 때 78자가 넘으면 라인이 짤리거나 랩핑될 수 있기 때문에 그것을 수용하기 위함이다.
  3. folding : field-body를 여러 줄로 나누어서 표현한다. linear-white-space 뒤에 CRLF를 붙인다. unfolding : 여러 줄로 나누어진 field-body를 한 줄로 만든다. CRLF를 LWSP-char로 취급한다. 편의상의 이유와 라인의 998/78 문자 제한 때문에 헤더 필드의 필드 바디는 여러 줄로 나뉘어서 표현될 수 있고, 이것을 "folding"이라고 한다.
  4. folding : field-body를 여러 줄로 나누어서 표현한다. linear-white-space 뒤에 CRLF를 붙인다. unfolding : 여러 줄로 나누어진 field-body를 한 줄로 만든다. CRLF를 LWSP-char로 취급한다. 편의상의 이유와 라인의 998/78 문자 제한 때문에 헤더 필드의 필드 바디는 여러 줄로 나뉘어서 표현될 수 있고, 이것을 "folding"이라고 한다.
  5. 메시지가 여러 번 재전송되는 경우 각각의 Resent 필드 모음은 각 재전송 시간에 맞는 정보를 제공해야 한다. 메시지를 전송 시스템으로 다시 가져와서 Resent 필드를 추가하는 것은 Forwarding과 다르다. Forwarding에는 두 가지 의미가 있는데, 사용자가 메시지의 사본을 다른 사용자에게 전달 메일 전송 프로그램이 메시지를 받아서 최종 배달을 위해 다른 목적지로 전달 전달된 메시지는 최초 송신자로부터 온 것으로 표시되지 않기 때문에 Resent 필드를 사용하는 목적과 다르다