kerl at emtek dot com
April 28, 1997
How do I use mail? How do I save a message as a file? How do I forward a message? How the heck do I go back up a line when I've made a mistake, without having to start over from scratch??
There are two command sets in mail: one is used at the mail prompt, and one is used while composing messages. They are both generally just a single letter (though the latter are preceded by a ~ at the beginning of a line — otherwise everything you typed would be a command, not part of the message body!).
I'll discuss both command sets, as well as a couple of items for your ~/.mailrc, which sets up some preferences. Then I'll briefly mention aliases and a few command-line arguments (though your manpage on mail will have full details).
There is more than one mail tool out there; I'll be referring to /usr/ucb/Mail on Sun, and /usr/bin/mail on IBM (which function identically, as far as I can tell). These are the default mail tools for sa2000, in the Emtek product, and in the engineering network within Emtek as well. These are probably the ones you're already using (do 'which mail' at the csh if you're not sure).
You'll see that there are very simple ways (just a few keystrokes) to edit messages, read in other messages or files on your system, and to save messages as files. Using these commands, your mailtool will be more integrated with the rest of your work, and will become more of a joy to use.
Commands at the mail prompt
When you type 'mail' at the csh, you will see something like:
sa2000<clinical>@ds35g % mail Mail version SMI 4.1-OWV3 Mon Sep 23 07:17:24 PDT 1991 Type ? for help. "/usr/spool/mail/sa2000": 3 messages 1 new 1 root Wed Aug 9 18:58 13/316 Returned mail: user unknown U 2 fred Wed Aug 9 18:59 13/319 I'll be out sick today > 3 sa2000 Wed Aug 9 19:00 12/307 Reminder &
The N means new; U means not new but still not read (i.e. you quit mail tool without reading that message the last time you read your mail).
The > points to the current message.
The & is the mail prompt. You can change this as shown below, but the default (until you do change it) is &.
The most basic commands are h, z and z-; d and u; x and q; m and r; and s. I'll describe each. First, though, several of these basic commands operate on one or more message numbers. Here are the ways you specify message numbers — the numbers themselves, or some shortcut characters:
|n||Message number n, such as 3.|
|.||The current message (marked with '> ').|
|^||The first undeleted message.|
|$||The last message.|
|+||The next undeleted message.|
|-||The previous undeleted message.|
|n-m||An inclusive range of message numbers.|
|(username)||All messages from (username).|
|/(string)||All messages with (string) in the subject line (case ignored).|
Now that you know how to specify which message(s) you want a command to operate on, here are explanations of those basic commands:
|(message number or shortcut)||To view a message, just type its number; to view the last message, just type $; etc. A carriage return on an empty line means 'view the next message' — it's equivalent to n (or +).|
|h||Shows you a screenful of message headers (a "header" being the number,
sender, date, size and subject).
h with no message number shows the current screenful of messages (the number that make up a screenful is set with the screen variable, described below).
h$ shows you the last screenful of messages — which is usually what you're interested in (this is usually the first thing I type when I start mail).
h1 or h^ shows you the first screenful of messages.
|z or z-||If there is more than a screenful of messages, then z will show the next screenful, and z- will show the previous screenful.|
Mark message(s) for deletion.
d with no number marks the current message for deletion.
d with a number (or +, -, $, etc.) will mark the specified message(s) for deletion. To delete messages 1 to 3, you could do d 1-3, or d 1 2 3 (or d *, in this example where there are only 3 messages).
I said 'mark for deletion' instead of 'delete' because the changes you make are only saved when you type q.
|u||is 'undelete'. This just unmarks the message for deletion. You can do u followed by a number to undelete a specific message. But if you delete a message, and then quit with a q without having undeleted it, then that message really is gone.|
|q or x||q quits and saves your changes; x quits without saving your changes. If you quit with an x, then any messages you d'ed will not actually be deleted the next time you invoke mail — also the little N for unread will still be there even if you read the message, etc. It's as if you were never there. This is sometimes a quick and dirty way to recover if you've deleted the wrong message, etc. — or if you aren't sure what you've done and just want to bail out.|
|m||Start composing a message to a user or users, e.g. 'm fred terry sa2000'. Of course you can also send messages from the command line, rather than the mail prompt, using 'mail fred terry sa2000'.|
|r||is used to reply to message — e.g. if you want to tell Fred 'Get well soon' in my example above, then you could do r 2.|
is used to save a message to a file. For example, if you
want to save the 'Reminder' message above as 'reminder' in your
current directory, you could use 's reminder'. Or 's /tmp/foo'>
to save as /tmp/foo, etc.
If the specified file already exists, the message you save will be appended. So, this makes a mail folder. I find folders invaluable. I have a directory called /home/kerl/mail; in it are about a dozen folders. This helps me organize things that I want to save, but that I don't want to have to see cluttering up my in-box everytime I read my mail. I can read a folder with mail -f (folder name) at the csh prompt, or f (folder name) at the mail prompt.
A common sequence of keystrokes for me is: Read a message; type 's /home/kerl/mail/eng' (or whatever folder); then 'd.'. There is no command to *move* a message to a folder, as there is in the graphical mailtool. Rather, you copy a message to a folder, then delete from you in-box, as two separate steps.
|!||can be used to get a shell — but ^Z is just as useful, if not moreso, since ^Z gets you back to the shell you invoked mail from, not a new one.|
|=||just prints the current message number.|
|prints a summary of commands that you can use at the mail prompt. This is a handy reminder.|
|v||Puts the incoming message into vi; this may be a nicer way to read your mail than the PAGER (see below).|
Commands while composing a message
The commands used while composing a message (say you used m or r to get a message going) begin with a ~ at the beginning of a line. This is so that q doesn't always mean quit, etc.
The most useful ones are as follows:
Append the contents of message numbers <numlist>
indented by the value of the indentprefix variable
(see below), or TAB by default. This is nice when
you're replying to someone, so that they know which
message of theirs you're replying *to* — their own words
are right there.
A common scenario for me is, I read a message and I want to reply to it. So, I read the message. Then, I type r to reply; then ~m to read in the message I'm replying to; then ~v (see below) which throws me into vi. When I'm done vi'ing, I type :wq in vi, then finally . to send the message.
|Like ~m, but don't indent.|
|Display the contents of the message so far. Just shows it to you — doesn't affect the body of the message that goes out.|
|Read in the contents of <filename>|
|Set the Subject: line to the string specified by <subject> Comes in handy if you forgot, or changed your mind.|
|Set user addresses in <addrlist> to the To: list.|
|Set the lists for To:, Subject:, Cc: and Bcc:, all at once.|
Edit the message using an external editor (default is
vi). This is great when you're sending anything of any
length at all — it lets you move around. When you
quit out of vi, you can continue doing other things to
the message (i.e. type some more, or use more ~
commands), or finish off the message with a . .
Once you're in vi, you can use :r filename to include a file — perhaps a letter that you composed in vi earlier, some data or a configuration file you're sending someone, etc.
|Write the message to <filename>. Great for keeping a personal copy of an outgoing message for reference.|
|Quit, do not save letter. You can also use control-C twice.|
|End of input. Like . or control-D.|
|Print a list of ~ commands.|
|Quote a single tilde. Note that if you are rsh'ed to a host, rsh will 'eat' the first tilde, so you may need three of them.|
Any of the commands below (setting and unsetting variables) can be done at the mail prompt, lasting until that mail tool is quit, or you can place them in your ~/.mailrc, which is read when the mail tool starts up, so that the setting will always be in place (until you change it at the mail prompt).
set crt=10 set PAGER=more
then you can use 'more' to read your messages. The PAGER variable is the viewer to be used. It could be 'cat' (which it is by default unless set otherwise), or 'less', if you have it, etc. 'set PAGER=vi' doesn't seem to work too well. The crt variable is the number of lines longer than which a message must be for PAGER to be invoked. That is, if crt is 10, and your message is just 7 lines long, then the message will be simply catted out, instead of being run through more. If crt is 0 (or less), then every message will be run through PAGER.
in your .mailrc, and you have 30 messages, then you'll see just the first 10 when you invoke mail, and the next 10 when you type z.
If you don't want these to be created in the first place, use
set prompt="Mail call!!!> "
set askccIf dot is set with
then a single period at the beginning of a line can be used to finish a message. With
you'll have to control-D to finish.
If you do
then a control-D (the 'end-of-file' character) won't finish a message. Then only ~. will work. I don't like ~. because that also happens to mean 'exit' to rsh — and rsh gets the ~. before mail has a chance to see it.
set VISUAL=viwhich control which editor is invoked when you ~e or ~v, respectively.
set indentprefix="> "is probably the most common that people use.
set record=~/.recordWARNING! This file can get really big if you don't keep an eye on it.
I find my .record file invaluable to go back and read previous dialogues with my colleagues — to answer questions such as, What did I say? What did Sue say? When was that meeting again? Etc.
The alias command is useful when you constantly find yourself mailing to a group of people, or when someone has a long address.
Note that there is an NIS aliases file, which applies to everyone on your system. For example, at Emtek there are 'sunusers' and 'ibmusers' aliases that we use to mail customers in bulk.
But you can also define your own aliases. For example, if your fellow system administrators are Fred, Terry and Carol, you could put in your .mailrc
alias sa fred terry carol
and then you can just send mail to 'sa'.
My sister has a nasty e-mail address — 'email@example.com'. I got tired of typing this so I set up the alias
alias steph firstname.lastname@example.org
and now I can just mail her by her first name.
If you type 'alias' with no arguments at the mail prompt, you'll get a list of your current personal aliases.
Don't print the initial screenful of headers when the tool starts.
I always use this option, since I normally have several dozen messages in my in-box, and since the first few dozen usually are nothing new. I use the following sequence when reading my mail: Type 'mail -N' at the csh prompt; then 'h$' at the mail prompt to see the newest messages; then 'z-' as many times as necessary till I get to the first unread message.
|-s||Set the subject line when mailing to someone. Often useful if you have the message already written; e.g. 'mail -s "Meeting minutes" fred < ~sa2000/meeting-minutes'.|
|-f (folder name)||Read mail messages from the specified folder file, rather than reading your system in-box. Useful when you've moved messages to a folder, perhaps with s as described above.|