# `mailbox` — 다양한 형식의 사서함 조작하기

소스 코드: Lib/mailbox.py

This module defines two classes, `Mailbox` and `Message`, for accessing and manipulating on-disk mailboxes and the messages they contain. `Mailbox` offers a dictionary-like mapping from keys to messages. `Message` extends the `email.message` module’s `Message` class with format-specific state and behavior. Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.

더 보기

모듈 `email`

  메시지를 표현하고 조작합니다.

## `Mailbox` objects

class mailbox.Mailbox

  검사하고 수정할 수 있는 사서함.

  The `Mailbox` class defines an interface and is not intended to be instantiated. Instead, format-specific subclasses should inherit from `Mailbox` and your code should instantiate a particular subclass.

  The `Mailbox` interface is dictionary-like, with small keys corresponding to messages. Keys are issued by the `Mailbox` instance with which they will be used and are only meaningful to that `Mailbox` instance. A key continues to identify a message even if the corresponding message is modified, such as by replacing it with another message.

  Messages may be added to a `Mailbox` instance using the set-like method `add()` and removed using a `del` statement or the set-like methods `remove()` and `discard()`.

  `Mailbox` interface semantics differ from dictionary semantics in some noteworthy ways. Each time a message is requested, a new representation (typically a `Message` instance) is generated based upon the current state of the mailbox. Similarly, when a message is added to a `Mailbox` instance, the provided message representation’s contents are copied. In neither case is a reference to the message representation kept by the `Mailbox` instance.

  The default `Mailbox` iterator iterates over message representations, not keys as the default `dictionary` iterator does. Moreover, modification of a mailbox during iteration is safe and well-defined. Messages added to the mailbox after an iterator is created will not be seen by the iterator. Messages removed from the mailbox before the iterator yields them will be silently skipped, though using a key from an iterator may result in a `KeyError` exception if the corresponding message is subsequently removed.

  경고

  Be very cautious when modifying mailboxes that might be simultaneously changed by some other process. The safest mailbox format to use for such tasks is `Maildir`; try to avoid using single-file formats such as `mbox` for concurrent writing. If you’re modifying a mailbox, you must lock it by calling the `lock()` and `unlock()` methods before reading any messages in the file or making any changes by adding or deleting a message. Failing to lock the mailbox runs the risk of losing messages or corrupting the entire mailbox.

  `Mailbox` instances have the following methods:

  add(message)

    사서함에 message를 추가하고 할당된 키를 반환합니다.

    매개 변수 message는 `Message` 인스턴스, `email.message.Message` 인스턴스, 문자열, 바이트 문자열 또는 파일류 객체(바이너리 모드로 열어야 합니다)일 수 있습니다. message가 적절한 형식별 `Message` 서브 클래스의 인스턴스이면 (예를 들어, 이것이 `mbox` 인스턴스일 때 `mboxMessage` 인스턴스이면), 형식별 정보가 사용됩니다. 그렇지 않으면, 형식별 정보에 대한 적절한 기본값이 사용됩니다.

    버전 3.2에서 변경: 바이너리 입력에 대한 지원이 추가되었습니다.

  remove(key)
  __delitem__(key)
  discard(key)

    사서함에서 key에 해당하는 메시지를 삭제합니다.

    그러한 메시지가 없으면, 메서드가 `remove()`나 `__delitem__()`으로 호출되면 `KeyError` 예외가 발생하지만, `discard()`로 호출되면 예외가 발생하지 않습니다. 하부 사서함 형식이 다른 프로세스에 의한 동시 수정을 지원하면 `discard()`의 동작을 선호할 수 있습니다.

  __setitem__(key, message)

    key에 해당하는 메시지를 message로 바꿉니다. key에 해당하는 메시지가 없으면 `KeyError` 예외를 발생시킵니다.

    `add()`와 마찬가지로, message 매개 변수는 `Message` 인스턴스, `email.message.Message` 인스턴스, 문자열, 바이트 문자열 또는 파일류 객체(바이너리 모드로 열어야 합니다)일 수 있습니다. message가 적절한 형식별 `Message` 서브 클래스의 인스턴스이면 (예를 들어, 이것이 `mbox` 인스턴스일 때 `mboxMessage` 인스턴스이면), 형식별 정보가 사용됩니다. 그렇지 않으면, 현재 key에 해당하는 메시지의 형식별 정보가 변경되지 않습니다.

  iterkeys()

    Return an iterator over all keys

  keys()

    The same as `iterkeys()`, except that a `list` is returned rather than an iterator

  itervalues()
  __iter__()

    Return an iterator over representations of all messages. The messages are represented as instances of the appropriate format-specific `Message` subclass unless a custom message factory was specified when the `Mailbox` instance was initialized.

    참고

    `__iter__()`의 동작은 키를 이터레이트 하는 딕셔너리의 동작과 다릅니다.

  values()

    The same as `itervalues()`, except that a `list` is returned rather than an iterator

  iteritems()

    Return an iterator over (key, message) pairs, where key is a key and message is a message representation. The messages are represented as instances of the appropriate format-specific `Message` subclass unless a custom message factory was specified when the `Mailbox` instance was initialized.

  items()

    The same as `iteritems()`, except that a `list` of pairs is returned rather than an iterator of pairs.

  get(key, default=None)
  __getitem__(key)

    Return a representation of the message corresponding to key. If no such message exists, default is returned if the method was called as `get()` and a `KeyError` exception is raised if the method was called as `__getitem__()`. The message is represented as an instance of the appropriate format-specific `Message` subclass unless a custom message factory was specified when the `Mailbox` instance was initialized.

  get_message(key)

    key에 해당하는 메시지의 표현을 적절한 형식별 `Message` 서브 클래스의 인스턴스로 반환하거나, 그러한 메시지가 없으면 `KeyError` 예외를 발생시킵니다.

  get_bytes(key)

    key에 해당하는 메시지의 바이트 표현을 반환하거나, 그러한 메시지가 없으면 `KeyError` 예외를 발생시킵니다.

    버전 3.2에 추가.

  get_string(key)

    key에 해당하는 메시지의 문자열 표현을 반환하거나 그러한 메시지가 없으면 `KeyError` 예외를 발생시킵니다. 메시지는 `email.message.Message`를 통해 처리되어 7비트(7bit clean) 표현으로 변환됩니다.

  get_file(key)

    Return a file-like representation of the message corresponding to key, or raise a `KeyError` exception if no such message exists. The file-like object behaves as if open in binary mode. This file should be closed once it is no longer needed.

    버전 3.2에서 변경: The file object really is a binary file; previously it was incorrectly returned in text mode. Also, the file-like object now supports the context manager protocol: you can use a `with` statement to automatically close it.

    참고

    Unlike other representations of messages, file-like representations are not necessarily independent of the `Mailbox` instance that created them or of the underlying mailbox. More specific documentation is provided by each subclass.

  __contains__(key)

    key가 메시지에 해당하면 `True`를 반환하고, 그렇지 않으면 `False`를 반환합니다.

  __len__()

    사서함에 있는 메시지 수를 반환합니다.

  clear()

    사서함에서 모든 메시지를 삭제합니다.

  pop(key, default=None)

    Return a representation of the message corresponding to key and delete the message. If no such message exists, return default. The message is represented as an instance of the appropriate format-specific `Message` subclass unless a custom message factory was specified when the `Mailbox` instance was initialized.

  popitem()

    Return an arbitrary (key, message) pair, where key is a key and message is a message representation, and delete the corresponding message. If the mailbox is empty, raise a `KeyError` exception. The message is represented as an instance of the appropriate format-specific `Message` subclass unless a custom message factory was specified when the `Mailbox` instance was initialized.

  update(arg)

    Parameter arg should be a key-to-message mapping or an iterable of (key, message) pairs. Updates the mailbox so that, for each given key and message, the message corresponding to key is set to message as if by using `__setitem__()`. As with `__setitem__()`, each key must already correspond to a message in the mailbox or else a `KeyError` exception will be raised, so in general it is incorrect for arg to be a `Mailbox` instance.

    참고

    딕셔너리와 달리 키워드 인자는 지원되지 않습니다.

  flush()

    Write any pending changes to the filesystem. For some `Mailbox` subclasses, changes are always written immediately and `flush()` does nothing, but you should still make a habit of calling this method.

  lock()

    다른 프로세스가 수정하지 않아야 한다는 것을 알 수 있도록 사서함에 대한 배타적 권고 잠금(exclusive advisory lock)을 획득합니다. 잠금을 사용할 수 없으면 `ExternalClashError` 가 발생합니다. 사용되는 특정 잠금 메커니즘은 사서함 형식에 따라 다릅니다. 내용을 수정하기 전에 사서함을 항상 잠가야 합니다.

  unlock()

    사서함의 잠금을 해제합니다 (있다면).

  close()

    Flush the mailbox, unlock it if necessary, and close any open files. For some `Mailbox` subclasses, this method does nothing.

### `Maildir` objects

class mailbox.Maildir(dirname, factory=None, create=True)

  Maildir 형식의 사서함에 대한 `Mailbox`의 서브 클래스. 매개 변수 factory는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. factory가 `None`이면, `MaildirMessage` 가 기본 메시지 표현으로 사용됩니다. create가 `True`이면, 사서함이 없으면 만들어집니다.

  create가 `True`이고 dirname 경로가 존재하면, 디렉터리 레이아웃을 확인하지 않고 기존 maildir로 처리됩니다.

  역사적인 이유로 path가 아니라 dirname이라고 이름 붙였습니다.

  Maildir은 qmail 메일 전송 에이전트를 위해 고안된 디렉터리 기반 사서함 형식이며 현재 다른 프로그램에서 널리 지원됩니다. Maildir 사서함의 메시지는 공통 디렉터리 구조 내에서 별도의 파일에 저장됩니다. 이 설계를 사용하면 데이터 손상 없이 여러 관련 없는 프로그램에서 Maildir 사서함에 액세스하고 수정할 수 있어서 파일 잠금이 필요하지 않습니다.

  Maildir 사서함에는 세 개의 하위 디렉터리가 있습니다, 이름하여 `tmp`, `new` 및 `cur`. 메시지는 일시적으로 `tmp` 하위 디렉터리에 만들어진 다음 `new` 하위 디렉터리로 이동하여 전달을 완료합니다. 메일 사용자 에이전트는 이후에 메시지를 `cur` 하위 디렉터리로 이동하고 파일 이름에 추가된 특수 “info” 섹션에 메시지 상태에 대한 정보를 저장할 수 있습니다.

  Folders of the style introduced by the Courier mail transfer agent are also supported. Any subdirectory of the main mailbox is considered a folder if `'.'` is the first character in its name. Folder names are represented by `Maildir` without the leading `'.'`. Each folder is itself a Maildir mailbox but should not contain other folders. Instead, a logical nesting is indicated using `'.'` to delimit levels, e.g., “Archived.2005.07”.

  colon

    Maildir 명세에서는 특정 메시지 파일 이름에 콜론(`':'`)을 사용하도록 요구합니다. 그러나 일부 운영 체제에서는 파일 이름에 이 문자를 허용하지 않습니다. 이러한 운영 체제에서 Maildir과 유사한 형식을 사용하려면, 대신 사용할 다른 문자를 지정해야 합니다. 느낌표(`'!'`)는 인기 있는 선택입니다. 예를 들면:

        import mailbox
        mailbox.Maildir.colon = '!'

    The `colon` attribute may also be set on a per-instance basis.

  `Maildir` instances have all of the methods of `Mailbox` in addition to the following:

  list_folders()

    모든 폴더의 이름 리스트를 반환합니다.

  get_folder(folder)

    Return a `Maildir` instance representing the folder whose name is folder. A `NoSuchMailboxError` exception is raised if the folder does not exist.

  add_folder(folder)

    Create a folder whose name is folder and return a `Maildir` instance representing it.

  remove_folder(folder)

    이름이 folder인 폴더를 삭제합니다. 폴더에 메시지가 포함되었으면, `NotEmptyError` 예외가 발생하고 폴더가 삭제되지 않습니다.

  clean()

    지난 36시간 동안 액세스하지 않은 사서함에서 임시 파일을 삭제합니다. Maildir 명세는 메일을 읽는 프로그램이 이 작업을 가끔 수행해야 한다고 말합니다.

  Some `Mailbox` methods implemented by `Maildir` deserve special remarks:

  add(message)
  __setitem__(key, message)
  update(arg)

    경고

    이 메서드들은 현재 프로세스 ID를 기반으로 고유한 파일 이름을 생성합니다. 다중 스레드를 사용할 때, 이러한 메서드를 사용하여 같은 사서함을 동시에 조작하지 않도록 스레드를 조정하지 않으면 감지되지 않은 이름 충돌이 발생하여 사서함이 손상될 수 있습니다.

  flush()

    Maildir 사서함에 대한 모든 변경 사항은 즉시 적용되므로, 이 메서드는 아무 작업도 수행하지 않습니다.

  lock()
  unlock()

    Maildir 사서함은 잠금을 지원(또는 필요로)하지 않아서, 이 메서드들은 아무 작업도 수행하지 않습니다.

  close()

    `Maildir` instances do not keep any open files and the underlying mailboxes do not support locking, so this method does nothing.

  get_file(key)

    호스트 플랫폼에 따라, 반환된 파일이 열려있는 동안 하부 메시지를 수정하거나 제거하지 못할 수 있습니다.

더 보기

maildir man page from Courier

  형식의 명세. 지원 폴더에 대한 공통 확장을 설명합니다.

Using maildir format

  발명가의 Maildir에 대한 노트. 개정된 이름 생성 체계와 “info” 의미론에 대한 세부 정보를 포함합니다.

### `mbox` objects

class mailbox.mbox(path, factory=None, create=True)

  mbox 형식의 사서함에 대한 `Mailbox`의 서브 클래스. 매개 변수 factory는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. factory가 `None`이면, `mboxMessage`가 기본 메시지 표현으로 사용됩니다. create가 `True`이면, 사서함이 없으면 만들어집니다.

  mbox 형식은 유닉스 시스템에서 메일을 저장하기 위한 고전적인 형식입니다. mbox 사서함의 모든 메시지는 처음 5개의 문자가 “From “인 줄로 표시되는 각 메시지의 시작 부분과 함께 단일 파일에 저장됩니다.

  Several variations of the mbox format exist to address perceived shortcomings in the original. In the interest of compatibility, `mbox` implements the original format, which is sometimes referred to as mboxo. This means that the Content-Length header, if present, is ignored and that any occurrences of “From “ at the beginning of a line in a message body are transformed to “>From “ when storing the message, although occurrences of “>From “ are not transformed to “From “ when reading the message.

  Some `Mailbox` methods implemented by `mbox` deserve special remarks:

  get_file(key)

    Using the file after calling `flush()` or `close()` on the `mbox` instance may yield unpredictable results or raise an exception.

  lock()
  unlock()

    Three locking mechanisms are used—dot locking and, if available, the `flock()` and `lockf()` system calls.

더 보기

tin의 mbox 매뉴얼 페이지

  형식의 명세, 잠금에 대한 세부 정보가 있습니다.

유닉스에서 Netscape Mail 구성하기: 왜 Content-Length 형식이 나쁜가

  변형이 아닌 원래 mbox 형식을 사용하는 것에 대한 논의.

“mbox”는 서로 호환되지 않는 여러 사서함 형식의 집합입니다

  mbox 변형의 역사.

### `MH` objects

class mailbox.MH(path, factory=None, create=True)

  MH 형식의 사서함에 대한 `Mailbox`의 서브 클래스. 매개 변수 factory는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. factory가 `None`이면, `MHMessage`가 기본 메시지 표현으로 사용됩니다. create가 `True`이면, 사서함이 없으면 만들어집니다.

  MH는 메일 사용자 에이전트인 MH 메시지 처리 시스템(MH Message Handling System)을 위해 개발된 디렉터리 기반 사서함 형식입니다. MH 사서함의 각 메시지는 각자의 파일에 있습니다. MH 사서함에는 메시지 외에 다른 MH 사서함(폴더(folders)라고 합니다)이 포함될 수 있습니다. 폴더는 무제한 중첩될 수 있습니다. MH 사서함은 또한 메시지를 서브 폴더로 이동하지 않고 논리적으로 그룹화하는 데 사용되는 명명된 목록인 시퀀스(sequences)를 지원합니다. 시퀀스는 각 폴더의 `.mh_sequences`라는 파일에 정의됩니다.

  The `MH` class manipulates MH mailboxes, but it does not attempt to emulate all of mh’s behaviors. In particular, it does not modify and is not affected by the `context` or `.mh_profile` files that are used by mh to store its state and configuration.

  `MH` instances have all of the methods of `Mailbox` in addition to the following:

  list_folders()

    모든 폴더의 이름 리스트를 반환합니다.

  get_folder(folder)

    Return an `MH` instance representing the folder whose name is folder. A `NoSuchMailboxError` exception is raised if the folder does not exist.

  add_folder(folder)

    Create a folder whose name is folder and return an `MH` instance representing it.

  remove_folder(folder)

    이름이 folder인 폴더를 삭제합니다. 폴더에 메시지가 포함되었으면, `NotEmptyError` 예외가 발생하고 폴더가 삭제되지 않습니다.

  get_sequences()

    키 리스트에 매핑된 시퀀스 이름의 딕셔너리를 반환합니다. 시퀀스가 없으면, 빈 딕셔너리가 반환됩니다.

  set_sequences(sequences)

    `get_sequences()`에서 반환하는 것과 같이, 키 리스트에 매핑된 이름의 딕셔너리인, sequences를 기반으로 사서함에 존재하는 시퀀스를 다시 정의합니다.

  pack()

    번호 매기기의 간격을 없애기 위해 필요에 따라 사서함의 메시지 이름을 변경합니다. 시퀀스 리스트의 항목이 그에 따라 갱신됩니다.

    참고

    이미 발급된 키는 이 작업에 의해 무효가 되며 이후에 사용해서는 안 됩니다.

  Some `Mailbox` methods implemented by `MH` deserve special remarks:

  remove(key)
  __delitem__(key)
  discard(key)

    이 메서드들은 메시지를 즉시 삭제합니다. 이름 앞에 쉼표를 추가하여 메시지를 삭제하도록 표시하는 MH 규칙은 사용되지 않습니다.

  lock()
  unlock()

    Three locking mechanisms are used—dot locking and, if available, the `flock()` and `lockf()` system calls. For MH mailboxes, locking the mailbox means locking the `.mh_sequences` file and, only for the duration of any operations that affect them, locking individual message files.

  get_file(key)

    호스트 플랫폼에 따라, 반환된 파일이 열려있는 동안 하부 메시지를 제거하지 못할 수도 있습니다.

  flush()

    MH 사서함에 대한 모든 변경 사항이 즉시 적용되므로, 이 메서드는 아무 작업도 수행하지 않습니다.

  close()

    `MH` instances do not keep any open files, so this method is equivalent to `unlock()`.

더 보기

nmh - Message Handling System

  nmh의 홈페이지, 원래 mh의 갱신된 버전.

MH & nmh: 사용자와 프로그래머를 위한 이메일

  mh와 nmh에 대한 GPL 라이선스 책, 사서함 형식에 대한 정보가 있습니다.

### `Babyl` objects

class mailbox.Babyl(path, factory=None, create=True)

  Babyl 형식의 사서함에 대한 `Mailbox`의 서브 클래스. 매개 변수 factory는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. factory가 `None`이면, `BabylMessage`가 기본 메시지 표현으로 사용됩니다. create가 `True`이면, 사서함이 없으면 만들어집니다.

  Babyl은 Emacs에 포함된 Rmail 메일 사용자 에이전트에서 사용하는 단일 파일 사서함 형식입니다. 메시지의 시작 부분은 Control-Underscore(`'\037'`)와 Control-L(`'\014'`) 두 문자가 포함된 줄로 표시됩니다. 메시지의 끝은 다음 메시지의 시작이나, 마지막 메시지의 경우 Control-Underscore(`'\037'`) 문자가 포함된 줄로 표시됩니다.

  Babyl 사서함의 메시지는 두 집합의 헤더가 있습니다, 원래 헤더와 소위 가시적(visible) 헤더가 있습니다. 가시적 헤더는 일반적으로 더 매력적으로 다시 포맷되거나 요약된 원래 헤더의 부분 집합입니다. Babyl 사서함의 각 메시지에는 레이블(labels) 리스트, 또는 메시지에 대한 추가 정보를 기록하는 짧은 문자열이 있으며, 사서함에 있는 모든 사용자 정의 레이블 목록은 Babyl 옵션 섹션에 보관됩니다.

  `Babyl` instances have all of the methods of `Mailbox` in addition to the following:

  get_labels()

    사서함에 사용된 모든 사용자 정의 레이블의 이름 리스트를 반환합니다.

    참고

    Babyl 옵션 섹션의 레이블 목록을 참조하지 않고 사서함에 있는 레이블을 확인하기 위해 실제 메시지를 검사하지만, 사서함이 수정될 때마다 Babyl 섹션이 갱신됩니다.

  Some `Mailbox` methods implemented by `Babyl` deserve special remarks:

  get_file(key)

    Babyl 사서함에서, 메시지 헤더는 메시지 본문과 연속적으로 저장되지 않습니다. 파일류 표현을 생성하기 위해, 헤더와 본문이 파일과 동일한 API를 가진 `io.BytesIO` 인스턴스에 함께 복사됩니다. 결과적으로, 파일류 객체는 하부 사서함과는 진짜로 독립적이지만 문자열 표현보다 메모리를 절약하지 않습니다.

  lock()
  unlock()

    Three locking mechanisms are used—dot locking and, if available, the `flock()` and `lockf()` system calls.

더 보기

Format of Version 5 Babyl Files

  Babyl 형식의 명세.

Rmail로 메일 읽기

  Rmail 매뉴얼, Babyl 의미론에 대한 정보가 있습니다.

### `MMDF` objects

class mailbox.MMDF(path, factory=None, create=True)

  MMDF 형식의 사서함에 대한 `Mailbox`의 서브 클래스. 매개 변수 factory는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. factory가 `None`이면, `MMDFMessage`가 기본 메시지 표현으로 사용됩니다. create가 `True`이면, 사서함이 없으면 만들어집니다.

  MMDF는 메일 전송 에이전트인 Multichannel Memorandum Distribution Facility를 위해 개발된 단일 파일 사서함 형식입니다. 각 메시지는 mbox 메시지와 같은 형식이지만 4개의 Control-A (`'\001'`) 문자를 포함하는 줄로 앞뒤로 둘러쌉니다. mbox 형식과 마찬가지로, 각 메시지의 시작 부분은 처음 5개의 문자가 “From “인 줄로 표시되지만, 메시지를 저장할 때 추가로 등장하는 “From “을 “>From “으로 변환하지 않습니다, 메시지를 구분하는 추가적인 줄로 인해 후속 메시지의 시작으로 착각할 우려가 없기 때문입니다.

  Some `Mailbox` methods implemented by `MMDF` deserve special remarks:

  get_file(key)

    Using the file after calling `flush()` or `close()` on the `MMDF` instance may yield unpredictable results or raise an exception.

  lock()
  unlock()

    Three locking mechanisms are used—dot locking and, if available, the `flock()` and `lockf()` system calls.

더 보기

tin의 mmdf 매뉴얼 페이지

  뉴스 리더인 tin의 설명서에 있는 MMDF 형식의 명세.

MMDF

  Multichannel Memorandum Distribution Facility를 설명하는 위키피디아 기사.

## `Message` objects

class mailbox.Message(message=None)

  A subclass of the `email.message` module’s `Message`. Subclasses of `mailbox.Message` add mailbox-format-specific state and behavior.

  If message is omitted, the new instance is created in a default, empty state. If message is an `email.message.Message` instance, its contents are copied; furthermore, any format-specific information is converted insofar as possible if message is a `Message` instance. If message is a string, a byte string, or a file, it should contain an RFC 2822-compliant message, which is read and parsed. Files should be open in binary mode, but text mode files are accepted for backward compatibility.

  서브 클래스에서 제공하는 형식별 상태와 동작은 다양하지만, 일반적으로 지원되는 특정 사서함에만 고유하지는 않은 속성입니다 (아마도 속성은 특정 사서함 형식에 고유합니다). 예를 들어, 단일 파일 사서함 형식에 대한 파일 오프셋과 디렉터리 기반 사서함 형식에 대한 파일 이름은 유지되지 않는데, 원래 사서함에만 적용되기 때문입니다. 그러나 사용자가 메시지를 읽었는지나 중요하다고 표시되었는지와 같은 상태는 메시지 자체에 적용되므로 유지됩니다.

  There is no requirement that `Message` instances be used to represent messages retrieved using `Mailbox` instances. In some situations, the time and memory required to generate `Message` representations might not be acceptable. For such situations, `Mailbox` instances also offer string and file-like representations, and a custom message factory may be specified when a `Mailbox` instance is initialized.

### `MaildirMessage` objects

class mailbox.MaildirMessage(message=None)

  Maildir 특정 동작을 갖는 메시지. 매개 변수 message는 `Message` 생성자와 같은 의미입니다.

  일반적으로, 메일 사용자 에이전트 응용 프로그램은 사용자가 사서함을 처음 열고 닫은 후 `new` 하위 디렉터리의 모든 메시지를 `cur` 하위 디렉터리로 이동하여, 메시지가 실제로 읽혔는지에 관계없이 오래되었음을 기록합니다. `cur`의 각 메시지에는 상태에 대한 정보를 저장하기 위해 파일 이름에 추가된 “info” 섹션이 있습니다. (일부 메일 리더는 `new`의 메시지에 “info” 섹션을 추가할 수도 있습니다.) “info” 섹션은 두 가지 형식 중 하나를 취할 수 있습니다: “2,”와 그 뒤로 표준화된 플래그 목록이 오거나 (예를 들어, “2,FR”), “1,”과 그 뒤로 소위 실험적 정보를 포함할 수 있습니다. Maildir 메시지의 표준 플래그는 다음과 같습니다:

  플래그 | 의미 | 설명
  --- | --- | ---
  D | 초안 | 작성 중
  F | 깃발 표시 | 중요하다고 표시됨
  P | 전달됨 | 전달, 재전송 또는 반송됨
  R | 답장함 | 답장함
  S | 보았음 | 읽었음
  T | 휴지통 | 후에 삭제하기 위해 표시함

  `MaildirMessage` instances offer the following methods:

  get_subdir()

    “new”(메시지가 `new` 하위 디렉터리에 저장되어야 하면)나 “cur”(메시지가 `cur` 하위 디렉터리에 저장되어야 하면)를 반환합니다.

    참고

    메시지를 읽었는지에 관계없이, 일반적으로 사서함에 액세스한 후 메시지는 `new`에서 `cur`로 이동됩니다. `"S" in msg.get_flags()`가 `True`이면 메시지 `msg`를 읽은 것입니다.

  set_subdir(subdir)

    메시지를 저장할 하위 디렉터리를 설정합니다. 매개 변수 subdir은 “new”나 “cur”여야 합니다.

  get_flags()

    현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 표준 Maildir 형식을 준수하면, 결과는 `'D'`, `'F'`, `'P'`, `'R'`, `'S'` 및 `'T'`의 각 항목이 알파벳 순서로 0이나 1개 등장하는 이어붙이기입니다. 플래그가 설정되지 않았거나 “info”에 실험적 의미가 포함되어 있으면 빈 문자열이 반환됩니다.

  set_flags(flags)

    flags로 지정된 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다.

  add_flag(flag)

    다른 플래그를 변경하지 않고 flag로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, flag가 둘 이상의 문자로 구성된 문자열일 수 있습니다. 플래그 대신 실험적 정보를 포함하는지와 관계없이 현재 “info”를 덮어씁니다.

  remove_flag(flag)

    다른 플래그를 변경하지 않고 flag에 의해 지정된 플래그를 설정 해제합니다. 한 번에 둘 이상의 플래그를 제거하기 위해, flag는 둘 이상의 문자로 구성된 문자열일 수 있습니다. “info”에 플래그 대신 실험적 정보가 포함되어 있으면, 현재 “info”가 수정되지 않습니다.

  get_date()

    메시지의 배달 날짜를 에포크(Epoch) 이후 초를 나타내는 부동 소수점 숫자로 반환합니다.

  set_date(date)

    메시지의 배달 날짜를 date로 설정합니다. 이는 에포크(Epoch) 이후 초를 나타내는 부동 소수점 숫자입니다.

  get_info()

    메시지에 대한 “info”를 포함하는 문자열을 반환합니다. 이것은 실험적인 (즉, 플래그 목록이 아닌) “info”를 액세스하고 수정하는 데 유용합니다.

  set_info(info)

    “info”를 문자열이어야 하는 info로 설정합니다.

When a `MaildirMessage` instance is created based upon an `mboxMessage` or `MMDFMessage` instance, the Status and X-Status headers are omitted and the following conversions take place:

결과 상태 | `mboxMessage`나 `MMDFMessage` 상태
--- | ---
“cur” 하위 디렉터리 | O 플래그
F 플래그 | F 플래그
R 플래그 | A 플래그
S 플래그 | R 플래그
T 플래그 | D 플래그

When a `MaildirMessage` instance is created based upon an `MHMessage` instance, the following conversions take place:

결과 상태 | `MHMessage` 상태
--- | ---
“cur” 하위 디렉터리 | “unseen” 시퀀스
“cur” 하위 디렉터리와 S 플래그 | “unseen” 시퀀스 없음
F 플래그 | “flagged” 시퀀스
R 플래그 | “replied” 시퀀스

When a `MaildirMessage` instance is created based upon a `BabylMessage` instance, the following conversions take place:

결과 상태 | `BabylMessage` 상태
--- | ---
“cur” 하위 디렉터리 | “unseen” 레이블
“cur” 하위 디렉터리와 S 플래그 | “unseen” 레이블 없음
P 플래그 | “forwarded”나 “resent” 레이블
R 플래그 | “answered” 레이블
T 플래그 | “deleted” 레이블

### `mboxMessage` objects

class mailbox.mboxMessage(message=None)

  mbox 특정 동작을 갖는 메시지. 매개 변수 message는 `Message` 생성자와 같은 의미입니다.

  mbox 사서함의 메시지는 단일 파일에 함께 저장됩니다. 보낸 사람의 봉투 주소(envelope address)와 배달 시간은 일반적으로 메시지의 시작을 나타내는 데 사용되는 “From “으로 시작하는 줄에 저장되지만, mbox 구현 간에 이 데이터의 정확한 형식에는 상당한 차이가 있습니다. 읽었는지나 중요하다고 표시되었는지와 같은 메시지 상태를 나타내는 플래그는 일반적으로 Status와 X-Status 헤더에 저장됩니다.

  mbox 메시지의 전통적인 플래그는 다음과 같습니다:

  플래그 | 의미 | 설명
  --- | --- | ---
  R | 읽었음 | 읽었음
  O | 오래되었음 | 전에 MUA에서 감지됨
  D | 삭제됨 | 후에 삭제하기 위해 표시함
  F | 깃발 표시 | 중요하다고 표시됨
  A | 답변함 | 답장함

  “R”과 “O” 플래그는 Status 헤더에 저장되고, “D”, “F” 및 “A” 플래그는 X-Status 헤더에 저장됩니다. 플래그와 헤더는 일반적으로 언급된 순서대로 나타납니다.

  `mboxMessage` instances offer the following methods:

  get_from()

    mbox 사서함에서 메시지의 시작을 표시하는 “From “ 줄을 나타내는 문자열을 반환합니다. 선행 “From “과 후행 줄넘김은 제외됩니다.

  set_from(from_, time_=None)

    Set the “From “ line to from_, which should be specified without a leading “From “ or trailing newline. For convenience, time_ may be specified and will be formatted appropriately and appended to from_. If time_ is specified, it should be a `time.struct_time` instance, a tuple suitable for passing to `time.strftime()`, or `True` (to use `time.gmtime()`).

  get_flags()

    현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 전통적인 형식을 준수하면, 결과는 `'R'`, `'O'`, `'D'`, `'F'` 및 `'A'` 각각이 이 순서로 0이나 1회 등장하도록 이어붙인 것입니다.

  set_flags(flags)

    flags에서 지정한 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다. 매개 변수 flags는 `'R'`, `'O'`, `'D'`, `'F'` 및 `'A'` 각각이 0개 이상 등장하도록 임의의 순서로 이어붙인 것이어야 합니다.

  add_flag(flag)

    다른 플래그를 변경하지 않고 flag로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, flag가 둘 이상의 문자로 구성된 문자열일 수 있습니다.

  remove_flag(flag)

    다른 플래그를 변경하지 않고 flag에 의해 지정된 플래그를 설정 해제합니다. 한 번에 둘 이상의 플래그를 제거하기 위해, flag는 둘 이상의 문자로 구성된 문자열일 수 있습니다.

When an `mboxMessage` instance is created based upon a `MaildirMessage` instance, a “From “ line is generated based upon the `MaildirMessage` instance’s delivery date, and the following conversions take place:

결과 상태 | `MaildirMessage` 상태
--- | ---
R 플래그 | S 플래그
O 플래그 | “cur” 하위 디렉터리
D 플래그 | T 플래그
F 플래그 | F 플래그
A 플래그 | R 플래그

When an `mboxMessage` instance is created based upon an `MHMessage` instance, the following conversions take place:

결과 상태 | `MHMessage` 상태
--- | ---
R 플래그와 O 플래그 | “unseen” 시퀀스 없음
O 플래그 | “unseen” 시퀀스
F 플래그 | “flagged” 시퀀스
A 플래그 | “replied” 시퀀스

When an `mboxMessage` instance is created based upon a `BabylMessage` instance, the following conversions take place:

결과 상태 | `BabylMessage` 상태
--- | ---
R 플래그와 O 플래그 | “unseen” 레이블 없음
O 플래그 | “unseen” 레이블
D 플래그 | “deleted” 레이블
A 플래그 | “answered” 레이블

When a `mboxMessage` instance is created based upon an `MMDFMessage` instance, the “From “ line is copied and all flags directly correspond:

결과 상태 | `MMDFMessage` 상태
--- | ---
R 플래그 | R 플래그
O 플래그 | O 플래그
D 플래그 | D 플래그
F 플래그 | F 플래그
A 플래그 | A 플래그

### `MHMessage` objects

class mailbox.MHMessage(message=None)

  MH 특정 동작을 갖는 메시지. 매개 변수 message는 `Message` 생성자와 같은 의미입니다.

  MH 메시지는 전통적인 의미에서 마크나 플래그를 지원하지 않지만, 임의 메시지의 논리적 그룹인 시퀀스를 지원합니다. 일부 메일 읽기 프로그램(표준 mh와 nmh는 아니지만)은 다음과 같이 다른 형식에서 플래그를 사용하는 것과 거의 같은 방식으로 시퀀스를 사용합니다:

  시퀀스 | 설명
  --- | ---
  unseen | 읽지 않았지만, 이전에 MUA에서 감지했습니다.
  replied | 답장함
  flagged | 중요하다고 표시됨

  `MHMessage` instances offer the following methods:

  get_sequences()

    이 메시지를 포함하는 시퀀스의 이름 리스트를 반환합니다.

  set_sequences(sequences)

    이 메시지를 포함하는 시퀀스의 리스트를 설정합니다.

  add_sequence(sequence)

    이 메시지를 포함하는 시퀀스의 리스트에 sequence를 추가합니다.

  remove_sequence(sequence)

    이 메시지를 포함하는 시퀀스의 리스트에서 sequence를 제거합니다.

When an `MHMessage` instance is created based upon a `MaildirMessage` instance, the following conversions take place:

결과 상태 | `MaildirMessage` 상태
--- | ---
“unseen” 시퀀스 | S 플래그 없음
“replied” 시퀀스 | R 플래그
“flagged” 시퀀스 | F 플래그

When an `MHMessage` instance is created based upon an `mboxMessage` or `MMDFMessage` instance, the Status and X-Status headers are omitted and the following conversions take place:

결과 상태 | `mboxMessage`나 `MMDFMessage` 상태
--- | ---
“unseen” 시퀀스 | R 플래그 없음
“replied” 시퀀스 | A 플래그
“flagged” 시퀀스 | F 플래그

When an `MHMessage` instance is created based upon a `BabylMessage` instance, the following conversions take place:

결과 상태 | `BabylMessage` 상태
--- | ---
“unseen” 시퀀스 | “unseen” 레이블
“replied” 시퀀스 | “answered” 레이블

### `BabylMessage` objects

class mailbox.BabylMessage(message=None)

  Babyl 특정 동작을 갖는 메시지. 매개 변수 message는 `Message` 생성자와 같은 의미입니다.

  어트리뷰트(attributes)라고 부르는 특정 메시지 레이블은 관례에 따라 특별한 의미를 갖도록 정의됩니다. 어트리뷰트는 다음과 같습니다:

  레이블 | 설명
  --- | ---
  unseen | 읽지 않았지만, 이전에 MUA에서 감지했습니다.
  deleted | 후에 삭제하기 위해 표시함
  filed | 다른 파일이나 사서함에 복사됨
  answered | 답장함
  forwarded | 전달됨
  edited | 사용자가 수정했음
  resent | 다시 보냈음

  By default, Rmail displays only visible headers. The `BabylMessage` class, though, uses the original headers because they are more complete. Visible headers may be accessed explicitly if desired.

  `BabylMessage` instances offer the following methods:

  get_labels()

    메시지의 레이블 리스트를 반환합니다.

  set_labels(labels)

    메시지의 레이블 리스트를 labels로 설정합니다.

  add_label(label)

    메시지의 레이블 리스트에 label을 추가합니다.

  remove_label(label)

    메시지의 레이블 리스트에서 label을 제거합니다.

  get_visible()

    헤더가 메시지의 가시적 헤더이고 본문이 비어있는 `Message` 인스턴스를 반환합니다.

  set_visible(visible)

    메시지의 가시적 헤더를 message의 헤더와 같게 설정합니다. 매개 변수 visible은 `Message` 인스턴스, `email.message.Message` 인스턴스, 문자열 또는 파일류 객체(텍스트 모드로 열어야 합니다)여야 합니다.

  update_visible()

    When a `BabylMessage` instance’s original headers are modified, the visible headers are not automatically modified to correspond. This method updates the visible headers as follows: each visible header with a corresponding original header is set to the value of the original header, each visible header without a corresponding original header is removed, and any of Date, From, Reply-To, To, CC, and Subject that are present in the original headers but not the visible headers are added to the visible headers.

When a `BabylMessage` instance is created based upon a `MaildirMessage` instance, the following conversions take place:

결과 상태 | `MaildirMessage` 상태
--- | ---
“unseen” 레이블 | S 플래그 없음
“deleted” 레이블 | T 플래그
“answered” 레이블 | R 플래그
“forwarded” 레이블 | P 플래그

When a `BabylMessage` instance is created based upon an `mboxMessage` or `MMDFMessage` instance, the Status and X-Status headers are omitted and the following conversions take place:

결과 상태 | `mboxMessage`나 `MMDFMessage` 상태
--- | ---
“unseen” 레이블 | R 플래그 없음
“deleted” 레이블 | D 플래그
“answered” 레이블 | A 플래그

When a `BabylMessage` instance is created based upon an `MHMessage` instance, the following conversions take place:

결과 상태 | `MHMessage` 상태
--- | ---
“unseen” 레이블 | “unseen” 시퀀스
“answered” 레이블 | “replied” 시퀀스

### `MMDFMessage` objects

class mailbox.MMDFMessage(message=None)

  MMDF 특정 동작을 갖는 메시지. 매개 변수 message는 `Message` 생성자와 같은 의미입니다.

  mbox 사서함의 메시지와 마찬가지로, MMDF 메시지는 보낸 사람의 주소와 배달 날짜가 “From “으로 시작하는 첫 줄에 저장됩니다. 마찬가지로, 메시지의 상태를 나타내는 플래그는 일반적으로 Status와 X-Status 헤더에 저장됩니다.

  MMDF 메시지의 전통적인 플래그는 mbox 메시지의 플래그와 동일하며 다음과 같습니다:

  플래그 | 의미 | 설명
  --- | --- | ---
  R | 읽었음 | 읽었음
  O | 오래되었음 | 전에 MUA에서 감지됨
  D | 삭제됨 | 후에 삭제하기 위해 표시함
  F | 깃발 표시 | 중요하다고 표시됨
  A | 답변함 | 답장함

  “R”과 “O” 플래그는 Status 헤더에 저장되고, “D”, “F” 및 “A” 플래그는 X-Status 헤더에 저장됩니다. 플래그와 헤더는 일반적으로 언급된 순서대로 나타납니다.

  `MMDFMessage` instances offer the following methods, which are identical to those offered by `mboxMessage`:

  get_from()

    mbox 사서함에서 메시지의 시작을 표시하는 “From “ 줄을 나타내는 문자열을 반환합니다. 선행 “From “과 후행 줄넘김은 제외됩니다.

  set_from(from_, time_=None)

    Set the “From “ line to from_, which should be specified without a leading “From “ or trailing newline. For convenience, time_ may be specified and will be formatted appropriately and appended to from_. If time_ is specified, it should be a `time.struct_time` instance, a tuple suitable for passing to `time.strftime()`, or `True` (to use `time.gmtime()`).

  get_flags()

    현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 전통적인 형식을 준수하면, 결과는 `'R'`, `'O'`, `'D'`, `'F'` 및 `'A'` 각각이 이 순서로 0이나 1회 등장하도록 이어붙인 것입니다.

  set_flags(flags)

    flags에서 지정한 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다. 매개 변수 flags는 `'R'`, `'O'`, `'D'`, `'F'` 및 `'A'` 각각이 0개 이상 등장하도록 임의의 순서로 이어붙인 것이어야 합니다.

  add_flag(flag)

    다른 플래그를 변경하지 않고 flag로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, flag가 둘 이상의 문자로 구성된 문자열일 수 있습니다.

  remove_flag(flag)

    다른 플래그를 변경하지 않고 flag에 의해 지정된 플래그를 설정 해제합니다. 한 번에 둘 이상의 플래그를 제거하기 위해, flag는 둘 이상의 문자로 구성된 문자열일 수 있습니다.

When an `MMDFMessage` instance is created based upon a `MaildirMessage` instance, a “From “ line is generated based upon the `MaildirMessage` instance’s delivery date, and the following conversions take place:

결과 상태 | `MaildirMessage` 상태
--- | ---
R 플래그 | S 플래그
O 플래그 | “cur” 하위 디렉터리
D 플래그 | T 플래그
F 플래그 | F 플래그
A 플래그 | R 플래그

When an `MMDFMessage` instance is created based upon an `MHMessage` instance, the following conversions take place:

결과 상태 | `MHMessage` 상태
--- | ---
R 플래그와 O 플래그 | “unseen” 시퀀스 없음
O 플래그 | “unseen” 시퀀스
F 플래그 | “flagged” 시퀀스
A 플래그 | “replied” 시퀀스

When an `MMDFMessage` instance is created based upon a `BabylMessage` instance, the following conversions take place:

결과 상태 | `BabylMessage` 상태
--- | ---
R 플래그와 O 플래그 | “unseen” 레이블 없음
O 플래그 | “unseen” 레이블
D 플래그 | “deleted” 레이블
A 플래그 | “answered” 레이블

When an `MMDFMessage` instance is created based upon an `mboxMessage` instance, the “From “ line is copied and all flags directly correspond:

결과 상태 | `mboxMessage` 상태
--- | ---
R 플래그 | R 플래그
O 플래그 | O 플래그
D 플래그 | D 플래그
F 플래그 | F 플래그
A 플래그 | A 플래그

## 예외

The following exception classes are defined in the `mailbox` module:

exception mailbox.Error

  기타 모든 다른 모듈 특정 예외에 대한 베이스 클래스.

exception mailbox.NoSuchMailboxError

  사서함이 기대되지만 찾을 수 없을 때 발생합니다, 가령 존재하지 않는 경로로 (그리고 `False`로 설정된 create 매개 변수를 사용하여) `Mailbox` 서브 클래스를 인스턴스 화하거나, 존재하지 않는 폴더를 열 때.

exception mailbox.NotEmptyError

  사서함이 비어 있지 않지만 비어있을 것으로 기대될 때 발생합니다, 가령 메시지가 포함된 폴더를 삭제할 때.

exception mailbox.ExternalClashError

  Raised when some mailbox-related condition beyond the control of the program causes it to be unable to proceed, such as when failing to acquire a lock that another program already holds a lock, or when a uniquely generated file name already exists.

exception mailbox.FormatError

  파일의 데이터를 구문 분석할 수 없을 때 발생합니다, 가령 `MH` 인스턴스가 손상된 `.mh_sequences` 파일을 읽으려고 할 때.

## 예

사서함에 있는 모든 흥미롭게 보이는 메시지의 제목을 인쇄하는 간단한 예:

    import mailbox
    for message in mailbox.mbox('~/mbox'):
        subject = message['subject']       # Could possibly be None.
        if subject and 'python' in subject.lower():
            print(subject)

변환할 수 있는 모든 형식별 정보를 변환하면서, Babyl 사서함에서 MH 사서함으로 모든 메일을 복사하려면:

    import mailbox
    destination = mailbox.MH('~/Mail')
    destination.lock()
    for message in mailbox.Babyl('~/RMAIL'):
        destination.add(mailbox.MHMessage(message))
    destination.flush()
    destination.unlock()

이 예에서는 여러 메일링 리스트로부터의 메일을 다른 사서함으로 정렬하여 넣고, 다른 프로그램에 의한 동시 수정으로 인한 메일 손상, 프로그램 중단으로 인한 메일 손실 또는 사서함에 있는 잘못된 메시지로 인한 조기 종료를 방지하도록 주의합니다:

    import mailbox
    import email.errors

    list_names = ('python-list', 'python-dev', 'python-bugs')

    boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
    inbox = mailbox.Maildir('~/Maildir', factory=None)

    for key in inbox.iterkeys():
        try:
            message = inbox[key]
        except email.errors.MessageParseError:
            continue                # The message is malformed. Just leave it.

        for name in list_names:
            list_id = message['list-id']
            if list_id and name in list_id:
                # Get mailbox to use
                box = boxes[name]

                # Write copy to disk before removing original.
                # If there's a crash, you might duplicate a message, but
                # that's better than losing a message completely.
                box.lock()
                box.add(message)
                box.flush()
                box.unlock()

                # Remove original message
                inbox.lock()
                inbox.discard(key)
                inbox.flush()
                inbox.unlock()
                break               # Found destination, so stop looking.

    for box in boxes.itervalues():
        box.close()