22
Internet Message Format RFC 822 - Standard for ARPA Internet Text Messages RFC 2822 - Internet Message Format 2014-03-14 김김김

Internet Message Protocol (rfc822, rfc 2822)

Embed Size (px)

Citation preview

Page 1: Internet Message Protocol (rfc822, rfc 2822)

Internet Message Format

RFC 822 - Standard for ARPA Internet Text MessagesRFC 2822 - Internet Message Format

2014-03-14

김주아

Page 2: Internet Message Protocol (rfc822, rfc 2822)

RFC 822 (1982)Standard for ARPA Internet Text Mes-sages• 유저들 사이에 보내지는

텍스트 메시지의 문법

RFC 2822 (2001)Internet Message Format• 전자 메일 메시지에서

사용되는 텍스트 문법

RFC 5322 (2008)Internet Message Format

History of Internet Message Format

Page 3: Internet Message Protocol (rfc822, rfc 2822)

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

; 코멘트

Page 4: Internet Message Protocol (rfc822, rfc 2822)

Mail Message

General Description메일 구조

메일의 전송 및 배달 과정에서 필요한 정보

Page 5: Internet Message Protocol (rfc822, rfc 2822)

Mail Message

General Description메일 구조

수신자에게 배달되어야 하는 메일 객체로 구성아스키 문자를 포함한 라인들로 구성

RFC 2822 는 content 의 형태와 의미에 대해 적용되고 , envelope 에 대한 표준을 포함하지 않는다 .

CRLF 로 구분

Page 6: Internet Message Protocol (rfc822, rfc 2822)

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 로 붙어서 나타나야 한다 .

Page 7: Internet Message Protocol (rfc822, rfc 2822)

LEXICAL ANALYSIS OF MESSAGES

Header Fields헤더 필드field-name 과 field-body 를 아스키 문자로 표현한 한 줄의 라인으로 구성

필드 이름 : 필드바디 CRLF

FROM Jua Kim<[email protected]>

Field Name• “:” 를 제외한 US-ASCII 문자

Field Body• CR, LF 를 제외한 US-ASCII 문자• atom, quoted-string, special tokens, text 등의 조합으로 구성된 아스키 문자열

:

Page 8: Internet Message Protocol (rfc822, rfc 2822)

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

Page 9: Internet Message Protocol (rfc822, rfc 2822)

"obs-" 로 시작하는 구식의 토큰들은 생성하지 말아야 하지만 해석할 때는 적합한 문법으로 취급되어야 함 .

NO-WS-CTL = %d1-8 / ; CR, LF, white space 문자를 제외한 US-ASCII 컨트롤 문자 %d11 / ; %d12 / ; %d14-31 / ; %d127

text = %d1-9 / ; CR, LF를 제외한 문자 %d11 / %d12 / %d14-127 / obs-textspecials = "(" / ")" / "<" / ">" / "[" / "]" / ":" / ";" / "@" / "\" / "," / "." / DQUOTE

Primitive Tokens( 기본 토큰 )

명칭 %d 아스키번호 • CR, LF, white space 문자를 제외한 US-ASCII 컨트롤 문자

• CR,LF 를 제외한 문자

• "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> / "." / "[" / "]"

Quoted characters( 인용문자 )quoted-pair = ("\" text) / obs-qp

• 특수 목적으로 사용되는 문자열을 “ \” 을 이용하여 문자 그대로 표현

Syntax Lexical Tokens

Page 10: Internet Message Protocol (rfc822, rfc 2822)

( 참고 ) 아스키 문자표

Syntax Lexical Tokens

Page 11: Internet Message Protocol (rfc822, rfc 2822)

Folding white space and comments( 폴딩 여백 및 설정 )

FWS = ([*WSP CRLF] 1*WSP) / ; Folding white space obs-FWSctext = NO-WS-CTL / ; Non white space controls,

%d33-39 / ; 나머지 ASCII 문자 중 (, ), \ 제외 %d42-91 / ; %d93-126 ; ccontent = ctext / quoted-pair / commentcomment = "(" *([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 될 수 있다 .

Page 12: Internet Message Protocol (rfc822, rfc 2822)

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 문자열 집합

Page 13: Internet Message Protocol (rfc822, rfc 2822)

Miscellaneous tokens ( 기타토큰 )

word = atom / quoted-stringphrase = 1*word / obs-phraseutext = NO-WS-CTL / ; Non white space controls

%d33-126 / ; 나머지 ASCII 문자 obs-utextunstructured = *([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-pairquoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS]

• qtext : 컨트롤 문자와 “ \” 을 제외한 나머지 ASCII 문자열• quoted-string : “ 로 감싸진 문자열 , atom 과 같이 하나의 단위로 취급된다 .

atom 에서 허용하지 않는 문자들을 포함하는 문자열은 quoted string 형태로 표현되고 , " 로 둘러싸여야 함 .

Page 14: Internet Message Protocol (rfc822, rfc 2822)

date-time = [ day-of-week "," ] date FWS time [CFWS]day-of-week = ([FWS] day-name) / obs-day-of-weekday-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"date = day month yearyear = 4*DIGIT / obs-yearmonth = (FWS month-name FWS) / obs-monthmonth-name = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"day = ([FWS] 1*2DIGIT) / obs-daytime = time-of-day FWS zonetime-of-day = hour ":" minute [ ":" second ]hour = 2DIGIT / obs-hourminute = 2DIGIT / obs-minutesecond = 2DIGIT / obs-secondzone = (( "+" / "-" ) 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 을 알파벳으로 표현하는 것을 허용

Page 15: Internet Message Protocol (rfc822, rfc 2822)

address = mailbox / groupmailbox = name-addr / addr-specname-addr = [display-name] angle-addrangle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addrgroup = display-name ":" [mailbox-list / CFWS] ";" [CFWS]display-name = phrasemailbox-list = (mailbox *("," mailbox)) / obs-mbox-listaddress-list = (address *("," address)) / obs-addr-list

Addr-spec specificationaddr-spec = local-part "@" domainlocal-part = dot-atom / quoted-string / obs-local-partdomain = dot-atom / domain-literal / obs-domaindomain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]dcontent = dtext / quoted-pairdtext = NO-WS-CTL / ; Non white space controls

%d33-90 / ; 나머지 ASCII 문자 중 [, ], \ 제외 %d94-126

Syntax Address Specification ( 주소 규격 )

• 메일박스는 두 개의 부분으로 구성됨• 메일 프로그램에서 부가적으로 보여줄 수 있는 수신자의 이름• <> 로 둘러싸인 addr-spec 주소예 ) Jua Kim <[email protected]>

• 여러 메일박스를 하나의 단위로 다루고 싶을 때 그룹을 생성하여 사용한다 .• 그룹이 보여질 이름 + ":" + , 로 구분되는 메일박스 리스트 + ";" 로 표현예 ) mail-list : Jua Kim <[email protected]>, [email protected] ;

• addr-spec 은 local-part + "@" + domain 의 형태• local-part 는 quoted-string 이거나 dot-atom 이다 (dot-atom 형태를 사용하는 것이 더 좋음 )• 주석과 FWS 를 @ 근처에서 사용하지 않는 것이 좋다 .• 두 가지 경우에서 해당 주소로 메시지가 전송되는 방법은 RFC2821 에서 다룬다 .

Page 16: Internet Message Protocol (rfc822, rfc 2822)

message = (fields / obs-fields) [CRLF body]body = *(*998text CRLF) *998text

SyntaxOverall 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)

Page 17: Internet Message Protocol (rfc822, rfc 2822)

Field Min number Max numbertrace 0 unlimitedresent-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 1from 1 1sender 0* 1reply-to 0 1to 0 1cc 0 1bcc 0 1message-id 0* 1in-reply-to 0* 1references 0* 1subject 0 1comments 0 unlimitedkeywords 0 unlimitedoptional-field 0 unlimited

Syntax Field definitions

Page 18: Internet Message Protocol (rfc822, rfc 2822)

The origination date fieldorig-date = "Date:" date-time CRLF

Originator fieldsfrom = "From:" mailbox-list CRLFsender = "Sender:" mailbox CRLFreply-to = "Reply-To:" address-list CRLF

Syntax Field definitions

• 메시지의 작성자가 메시지를 전송할 수 있는 최종 형태로 만든 시간

originator 필드는 메시지에 대한 회신을 보낼 때 필요한 정보를 제공• From : 메일의 작성자• Sender : 실제 전송 시에 메시지를 전송할 책임이 있는 우편함 주소• Reply-To : 메시지 회신 시에 작성자가 답장을 받아 볼 수 있는 우편함

Destination address fields

to = "To:" address-list CRLFcc = "Cc:" address-list CRLFbcc = "Bcc:" (address-list / [CFWS]) CRLF

• To : 일차적인 수신자• Cc : 참조로 받을 다른 수신자• Bcc : 메시지를 참조로 받지만 주소가 공개되지 않는 수신자

Page 19: Internet Message Protocol (rfc822, rfc 2822)

Identification fieldsmessage-id = "Message-ID:" msg-id CRLFin-reply-to = "In-Reply-To:" 1*msg-id CRLFreferences = "References:" 1*msg-id CRLFmsg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]id-left = dot-atom-text / no-fold-quote / obs-id-leftid-right = dot-atom-text / no-fold-literal / obs-id-rightno-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTEno-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 CRLFcomments = "Comments:" unstructured CRLFkeywords = "Keywords:" phrase *("," phrase) CRLF

Informational fields

세 필드는 부가적인 필드이고 메시지에 대한 사람이 읽을 수 있는 정보를 포함한다 .• Subject : 메시지의 제목을 나타내는 짧은 문자열을 포함한다 .

답장으로 사용되는 경우 "Re: " 와 원본 메시지의 Subject 필드 내용으로 구성

• Comments : 메시지의 바디에 대한 부가적인 설명을 포함• Keywords : 수신자에게 유용할 수 있는 단어나 어절의 리스트를 포함

Page 20: Internet Message Protocol (rfc822, rfc 2822)

Resent fieldsresent-date = "Resent-Date:" date-time CRLFresent-from = "Resent-From:" mailbox-list CRLFresent-sender = "Resent-Sender:" mailbox CRLFresent-to = "Resent-To:" address-list CRLFresent-cc = "Resent-Cc:" address-list CRLFresent-bcc = "Resent-Bcc:" (address-list / [CFWS]) CRLFresent-msg-id = "Resent-Message-ID:" msg-id CRLF

Syntax Field definitions

• Resent 필드는 사용자가 전송 시스템에 메일을 다시 가져올 때마다 추가• 새로운 Resent 필드는 앞부분에 삽입되고 , 새 필드가 추가될 때 다른 필드들은 바뀌지 않음• 각 필드들은 Resent- 가 없는 필드들과 같은 문법을 따름

• Resent 필드를 사용하는 목적 최초 송신자가 최후의 발신자에게 메시지를 직접 전송한 것처럼 나타나게 하기 위해서

Page 21: Internet Message Protocol (rfc822, rfc 2822)

Obsolete Syntax

구식 문법들은 생성되면 안 되지만 , 수신자는 구식 문법들을 받아들이고 파싱 할 수 있어야 한다 .

구식 문법과 현재 문법의 중요한 차이• 구조화된 헤더 필드 바디에서 FWS 를 포함한 공백 문자들과 주석들이 토큰 사이에서 자유롭게

삽입될 수 있다 .

• folding 시에 공백으로만 구성된 라인을 허용하지 않는다 .

• NUL(ASCII value 0) 문자는 과거에 허용되었지만 , 호환성 문제로 현재는 사용하지 않는다 .

• CR 과 LF 는 따로 나타날 수 있었지만 , 현재는 CRLF 로 붙어서 사용되어야 한다 .

Page 22: Internet Message Protocol (rfc822, rfc 2822)