The major mode used in the mail buffer is Mail mode, which is much like Text mode except that various special commands are provided on the C-c prefix. These commands all have to do specifically with editing or sending the message. In addition, Mail mode defines the character % as a word separator; this is helpful for using the word commands to edit mail addresses.
Mail mode is normally used in buffers set up automatically by the mail command and related commands. However, you can also switch to Mail mode in a file-visiting buffer. That is a useful thing to do if you have saved draft message text in a file.
Mail mode has two commands for sending the message you have been editing:
Send the message, and leave the mail buffer selected (mail-send).
Send the message, and select some other buffer (mail-send-and-exit).
C-c C-s (mail-send) sends the message and marks the mail buffer unmodified, but leaves that buffer selected so that you can modify the message (perhaps with new recipients) and send it again. C-c C-c (mail-send-and-exit) sends and then deletes the window or switches to another buffer. It puts the mail buffer at the lowest priority for reselection by default, since you are finished with using it. This is the usual way to send the message.
In a file-visiting buffer, sending the message does not clear the modified flag, because only saving the file should do that. As a result, you don't get a warning if you try to send the same message twice.
When you send a message that contains non-ASCII characters, they need to be encoded with a coding system (Section 20.6). Usually the coding system is specified automatically by your chosen language environment (Section 20.3). You can explicitly specify the coding system for outgoing mail by setting the variable sendmail-coding-system (Section 20.7).
If the coding system thus determined does not handle the characters in a particular message, Emacs asks you to select the coding system to use, showing a list of possible coding systems.
Mail mode provides special commands to move to particular header fields and to complete addresses in headers.
Move to the To header field, creating one if there is none (mail-to).
Move to the Subject header field, creating one if there is none (mail-subject).
Move to the CC header field, creating one if there is none (mail-cc).
Move to the BCC header field, creating one if there is none (mail-bcc).
Move to the FCC header field, creating one if there is none (mail-fcc).
Complete a mailing address (mail-complete).
There are five commands to move point to particular header fields, all based on the prefix C-c C-f (C-f is for "field"). They are listed in the table above. If the field in question does not exist, these commands create one. We provide special motion commands for these particular fields because they are the fields users most often want to edit.
While editing a header field that contains mailing addresses, such as To:, CC: and BCC:, you can complete a mailing address by typing M-TAB (mail-complete). It inserts the full name corresponding to the address, if it can determine the full name. The variable mail-complete-style controls whether to insert the full name, and what style to use, as in mail-from-style (Section 28.2).
For completion purposes, the valid mailing addresses are taken to be the local users' names plus your personal mail aliases. You can specify additional sources of valid addresses; use the customization buffer to see the options for this.
If you type M-TAB in the body of the message, it invokes ispell-complete-word, as in Text mode.
Mail mode also has commands for yanking or citing all or part of a message that you are replying to. These commands are active only when you started sending a message using an Rmail command.
Yank the selected message from Rmail (mail-yank-original).
Yank the region from the Rmail buffer (mail-yank-region).
Fill each paragraph cited from another message (mail-fill-yanked-message).
When mail sending is invoked from the Rmail mail reader using an Rmail command, C-c C-y can be used inside the mail buffer to insert the text of the message you are replying to. Normally it indents each line of that message three spaces and eliminates most header fields. A numeric argument specifies the number of spaces to indent. An argument of just C-u says not to indent at all and not to eliminate anything. C-c C-y always uses the current message from the Rmail buffer, so you can insert several old messages by selecting one in Rmail, switching to *mail* and yanking it, then switching back to Rmail to select another.
You can specify the text for C-c C-y to insert at the beginning of each line: set mail-yank-prefix to the desired string. (A value of nil means to use indentation; this is the default.) However, C-u C-c C-y never adds anything at the beginning of the inserted lines, regardless of the value of mail-yank-prefix.
To yank just a part of an incoming message, set the region in Rmail to the part you want; then go to the *Mail* message and type C-c C-r (mail-yank-region). Each line that is copied is indented or prefixed according to mail-yank-prefix.
After using C-c C-y or C-c C-r, you can type C-c C-q (mail-fill-yanked-message) to fill the paragraphs of the yanked old message or messages. One use of C-c C-q fills all such paragraphs, each one individually. To fill a single paragraph of the quoted message, use M-q. If filling does not automatically handle the type of citation prefix you use, try setting the fill prefix explicitly. Section 23.5.
Move to the beginning of the message body text (mail-text).
Insert the file ~/.signature at the end of the message text (mail-signature).
Insert the contents of file at the end of the outgoing message (mail-attach-file).
Do spelling correction on the message text, but not on citations from other messages.
C-c C-t (mail-text) moves point to just after the header separator line--that is, to the beginning of the message body text.
C-c C-w (mail-signature) adds a standard piece of text at the end of the message to say more about who you are. The text comes from the file ~/.signature in your home directory. To insert your signature automatically, set the variable mail-signature to t; then starting a mail message automatically inserts the contents of your ~/.signature file. If you want to omit your signature from a particular message, delete it from the buffer before you send the message.
You can also set mail-signature to a string; then that string is inserted automatically as your signature when you start editing a message to send. If you set it to some other Lisp expression, the expression is evaluated each time, and its value (which should be a string) specifies the signature.
You can do spelling correction on the message text you have written with the command M-x ispell-message. If you have yanked an incoming message into the outgoing draft, this command skips what was yanked, but it checks the text that you yourself inserted. (It looks for indentation or mail-yank-prefix to distinguish the cited lines from your input.) Section 15.4.
To include a file in the outgoing message, you can use C-x i, the usual command to insert a file in the current buffer. But it is often more convenient to use a special command, C-c C-i (mail-attach-file). This command inserts the file contents at the end of the buffer, after your signature if any, with a delimiter line that includes the file name.
Turning on Mail mode (which C-x m does automatically) runs the normal hooks text-mode-hook and mail-mode-hook. Initializing a new outgoing message runs the normal hook mail-setup-hook; if you want to add special fields to your mail header or make other changes to the appearance of the mail buffer, use that hook. Section 32.2.3.
The main difference between these hooks is just when they are invoked. Whenever you type M-x mail, mail-mode-hook runs as soon as the *mail* buffer is created. Then the mail-setup function puts in the default contents of the buffer. After these default contents are inserted, mail-setup-hook runs.