# `email.message.Message`: `compat32` API를 사용하여 이메일 메시지 표현하기

`Message` 클래스는 `EmailMessage` 클래스와 매우 유사지만, 이 클래스에 의해 추가된 메서드가 없고, 다른 특정 메서드의 기본 동작이 약간 다릅니다. 또한 `EmailMessage` 클래스에서 지원하지만, 레거시 코드를 다루지 않는 한 권장되지 않는 일부 메서드도 여기에서 설명합니다.

두 클래스의 철학과 구조는 그 외에는 같습니다.

이 문서는 기본 (`Message`의 경우) 정책 `Compat32`의 동작을 설명합니다. 다른 정책을 사용하려면, `EmailMessage` 클래스를 대신 사용해야 합니다.

An email message consists of headers and a payload. Headers must be RFC 5322 style names and values, where the field name and value are separated by a colon. The colon is not part of either the field name or the field value. The payload may be a simple text message, or a binary object, or a structured sequence of sub-messages each with their own set of headers and their own payload. The latter type of payload is indicated by the message having a MIME type such as multipart/* or message/rfc822.

`Message` 객체가 제공하는 개념 모델은 헤더의 순서 있는 딕셔너리이면서, 헤더의 특수 정보에 액세스하고, 페이 로드에 액세스하고, 메시지의 직렬화된 버전을 생성하고, 객체 트리를 재귀적으로 탐색하기 위한 추가 메서드가 제공되는 것입니다. 중복 헤더가 지원되지만, 특수한 메서드를 사용하여 액세스해야 함에 유의하십시오.

`Message` 의사 딕셔너리는 헤더 이름으로 인덱싱되며, ASCII 값이어야 합니다. 딕셔너리의 값은 ASCII 문자만 포함해야 하는 문자열입니다; 비 ASCII 입력에 대한 특수 처리가 있지만, 항상 올바른 결과를 생성하지는 않습니다. 헤더는 대소 문자를 유지하면서 저장되고 반환되지만, 필드 이름은 대소 문자를 구분하지 않고 일치합니다. Unix-From 헤더나 `From_` 헤더라고도 하는 단일 봉투 헤더가 있을 수도 있습니다. 페이 로드(payload)는 단순 메시지 객체의 경우는 문자열이나 바이트열이고, MIME 컨테이너 문서(예를 들어 multipart/*와 message/rfc822)의 경우는 `Message` 객체의 리스트입니다.

`Message` 클래스의 메서드는 다음과 같습니다:

class `email.message.``Message`(policy=compat32)

  policy가 지정되면 (`policy` 클래스의 인스턴스여야 합니다) 메시지 표현을 갱신하고 직렬화하기 위해 지정된 규칙을 사용합니다. policy가 설정되지 않으면, `compat32` 정책을 사용하는데, 파이썬 3.2 버전의 email 패키지와의 과거 호환성을 유지합니다. 자세한 내용은 `policy` 설명서를 참조하십시오.

  버전 3.3에서 변경: policy 키워드 인자가 추가되었습니다.

  `as_string`(unixfrom=False, maxheaderlen=0, policy=None)

    평활화된 전체 메시지를 문자열로 반환합니다. 선택적 unixfrom이 참이면, 봉투 헤더가 반환된 문자열에 포함됩니다. unixfrom의 기본값은 `False`입니다. 이전 버전과의 호환성을 위해, maxheaderlen의 기본값이 `0`이라서 다른 값을 원하면 명시적으로 재정의해야 합니다 (정책에서 max_line_length에 지정된 값은 이 메서드가 무시합니다). policy 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 policy가 `Generator`로 전달되므로, 메서드에서 생성된 일부 포매팅을 제어하는 데 사용할 수 있습니다.

    문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지 평활화는 `Message`에 대한 변경을 유발할 수 있습니다 (예를 들어, MIME 경계가 생성되거나 수정될 수 있습니다).

    Note that this method is provided as a convenience and may not always format the message the way you want. For example, by default it does not do the mangling of lines that begin with `From` that is required by the Unix mbox format. For more flexibility, instantiate a `Generator` instance and use its `flatten()` method directly. For example:

        from io import StringIO
        from email.generator import Generator
        fp = StringIO()
        g = Generator(fp, mangle_from_=True, maxheaderlen=60)
        g.flatten(msg)
        text = fp.getvalue()

    메시지 객체가 RFC 표준에 따라 인코딩되지 않은 바이너리 데이터를 포함하면, 비 호환 데이터는 유니코드 “unknown character” 코드 포인트로 대체됩니다. (`as_bytes()`와 `BytesGenerator`도 참조하십시오.)

    버전 3.4에서 변경: policy 키워드 인자가 추가되었습니다.

  `__str__`()

    `as_string()`과 동등합니다. `str(msg)`가 포맷된 메시지를 포함하는 문자열을 생성할 수 있도록 합니다.

  `as_bytes`(unixfrom=False, policy=None)

    평활화된 전체 메시지를 바이트열 객체로 반환합니다. 선택적 unixfrom이 참이면, 봉투 헤더가 반환된 문자열에 포함됩니다. unixfrom의 기본값은 `False`입니다. policy 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 policy가 `BytesGenerator`로 전달되므로, 메서드에서 생성된 일부 포매팅을 제어하는 데 사용할 수 있습니다.

    문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지 평활화는 `Message`에 대한 변경을 유발할 수 있습니다 (예를 들어, MIME 경계가 생성되거나 수정될 수 있습니다).

    Note that this method is provided as a convenience and may not always format the message the way you want. For example, by default it does not do the mangling of lines that begin with `From` that is required by the Unix mbox format. For more flexibility, instantiate a `BytesGenerator` instance and use its `flatten()` method directly. For example:

        from io import BytesIO
        from email.generator import BytesGenerator
        fp = BytesIO()
        g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
        g.flatten(msg)
        text = fp.getvalue()

    버전 3.4에 추가.

  `__bytes__`()

    `as_bytes()`와 동등합니다. `bytes(msg)`가 포맷된 메시지를 포함하는 바이트열 객체를 생성할 수 있도록 합니다.

    버전 3.4에 추가.

  `is_multipart`()

    메시지의 페이 로드가 서브-`Message` 객체의 리스트이면 `True`를, 그렇지 않으면 `False`를 반환합니다. `is_multipart()`가 `False`를 반환할 때, 페이 로드는 문자열 객체(CTE로 인코딩된 바이너리 페이 로드일 수 있습니다)여야 합니다. (`True`를 반환하는 `is_multipart()`가 반드시 “msg.get_content_maintype() == ‘multipart’” 가 `True`를 반환한다는 것을 의미하지는 않습니다. 예를 들어, `Message`가 `message/rfc822` 유형일 때, `is_multipart`는 `True`를 반환합니다.

  `set_unixfrom`(unixfrom)

    메시지의 봉투 헤더를 (문자열이어야 하는) unixfrom으로 설정합니다.

  `get_unixfrom`()

    메시지의 봉투 헤더를 반환합니다. 봉투 헤더가 설정되지 않았으면 기본값은 `None`입니다.

  `attach`(payload)

    지정된 payload를 현재 페이 로드에 추가합니다. 호출 전에는 페이 로드가 `None`이나 `Message` 객체의 리스트여야 합니다. 호출 후에는 페이 로드가 항상 `Message` 객체의 리스트입니다. 페이 로드를 스칼라 객체(예를 들어 문자열)로 설정하려면, `set_payload()`를 대신 사용하십시오.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서 해당 기능은 `set_content()`와 관련 `make`와 `add` 메서드로 대체됩니다.

  `get_payload`(i=None, decode=False)

    현재 페이 로드를 반환합니다. `is_multipart()`가 `True`이면 `Message` 객체의 리스트이고, `is_multipart()`가 `False`이면 문자열입니다. 페이 로드가 리스트이고 리스트 객체를 변경하면, 메시지의 페이 로드를 제자리에서 수정하는 것입니다.

    선택적 인자 i를 사용하면, `get_payload()`는 `is_multipart()`가 `True`일 때, 페이 로드의 i 번째 요소를 0부터 세어 반환합니다. i가 0보다 작거나 페이 로드의 항목 수보다 크거나 같으면 `IndexError`가 발생합니다. 페이 로드가 문자열이고 (즉 `is_multipart()`가 `False`) i가 제공되면, `TypeError`가 발생합니다.

    선택적 decode는 Content-Transfer-Encoding 헤더에 따라 페이 로드를 디코딩해야 하는지를 나타내는 플래그입니다. `True`이고 메시지가 멀티 파트가 아닐 때, 이 헤더 값이 `quoted-printable`이나 `base64`이면 페이 로드가 디코딩됩니다. 다른 인코딩이 사용되거나 Content-Transfer-Encoding 헤더가 누락되면, 페이 로드는 그대로 (디코딩되지 않고) 반환됩니다. 모든 경우에 반환된 값은 바이너리 데이터입니다. 메시지가 멀티 파트이고 decode 플래그가 `True`이면, `None`이 반환됩니다. 페이 로드가 base64이고 완벽하게 구성되지 않았으면 (패딩 누락, base64 알파벳 이외의 문자), 메시지의 결함 프로퍼티에 적절한 결함이 추가됩니다 (각각 `InvalidBase64PaddingDefect`나 `InvalidBase64CharactersDefect`).

    decode가 `False`(기본값)일 때 본문은 Content-Transfer-Encoding을 디코딩하지 않고 문자열로 반환됩니다. 그러나, Content-Transfer-Encoding이 8비트인 경우, `replace` 에러 처리기로, Content-Type 헤더에 지정된 `charset`을 사용하여 원래 바이트를 디코딩하려고 시도합니다. `charset`이 지정되지 않았거나 email 패키지가 `charset`을 인식하지 못하면, 본문은 기본 ASCII 문자 집합을 사용하여 디코딩됩니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서는 해당 기능이 `get_content()`와 `iter_parts()`로 대체되었습니다.

  `set_payload`(payload, charset=None)

    전체 메시지 객체의 페이 로드를 payload로 설정합니다. 페이 로드 불변량(invariants)을 보장하는 것은 고객의 책임입니다. 선택적 charset은 메시지의 기본 문자 집합을 설정합니다; 자세한 내용은 `set_charset()`을 참조하십시오.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서는 해당 기능이 `set_content()`로 대체되었습니다.

  `set_charset`(charset)

    페이 로드의 문자 집합을 charset으로 설정합니다. 이는 `Charset` 인스턴스 (`email.charset`을 참조하십시오), 문자 집합의 이름을 지정하는 문자열 또는 `None`일 수 있습니다. 문자열이면, `Charset` 인스턴스로 변환됩니다. charset이 `None`이면, `charset` 매개 변수가 Content-Type 헤더에서 제거됩니다 (그렇지 않으면 메시지가 수정되지 않습니다). 그 외의 경우는 `TypeError`를 생성합니다.

    기존 MIME-Version 헤더가 없으면 추가됩니다. 기존 Content-Type 헤더가 없으면, text/plain 값으로 추가됩니다. Content-Type 헤더가 존재하는지와 관계없이, `charset` 매개 변수는 charset.output_charset으로 설정됩니다. charset.input_charset과 charset.output_charset이 다르면, 페이 로드가 output_charset으로 다시 인코딩됩니다. 기존 Content-Transfer-Encoding 헤더가 없으면, 필요하면 지정된 `Charset`을 사용하여 페이 로드가 전송 인코딩되고(transfer-encoded), 적절한 값을 가진 헤더가 추가됩니다. Content-Transfer-Encoding 헤더가 이미 존재하면, 페이 로드는 해당 Content-Transfer-Encoding을 사용하여 이미 올바르게 인코딩된 것으로 가정하며 수정하지 않습니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서 해당 기능은 `email.emailmessage.EmailMessage.set_content()` 메서드의 charset 매개 변수로 대체됩니다.

  `get_charset`()

    메시지 페이 로드와 연관된 `Charset` 인스턴스를 반환합니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서는 항상 `None`을 반환합니다.

  다음 메서드는 메시지의 RFC 2822 헤더에 액세스하기 위한 매핑과 유사한 인터페이스를 구현합니다. 이 메서드들과 일반적인 매핑 (즉, 딕셔너리) 인터페이스 사이에는 의미상 차이가 있습니다. 예를 들어, 딕셔너리에는 중복 키가 없지만, 여기에는 중복 메시지 헤더가 있을 수 있습니다. 또한, 딕셔너리에서는 `keys()`가 반환하는 키의 순서가 보장되지 않지만, `Message` 객체에서는 헤더가 항상 원래 메시지에 나타나거나 나중에 메시지에 추가된 순서대로 반환됩니다. 삭제한 후 다시 추가된 헤더는 항상 헤더 리스트의 끝에 추가됩니다.

  이러한 의미상 차이는 의도적이며 최대한의 편의를 위해 편향되어 있습니다.

  모든 경우에, 메시지에 존재하는 봉투 헤더는 매핑 인터페이스에 포함되지 않습니다.

  In a model generated from bytes, any header values that (in contravention of the RFCs) contain non-ASCII bytes will, when retrieved through this interface, be represented as `Header` objects with a charset of `unknown-8bit`.

  `__len__`()

    중복을 포함하여, 총 헤더 수를 반환합니다.

  `__contains__`(name)

    메시지 객체에 name이라는 이름의 필드가 있으면 `True`를 반환합니다. 대소 문자를 구분하지 않고 일치하며 name은 후행 콜론을 포함하지 않아야 합니다. `in` 연산자에 사용됩니다, 예를 들어:

        if 'message-id' in myMessage:
           print('Message-ID:', myMessage['message-id'])

  `__getitem__`(name)

    명명된 헤더 필드의 값을 반환합니다. name은 콜론 필드 구분자를 포함하지 않아야 합니다. 헤더가 없으면, `None`이 반환됩니다; `KeyError`는 절대 발생하지 않습니다.

    이름이 지정된 필드가 메시지 헤더에 두 번 이상 나타나면, 해당 필드 값 중 정확히 어떤 필드 값이 반환되는지 정의되지 않습니다. 기존의 모든 명명된 헤더의 값을 가져오려면 `get_all()` 메서드를 사용하십시오.

  `__setitem__`(name, val)

    메시지에 필드 이름이 name이고 값이 val인 헤더를 추가합니다. 필드는 메시지의 기존 필드 끝에 추가됩니다.

    이것이 같은 이름을 가진 기존 헤더를 덮어쓰거나 삭제하지 않음에 유의하십시오. 새 헤더가 메시지에 필드 이름이 name인 유일한 헤더가 되도록 하려면, 먼저 필드를 삭제하십시오. 예를 들어:

        del msg['subject']
        msg['subject'] = 'Python roolz!'

  `__delitem__`(name)

    메시지 헤더에서 이름이 name인 모든 필드를 삭제합니다. 명명된 필드가 헤더에 없어도 예외가 발생하지 않습니다.

  `keys`()

    메시지 헤더의 모든 필드 이름의 리스트를 반환합니다.

  `values`()

    메시지의 모든 필드 값의 리스트를 반환합니다.

  `items`()

    메시지의 모든 필드 헤더와 값을 포함하는 2-튜플의 리스트를 반환합니다.

  `get`(name, failobj=None)

    명명된 헤더 필드의 값을 반환합니다. 명명된 헤더가 없으면 선택적 failobj가 반환된다는 점을 제외하고는 `__getitem__()`과 동일합니다 (기본값은 `None`입니다).

  몇 가지 유용한 추가 메서드가 있습니다:

  `get_all`(name, failobj=None)

    name이라는 필드의 모든 값 리스트를 반환합니다. 메시지에 이런 이름의 헤더가 없으면, failobj가 반환됩니다 (기본값은 `None`입니다).

  `add_header`(_name, _value, **_params)

    확장된 헤더 설정. 이 메서드는 추가 헤더 매개 변수가 키워드 인자로 제공될 수 있다는 점을 제외하고는 `__setitem__()`과 유사합니다. _name은 추가할 헤더 필드이고 _value는 헤더의 기본(primary)값입니다.

    키워드 인자 딕셔너리 _params의 각 항목에 대해, 키는 매개 변수 이름으로 사용되며, 밑줄은 대시로 변환됩니다 (대시는 파이썬 식별자로 유효하지 않기 때문입니다). 일반적으로, 값이 `None`이 아니면 매개 변수가 `key="value"`로 추가되며, `None`이면 키만 추가됩니다. 값에 ASCII가 아닌 문자가 포함되면, `(CHARSET, LANGUAGE, VALUE)` 형식으로 3-튜플로 지정할 수 있습니다. 여기서 `CHARSET`은 값을 인코딩하는 데 사용할 문자 집합의 이름을 지정하는 문자열이고, `LANGUAGE`는 일반적으로 `None`이나 빈 문자열(다른 가능성에 대해서는 RFC 2231을 참조하십시오)로 설정될 수 있고, `VALUE`는 비 ASCII 코드 포인트를 포함하는 문자열 값입니다. 3-튜플이 전달되지 않고 값에 ASCII가 아닌 문자가 포함되면, `CHARSET`으로 `utf-8`을 `LANGUAGE`로 `None`을 사용하여 RFC 2231 형식으로 자동 인코딩됩니다.

    예를 들면 다음과 같습니다:

        msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

    이것은 다음과 같은 헤더를 추가합니다

        Content-Disposition: attachment; filename="bud.gif"

    비 ASCII 문자의 예:

        msg.add_header('Content-Disposition', 'attachment',
                       filename=('iso-8859-1', '', 'Fußballer.ppt'))

    이것은 다음을 생성합니다

        Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"

  `replace_header`(_name, _value)

    헤더를 교체합니다. 헤더 순서와 필드 이름 대소 문자를 유지하면서, 메시지에서 _name과 일치하는 첫 번째로 발견된 헤더를 교체합니다. 일치하는 헤더가 없으면, `KeyError`가 발생합니다.

  `get_content_type`()

    메시지의 콘텐츠 유형을 반환합니다. 반환된 문자열은 maintype/subtype 형식의 소문자로 강제 변환됩니다. 메시지에 Content-Type 헤더가 없으면 `get_default_type()`에서 제공하는 기본 유형이 반환됩니다. RFC 2045에 따르면, 메시지는 항상 기본 유형을 가지므로, `get_content_type()`은 항상 값을 반환합니다.

    RFC 2045는 메시지가 multipart/digest 컨테이너 안에 등장(이 경우 기본 유형은 message/rfc822가 됩니다)하지 않는 한 기본 유형을 text/plain으로 정의합니다. Content-Type 헤더에 유효하지 않은 유형 명세가 있으면, RFC 2045는 기본 유형이 text/plain으로 지정합니다.

  `get_content_maintype`()

    메시지의 주 콘텐츠 유형을 반환합니다. 이것은 `get_content_type()`이 반환하는 문자열의 maintype 부분입니다.

  `get_content_subtype`()

    메시지의 부 콘텐츠 유형을 반환합니다. 이것은 `get_content_type()`이 반환하는 문자열의 subtype 부분입니다.

  `get_default_type`()

    기본 콘텐츠 유형을 반환합니다. multipart/digest 컨테이너의 서브 파트인 메시지를 제외하고, 대부분의 메시지는 기본 콘텐츠 유형이 text/plain입니다. 이러한 서브 파트는 기본 콘텐츠 유형이 message/rfc822입니다.

  `set_default_type`(ctype)

    기본 콘텐츠 유형을 설정합니다. ctype은 text/plain이나 message/rfc822여야 하지만 강제하지는 않습니다. 기본 콘텐츠 유형은 Content-Type 헤더에 저장되지 않습니다.

  `get_params`(failobj=None, header='content-type', unquote=True)

    메시지의 Content-Type 매개 변수를 리스트로 반환합니다. 반환된 리스트의 요소는 `'='` 부호로 분할된 키/값 쌍의 2-튜플입니다. `'='`의 왼쪽은 키이고 오른쪽은 값입니다. 매개 변수에 `'='` 부호가 없으면 값은 빈 문자열이고, 그렇지 않으면 값은 `get_param()`에 설명된대로이며 선택적 unquote가 `True`(기본값)이면 인용되지 않습니다.

    선택적 failobj는 Content-Type 헤더가 없을 때 반환할 객체입니다. 선택적 header는 Content-Type 대신 검색할 헤더입니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서 해당 기능은 헤더 액세스 메서드가 반환한 개별 헤더 객체의 params 프로퍼티로 대체됩니다.

  `get_param`(param, failobj=None, header='content-type', unquote=True)

    Content-Type 헤더의 매개 변수 param의 값을 문자열로 반환합니다. 메시지에 Content-Type 헤더가 없거나 그러한 매개 변수가 없으면, failobj가 반환됩니다 (기본값은 `None`입니다).

    선택적 header가 제공되면, Content-Type 대신 사용할 메시지 헤더를 지정합니다.

    매개 변수 키는 항상 대소 문자를 구분하지 않고 비교됩니다. 반환 값은 문자열이거나, 매개 변수가 RFC 2231로 인코딩되었으면 3-튜플일 수 있습니다. 3-튜플일 때, 값의 요소는 `(CHARSET, LANGUAGE, VALUE)` 형식입니다. `CHARSET`과 `LANGUAGE`는 모두 `None`일 수 있으며, 이 경우 `VALUE`가 `us-ascii` 문자 집합으로 인코딩된 것으로 간주해야 함에 유의하십시오. 일반적으로 `LANGUAGE`를 무시할 수 있습니다.

    응용 프로그램이 RFC 2231로 매개 변수가 인코딩되었는지를 신경 쓰지 않으면, `email.utils.collapse_rfc2231_value()`를 호출하면서 `get_param()`의 반환 값을 전달하여 매개 변숫값을 축소할 수 있습니다. 이것은 값이 튜플이면 적절하게 디코딩된 유니코드 문자열을 반환하고, 그렇지 않으면 원래 문자열을 인용 없이 반환합니다. 예를 들면:

        rawparam = msg.get_param('foo')
        param = email.utils.collapse_rfc2231_value(rawparam)

    모든 경우에, unquote가 `False`로 설정되어 있지 않으면, 매개 변숫값(반환된 문자열이나 3-튜플의 `VALUE` 항목)은 항상 인용되지 않습니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서 해당 기능은 헤더 액세스 메서드가 반환한 개별 헤더 객체의 params 프로퍼티로 대체됩니다.

  `set_param`(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)

    Content-Type 헤더에서 매개 변수를 설정합니다. 매개 변수가 이미 헤더에 존재하면, 해당 값은 value로 대체됩니다. 이 메시지에 대해 Content-Type 헤더가 아직 정의되지 않았으면, text/plain으로 설정되고 RFC 2045에 따라 새 매개 변숫값이 추가됩니다.

    선택적 header는 Content-Type의 대체 헤더를 지정하며, 선택적 requote가 `False`(기본값은 `True`)가 아닌 한 모든 매개 변수가 필요에 따라 인용됩니다.

    선택적 charset이 지정되면, 매개 변수는 RFC 2231에 따라 인코딩됩니다. 선택적 language는 RFC 2231 언어를 지정하며, 기본값은 빈 문자열입니다. charset과 language는 모두 문자열이어야 합니다.

    replace가 `False`(기본값)이면 헤더가 헤더 리스트의 끝으로 이동합니다. replace가 `True`이면, 헤더는 제자리에서 갱신됩니다.

    버전 3.4에서 변경: `replace` 키워드가 추가되었습니다.

  `del_param`(param, header='content-type', requote=True)

    Content-Type 헤더에서 지정된 매개 변수를 완전히 제거합니다. 매개 변수나 그 값 없이 헤더가 다시 작성됩니다. requote가 `False`(기본값은 `True`)가 아닌 한 모든 값이 필요에 따라 인용됩니다. 선택적 header는 Content-Type의 대체 헤더를 지정합니다.

  `set_type`(type, header='Content-Type', requote=True)

    Content-Type 헤더의 주 유형과 부 유형을 설정합니다. type은 maintype/subtype 형식의 문자열이어야 합니다, 그렇지 않으면 `ValueError`가 발생합니다.

    이 메서드는 모든 매개 변수를 그대로 유지하면서 Content-Type 헤더를 대체합니다. requote가 `False`이면, 기존 헤더의 인용을 그대로 두고, 그렇지 않으면 매개 변수가 인용됩니다 (기본값).

    header 인자에 대체 헤더를 지정할 수 있습니다. Content-Type 헤더가 설정될 때 MIME-Version 헤더도 추가됩니다.

    이것은 레거시 메서드입니다. `EmailMessage` 클래스에서 해당 기능은 `make_`와 `add_` 메서드로 대체됩니다.

  `get_filename`(failobj=None)

    메시지의 Content-Disposition 헤더의 `filename` 매개 변숫값을 반환합니다. 헤더에 `filename` 매개 변수가 없으면, 이 메서드는 Content-Type 헤더에서 `name` 매개 변수를 찾는 것으로 폴 백합니다. 둘 다 없거나, 헤더가 없으면, failobj가 반환됩니다. 반환된 문자열은 항상 `email.utils.unquote()`로 인용 해제됩니다.

  `get_boundary`(failobj=None)

    메시지의 Content-Type 헤더의 `boundary` 매개 변숫값이나, 헤더가 없거나 `boundary` 매개 변수가 없으면 failobj를 반환합니다. 반환된 문자열은 항상 `email.utils.unquote()`로 인용 해제됩니다.

  `set_boundary`(boundary)

    Content-Type 헤더의 `boundary` 매개 변수를 boundary로 설정합니다. 필요하면 `set_boundary()`는 항상 boundary를 인용합니다. 메시지 객체에 Content-Type 헤더가 없으면 `HeaderParseError` 가 발생합니다.

    `set_boundary()`는 헤더 리스트에서 Content-Type 헤더의 순서를 유지하므로, 이 메서드를 사용하는 것은 이전 Content-Type 헤더를 삭제하고 `add_header()`를 통해 새 경계를 가진 새 헤더를 추가하는 것과 미묘하게 다름에 유의하십시오. 그러나 원래 Content-Type 헤더에 있을 수 있는 이어지는 줄(continuation lines)을 유지하지 않습니다.

  `get_content_charset`(failobj=None)

    Content-Type 헤더의 `charset` 매개 변수를 소문자로 강제 변환하여 반환합니다. Content-Type 헤더가 없거나, 해당 헤더에 `charset` 매개 변수가 없으면 failobj가 반환됩니다.

    이 메서드는 메시지 본문의 기본 인코딩에 대한 `Charset` 인스턴스를 반환하는 `get_charset()`과 다름에 유의하십시오.

  `get_charsets`(failobj=None)

    메시지 내의 문자 집합 이름을 포함하는 리스트를 반환합니다. 메시지가 multipart이면, 리스트에 페이 로드의 각 서브 파트마다 하나의 요소가 포함되며, 그렇지 않으면 길이 1인 리스트가 됩니다.

    리스트의 각 항목은 표현된 서브 파트에 대한 Content-Type 헤더의 `charset` 매개 변숫값인 문자열입니다. 그러나, 서브 파트에 Content-Type 헤더가 없거나, `charset` 매개 변수가 없거나, text 주 MIME 유형이 아니면, 반환된 목록의 해당 항목은 failobj가 됩니다.

  `get_content_disposition`()

    있다면 메시지의 Content-Disposition 헤더의 (매개 변수가 없는) 소문자 값을, 그렇지 않으면 `None`을 반환합니다. 메시지가 RFC 2183을 따른다면 이 메서드의 가능한 값은 inline, attachment 또는 `None`입니다.

    버전 3.5에 추가.

  `walk`()

    `walk()` 메서드는 메시지 객체 트리의 모든 파트와 서브 파트를 깊이 우선 탐색 순서로 이터레이트 하는 데 사용할 수 있는 범용 제너레이터입니다. 일반적으로 `walk()`를 `for` 루프에서 이터레이터로 사용합니다; 각 이터레이션은 다음 서브 파트를 반환합니다.

    다음은 멀티 파트 메시지 구조의 모든 파트에 대한 MIME 유형을 인쇄하는 예입니다:

        >>> for part in msg.walk():
        ...     print(part.get_content_type())
        multipart/report
        text/plain
        message/delivery-status
        text/plain
        text/plain
        message/rfc822
        text/plain

    `msg.get_content_maintype() == 'multipart'`가 `False`를 반환하더라도, `walk`는 `is_multipart()`가 `True`를 반환하는 모든 파트의 서브 파트를 이터레이트 합니다. `_structure` 디버그 도우미 함수를 사용하여 예제에서 이를 확인할 수 있습니다:

        >>> for part in msg.walk():
        ...     print(part.get_content_maintype() == 'multipart',
        ...           part.is_multipart())
        True True
        False False
        False True
        False False
        False False
        False True
        False False
        >>> _structure(msg)
        multipart/report
            text/plain
            message/delivery-status
                text/plain
                text/plain
            message/rfc822
                text/plain

    여기서 `message` 파트는 `multiparts`가 아니지만, 서브 파트를 포함합니다. `is_multipart()`는 `True`를 반환하고 `walk`는 서브 파트로 내려갑니다.

  `Message` 객체는 MIME 메시지의 단순 텍스트를 생성할 때 사용할 수 있는 두 개의 인스턴스 어트리뷰트를 선택적으로 포함할 수 있습니다.

  `preamble`

    MIME 문서의 형식은 헤더 다음의 빈 줄과 첫 번째 멀티 파트 경계 문자열 사이에 일부 텍스트를 허용합니다. 일반적으로, 이 텍스트는 표준 MIME 장비를 벗어나기 때문에 MIME 인식 메일 리더에서 볼 수 없습니다. 그러나, 메시지의 원시 텍스트를 보거나, MIME을 인식하지 않는 리더에서 메시지를 볼 때, 이 텍스트가 보일 수 있습니다.

    preamble 어트리뷰트에는 MIME 문서에 대한 이 선행 추가 텍스트가 포함됩니다. `Parser`가 헤더 다음이지만 첫 번째 경계 문자열 이전에 어떤 텍스트를 감지하면, 이 텍스트를 메시지의 preamble 어트리뷰트에 대입합니다. `Generator`가 MIME 메시지의 단순 텍스트 표현을 기록할 때, 메시지에 preamble 어트리뷰트가 있는 것을 발견하면, 헤더와 첫 번째 경계 사이의 영역에 이 텍스트를 기록합니다. 자세한 내용은 `email.parser`와 `email.generator`를 참조하십시오.

    메시지 객체에 프리앰블이 없으면, preamble 어트리뷰트는 `None`이 됨에 유의하십시오.

  `epilogue`

    epilogue 어트리뷰트는 메시지의 마지막 경계와 끝 사이에 나타나는 텍스트를 포함한다는 점을 제외하고, preamble 어트리뷰트와 같은 방식으로 작동합니다.

    `Generator`가 파일 끝에서 줄 넘김을 인쇄하도록 하기 위해 에필로그를 빈 문자열로 설정할 필요는 없습니다.

  `defects`

    defects 어트리뷰트는 이 메시지를 구문 분석할 때 발견된 모든 결함의 리스트를 포함합니다. 가능한 구문 분석 결함에 대한 자세한 설명은 `email.errors`를 참조하십시오.