---
name: "mbox"
section: "5qmail"
platform: "linux"
package: "qmail"
version: "1.06-6.2~deb10u1"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/mbox/5qmail"
---

# mbox(5qmail)

file containing mail messages

## NAME

mbox - file containing mail messages

## INTRODUCTION

The most common format for storage of mail messages is *mbox* format. An *mbox* is a single file containing zero or more mail messages.

## MESSAGE FORMAT

A message encoded in *mbox* format begins with a **From\_** line, continues with a series of **non-From\_** lines, and ends with a blank line. A **From\_** line means any line that begins with the characters F, r, o, m, space:

```
     From god@heaven.af.mil Sat Jan  3 01:05:34 1996
     Return-Path: <god@heaven.af.mil>
     Delivered-To: djb@silverton.berkeley.edu
     Date: 3 Jan 1996 01:05:34 -0000
     From: God <god@heaven.af.mil>
     To: djb@silverton.berkeley.edu (D. J. Bernstein)
     How's that mail system project coming along?
```

The final line is a completely blank line (no spaces or tabs). Notice that blank lines may also appear elsewhere in the message.

The **From\_** line always looks like **From** *envsender* *date* *moreinfo*. *envsender* is one word, without spaces or tabs; it is usually the envelope sender of the message. *date* is the delivery date of the message. It always contains exactly 24 characters in **asctime** format. *moreinfo* is optional; it may contain arbitrary information.

Between the **From\_** line and the blank line is a message in RFC 822 format, as described in **[qmail-header(5)](/qmail-header/5.md)**, subject to **\>From quoting** as described below.

## HOW A MESSAGE IS DELIVERED

Here is how a program appends a message to an *mbox* file.

It first creates a **From\_** line given the message's envelope sender and the current date. If the envelope sender is empty (i.e., if this is a bounce message), the program uses **MAILER-DAEMON** instead. If the envelope sender contains spaces, tabs, or newlines, the program replaces them with hyphens.

The program then copies the message, applying **\>From quoting** to each line. **\>From quoting** ensures that the resulting lines are not **From\_** lines: the program prepends a **\>** to any **From\_** line, **\>From\_** line, **\>\>From\_** line, **\>\>\>From\_** line, etc.

Finally the program appends a blank line to the message. If the last line of the message was a partial line, it writes two newlines; otherwise it writes one.

## HOW A MESSAGE IS READ

A reader scans through an *mbox* file looking for **From\_** lines. Any **From\_** line marks the beginning of a message. The reader should not attempt to take advantage of the fact that every **From\_** line (past the beginning of the file) is preceded by a blank line.

Once the reader finds a message, it extracts a (possibly corrupted) envelope sender and delivery date out of the **From\_** line. It then reads until the next **From\_** line or end of file, whichever comes first. It strips off the final blank line and deletes the quoting of **\>From\_** lines and **\>\>From\_** lines and so on. The result is an RFC 822 message.

## COMMON MBOX VARIANTS

There are many variants of *mbox* format. The variant described above is *mboxrd* format, popularized by Rahul Dhesi in June 1995.

The original *mboxo* format quotes only **From\_** lines, not **\>From\_** lines. As a result it is impossible to tell whether

```
     From: djb@silverton.berkeley.edu (D. J. Bernstein)
     To: god@heaven.af.mil
     >From now through August I'll be doing beta testing.
     Thanks for your interest.
```

was quoted in the original message. An *mboxrd* reader will always strip off the quoting.

*mboxcl* format is like *mboxo* format, but includes a Content-Length field with the  number of bytes in the message. *mboxcl2* format is like *mboxcl* but has no **\>From** quoting. These formats are used by SVR4 mailers. *mboxcl2* cannot be read safely by *mboxrd* readers.

## UNSPECIFIED DETAILS

There are many locking mechanisms for *mbox* files. **qmail-local** always uses **flock** on systems that have it, otherwise **lockf**.

The delivery date in a **From\_** line does not specify a time zone. **qmail-local** always creates the delivery date in GMT so that  *mbox* files can be safely transported from one time zone to another.

If the mtime on a nonempty  *mbox* file is greater than the atime, the file has new mail. If the mtime is smaller than the atime, the new mail has been read. If the atime equals the mtime, there is no way to tell whether the file has new mail, since **qmail-local** takes much less than a second to run. One solution is for a mail reader to artificially set the atime to the mtime plus 1. Then the file has new mail if and only if the atime is less than or equal to the mtime.

Some mail readers place **Status** fields in each message to indicate which messages have been read.

## SEE ALSO

[maildir(5)](/maildir/5.md), [qmail-header(5)](/qmail-header/5.md), [qmail-local(8)](/qmail-local/8.md)
