internet message protocol (rfc822, rfc 2822)

Post on 12-Aug-2015

91 Views

Category:

Internet

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Internet Message Format

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

2014-03-14

김주아

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

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

( 참고 ) 아스키 문자표

Syntax Lexical Tokens

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 될 수 있다 .

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-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 형태로 표현되고 , " 로 둘러싸여야 함 .

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 을 알파벳으로 표현하는 것을 허용

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

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)

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

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 : 메시지를 참조로 받지만 주소가 공개되지 않는 수신자

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 : 수신자에게 유용할 수 있는 단어나 어절의 리스트를 포함

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 필드를 사용하는 목적 최초 송신자가 최후의 발신자에게 메시지를 직접 전송한 것처럼 나타나게 하기 위해서

Obsolete Syntax

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

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

삽입될 수 있다 .

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

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

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

top related