The First Network Email

Ray Tomlinson

During the summer and autumn of 1971, I was part of a small group of programmers who were developing a time-sharing system called TENEX that ran on Digital PDP-10 computers. We were supporting a larger group working on natural language. Earlier, I had worked on the Network Control Protocol (NCP) for TENEX and network programs such as an experimental file transfer program called CPYNET.

I was making improvements to the local inter-user mail program called SNDMSG. Single-computer electronic mail had existed since at least the early 1960's and SNDMSG was an example of that. SNDMSG allowed a user to compose, address, and send a message to other users' mailboxes.

A mailbox was simply a file with a particular name. It's only special property was its protection which only allowed other users to append to the file. That is, they could write more material onto the end of the mailbox, but they couldn't read or overwrite what was already there. The idea occurred to me that CPYNET could append material to a mailbox file just as readily as SNDMSG could. SNDMSG could easily incorporate the code from CPYNET and direct messages through a network connection to remote mailboxes in addition to appending messages to local mailbox files.

The missing piece was that the experimental CPYNET protocol had no provision for appending to a file; it could just send and receive files. Adding the missing piece was a no-brainer -- just a minor addition to the protocol. I don't recall the protocol details, but appending to a file was the same as writing to a file except for the mode in which the file was opened.

Next, the CPYNET code was incorporated into SNDMSG. It remained to provide a way to distinguish local mail from network mail. I chose to append an at sign and the host name to the user's (login) name. I am frequently asked why I chose the at sign, but the at sign just makes sense. The purpose of the at sign (in English) was to indicate a unit price (for example, 10 items @ $1.95). I used the at sign to indicate that the user was "at" some other host rather than being local.

