message.el 292 KB
Newer Older
1
;;; message.el --- composing mail and news messages
2

3
;; Copyright (C) 1996-2011 Free Software Foundation, Inc.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
4

5
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
6 7 8 9
;; Keywords: mail, news

;; This file is part of GNU Emacs.

10
;; GNU Emacs is free software: you can redistribute it and/or modify
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
11
;; it under the terms of the GNU General Public License as published by
12 13
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
14 15 16

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
18 19 20
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
21
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
22 23 24 25 26 27 28 29 30

;;; Commentary:

;; This mode provides mail-sending facilities from within Emacs.  It
;; consists mainly of large chunks of code from the sendmail.el,
;; gnus-msg.el and rnewspost.el files.

;;; Code:

31
;; For Emacs <22.2 and XEmacs.
32 33
(eval-and-compile
  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
34
(eval-when-compile
Dan Nicolaescu's avatar
Dan Nicolaescu committed
35
  (require 'cl))
36

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
37
(require 'mailheader)
38
(require 'gmm-utils)
39 40 41 42
(require 'mail-utils)
;; Only for the trivial macros mail-header-from, mail-header-date
;; mail-header-references, mail-header-subject, mail-header-id
(eval-when-compile (require 'nnheader))
43 44 45
;; This is apparently necessary even though things are autoloaded.
;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
;; require mailabbrev here.
46
(if (featurep 'xemacs)
47 48
    (require 'mail-abbrevs)
  (require 'mailabbrev))
49 50
(require 'mail-parse)
(require 'mml)
51
(require 'rfc822)
52
(require 'format-spec)
53

54 55
(autoload 'mailclient-send-it "mailclient") ;; Emacs 22 or contrib/

Dan Nicolaescu's avatar
Dan Nicolaescu committed
56 57 58
(defvar gnus-message-group-art)
(defvar gnus-list-identifiers) ; gnus-sum is required where necessary
(defvar rmail-enable-mime-composing)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
59 60 61 62 63 64 65 66 67 68 69 70

(defgroup message '((user-mail-address custom-variable)
		    (user-full-name custom-variable))
  "Mail and news message composing."
  :link '(custom-manual "(message)Top")
  :group 'mail
  :group 'news)

(put 'user-mail-address 'custom-type 'string)
(put 'user-full-name 'custom-type 'string)

(defgroup message-various nil
71
  "Various Message Variables."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
72 73 74 75
  :link '(custom-manual "(message)Various Message Variables")
  :group 'message)

(defgroup message-buffers nil
76
  "Message Buffers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
77 78 79 80
  :link '(custom-manual "(message)Message Buffers")
  :group 'message)

(defgroup message-sending nil
81
  "Message Sending."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
82 83 84 85
  :link '(custom-manual "(message)Sending Variables")
  :group 'message)

(defgroup message-interface nil
86
  "Message Interface."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
87 88 89 90
  :link '(custom-manual "(message)Interface")
  :group 'message)

(defgroup message-forwarding nil
91
  "Message Forwarding."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
92 93 94 95
  :link '(custom-manual "(message)Forwarding")
  :group 'message-interface)

(defgroup message-insertion nil
96
  "Message Insertion."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
97 98 99 100
  :link '(custom-manual "(message)Insertion")
  :group 'message)

(defgroup message-headers nil
101
  "Message Headers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
102 103 104 105
  :link '(custom-manual "(message)Message Headers")
  :group 'message)

(defgroup message-news nil
106
  "Composing News Messages."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
107 108 109
  :group 'message)

(defgroup message-mail nil
110
  "Composing Mail Messages."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
  :group 'message)

(defgroup message-faces nil
  "Faces used for message composing."
  :group 'message
  :group 'faces)

(defcustom message-directory "~/Mail/"
  "*Directory from which all other mail file variables are derived."
  :group 'message-various
  :type 'directory)

(defcustom message-max-buffers 10
  "*How many buffers to keep before starting to kill them off."
  :group 'message-buffers
  :type 'integer)

(defcustom message-send-rename-function nil
  "Function called to rename the buffer after sending it."
  :group 'message-buffers
Dave Love's avatar
Dave Love committed
131
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
132 133 134 135 136 137 138 139 140 141

(defcustom message-fcc-handler-function 'message-output
  "*A function called to save outgoing articles.
This function will be called with the name of the file to store the
article in.  The default function is `message-output' which saves in Unix
mailbox format."
  :type '(radio (function-item message-output)
		(function :tag "Other"))
  :group 'message-sending)

142 143
(defcustom message-fcc-externalize-attachments nil
  "If non-nil, attachments are included as external parts in Fcc copies."
144
  :version "22.1"
145 146 147
  :type 'boolean
  :group 'message-sending)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
148
(defcustom message-courtesy-message
149
  "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
150 151 152 153 154
  "*This is inserted at the start of a mailed copy of a posted message.
If the string contains the format spec \"%s\", the Newsgroups
the article has been posted to will be inserted there.
If this variable is nil, no such courtesy message will be added."
  :group 'message-sending
155
  :type '(radio string (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
156

157 158
(defcustom message-ignored-bounced-headers
  "^\\(Received\\|Return-Path\\|Delivered-To\\):"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
159 160 161 162
  "*Regexp that matches headers to be removed in resent bounced mail."
  :group 'message-interface
  :type 'regexp)

163
(defcustom message-from-style mail-from-style
164
  "Specifies how \"From\" headers look.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
165

Dave Love's avatar
Dave Love committed
166
If nil, they contain just the return address like:
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
167 168 169 170 171 172 173 174
	king@grassland.com
If `parens', they look like:
	king@grassland.com (Elvis Parsley)
If `angles', they look like:
	Elvis Parsley <king@grassland.com>

Otherwise, most addresses look like `angles', but they look like
`parens' if `angles' would need quoting and `parens' would not."
175
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
176 177 178 179 180 181
  :type '(choice (const :tag "simple" nil)
		 (const parens)
		 (const angles)
		 (const default))
  :group 'message-headers)

182 183
(defcustom message-insert-canlock t
  "Whether to insert a Cancel-Lock header in news postings."
184
  :version "22.1"
185 186 187 188 189
  :group 'message-headers
  :type 'boolean)

(defcustom message-syntax-checks
  (if message-insert-canlock '((sender . disabled)) nil)
190
  ;; Guess this one shouldn't be easy to customize...
191
  "*Controls what syntax checks should not be performed on outgoing posts.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
192 193 194 195 196
To disable checking of long signatures, for instance, add
 `(signature . disabled)' to this list.

Don't touch this variable unless you really know what you're doing.

Miles Bader's avatar
Miles Bader committed
197 198
Checks include `approved', `bogus-recipient', `continuation-headers',
`control-chars', `empty', `existing-newsgroups', `from', `illegible-text',
Miles Bader's avatar
Miles Bader committed
199 200
`invisible-text', `long-header-lines', `long-lines', `message-id',
`multiple-headers', `new-text', `newsgroups', `quoting-style',
Miles Bader's avatar
Miles Bader committed
201
`repeated-newsgroups', `reply-to', `sender', `sendsys', `shoot',
Miles Bader's avatar
Miles Bader committed
202 203
`shorten-followup-to', `signature', `size', `subject', `subject-cmsg'
and `valid-newsgroups'."
204
  :group 'message-news
Dave Love's avatar
Dave Love committed
205
  :type '(repeat sexp))			; Fixme: improve this
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
206

207 208 209 210 211
(defcustom message-required-headers '((optional . References)
				      From)
  "*Headers to be generated or prompted for when sending a message.
Also see `message-required-news-headers' and
`message-required-mail-headers'."
212
  :version "22.1"
213 214 215 216 217
  :group 'message-news
  :group 'message-headers
  :link '(custom-manual "(message)Message Headers")
  :type '(repeat sexp))

218
(defcustom message-draft-headers '(References From Date)
219
  "*Headers to be generated when saving a draft message."
220
  :version "22.1"
221 222 223 224 225
  :group 'message-news
  :group 'message-headers
  :link '(custom-manual "(message)Message Headers")
  :type '(repeat sexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
226 227
(defcustom message-required-news-headers
  '(From Newsgroups Subject Date Message-ID
228
	 (optional . Organization)
229
	 (optional . User-Agent))
230
  "*Headers to be generated or prompted for when posting an article.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
231 232
RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
Message-ID.  Organization, Lines, In-Reply-To, Expires, and
Miles Bader's avatar
Miles Bader committed
233
User-Agent are optional.  If you don't want message to insert some
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
234 235 236
header, remove it from this list."
  :group 'message-news
  :group 'message-headers
237
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
238 239 240
  :type '(repeat sexp))

(defcustom message-required-mail-headers
241
  '(From Subject Date (optional . In-Reply-To) Message-ID
242
	 (optional . User-Agent))
243
  "*Headers to be generated or prompted for when mailing a message.
244 245
It is recommended that From, Date, To, Subject and Message-ID be
included.  Organization and User-Agent are optional."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
246 247
  :group 'message-mail
  :group 'message-headers
248
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
249 250
  :type '(repeat sexp))

251 252 253
(defcustom message-prune-recipient-rules nil
  "Rules for how to prune the list of recipients when doing wide replies.
This is a list of regexps and regexp matches."
254
  :version "24.1"
255 256 257 258 259
  :group 'message-mail
  :group 'message-headers
  :link '(custom-manual "(message)Wide Reply")
  :type '(repeat regexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
260 261 262
(defcustom message-deletable-headers '(Message-ID Date Lines)
  "Headers to be deleted if they already exist and were generated by message previously."
  :group 'message-headers
263
  :link '(custom-manual "(message)Message Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
264 265 266
  :type 'sexp)

(defcustom message-ignored-news-headers
267
  "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
268 269 270
  "*Regexp of headers to be removed unconditionally before posting."
  :group 'message-news
  :group 'message-headers
271
  :link '(custom-manual "(message)Message Headers")
272 273 274 275 276 277
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
278

279
(defcustom message-ignored-mail-headers
280
  "^\\([GF]cc\\|Resent-Fcc\\|Xref\\|X-Draft-From\\|X-Gnus-Agent-Meta-Information\\):"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
281 282 283
  "*Regexp of headers to be removed unconditionally before mailing."
  :group 'message-mail
  :group 'message-headers
284
  :link '(custom-manual "(message)Mail Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
285 286
  :type 'regexp)

287
(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-ID:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:\\|^Approved:\\|^Injection-Date:\\|^Injection-Info:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
288 289 290 291
  "*Header lines matching this regexp will be deleted before posting.
It's best to delete old Path and Date headers before posting to avoid
any confusion."
  :group 'message-interface
292
  :link '(custom-manual "(message)Superseding")
293 294 295 296 297 298
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
299

300 301
(defcustom message-subject-re-regexp
  "^[ \t]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ \t]*\\)*[ \t]*"
302 303
  "*Regexp matching \"Re: \" in the subject line."
  :group 'message-various
304
  :link '(custom-manual "(message)Message Headers")
305 306
  :type 'regexp)

307 308
;;; Start of variables adopted from `message-utils.el'.

309
(defcustom message-subject-trailing-was-query t
310 311 312 313 314 315 316
  "*What to do with trailing \"(was: <old subject>)\" in subject lines.
If nil, leave the subject unchanged.  If it is the symbol `ask', query
the user what do do.  In this case, the subject is matched against
`message-subject-trailing-was-ask-regexp'.  If
`message-subject-trailing-was-query' is t, always strip the trailing
old subject.  In this case, `message-subject-trailing-was-regexp' is
used."
317
  :version "24.1"
318 319
  :type '(choice (const :tag "never" nil)
		 (const :tag "always strip" t)
320
		 (const ask))
321 322 323 324
  :link '(custom-manual "(message)Message Headers")
  :group 'message-various)

(defcustom message-subject-trailing-was-ask-regexp
325
  "[ \t]*\\([[(]+[Ww][Aa][Ss]:?[ \t]*.*[])]+\\)"
326 327 328 329 330 331 332 333
  "*Regexp matching \"(was: <old subject>)\" in the subject line.

The function `message-strip-subject-trailing-was' uses this regexp if
`message-subject-trailing-was-query' is set to the symbol `ask'.  If
the variable is t instead of `ask', use
`message-subject-trailing-was-regexp' instead.

It is okay to create some false positives here, as the user is asked."
334
  :version "22.1"
335 336 337 338 339
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

(defcustom message-subject-trailing-was-regexp
340
  "[ \t]*\\((*[Ww][Aa][Ss]:[ \t]*.*)\\)"
341 342 343 344 345 346
  "*Regexp matching \"(was: <old subject>)\" in the subject line.

If `message-subject-trailing-was-query' is set to t, the subject is
matched against `message-subject-trailing-was-regexp' in
`message-strip-subject-trailing-was'.  You should use a regexp creating very
few false positives here."
347
  :version "22.1"
348 349 350 351 352 353 354
  :group 'message-various
  :link '(custom-manual "(message)Message Headers")
  :type 'regexp)

;;; marking inserted text

(defcustom message-mark-insert-begin
355
  "--8<---------------cut here---------------start------------->8---\n"
356
  "How to mark the beginning of some inserted text."
357
  :version "22.1"
358 359 360 361 362
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-various)

(defcustom message-mark-insert-end
363
  "--8<---------------cut here---------------end--------------->8---\n"
364
  "How to mark the end of some inserted text."
365
  :version "22.1"
366 367 368 369
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-various)

370
(defcustom message-archive-header "X-No-Archive: Yes\n"
371 372
  "Header to insert when you don't want your article to be archived.
Archives \(such as groups.google.com\) respect this header."
373
  :version "22.1"
374 375 376 377 378 379 380 381
  :type 'string
  :link '(custom-manual "(message)Header Commands")
  :group 'message-various)

(defcustom message-archive-note
  "X-No-Archive: Yes - save http://groups.google.com/"
  "Note to insert why you wouldn't want this posting archived.
If nil, don't insert any text in the body."
382
  :version "22.1"
383
  :type '(radio string (const nil))
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
  :link '(custom-manual "(message)Header Commands")
  :group 'message-various)

;;; Crossposts and Followups
;; inspired by JoH-followup-to by Jochem Huhman <joh  at gmx.de>
;; new suggestions by R. Weikusat <rw at another.de>

(defvar message-cross-post-old-target nil
  "Old target for cross-posts or follow-ups.")
(make-variable-buffer-local 'message-cross-post-old-target)

(defcustom message-cross-post-default t
  "When non-nil `message-cross-post-followup-to' will perform a crosspost.
If nil, `message-cross-post-followup-to' will only do a followup.  Note that
you can explicitly override this setting by calling
`message-cross-post-followup-to' with a prefix."
400
  :version "22.1"
401 402 403
  :type 'boolean
  :group 'message-various)

404
(defcustom message-cross-post-note "Crosspost & Followup-To: "
405
  "Note to insert before signature to notify of cross-post and follow-up."
406
  :version "22.1"
407 408 409
  :type 'string
  :group 'message-various)

410
(defcustom message-followup-to-note "Followup-To: "
411
  "Note to insert before signature to notify of follow-up only."
412
  :version "22.1"
413 414 415
  :type 'string
  :group 'message-various)

416
(defcustom message-cross-post-note-function 'message-cross-post-insert-note
417 418 419 420
  "Function to use to insert note about Crosspost or Followup-To.
The function will be called with four arguments.  The function should not only
insert a note, but also ensure old notes are deleted.  See the documentation
for `message-cross-post-insert-note'."
421
  :version "22.1"
422 423 424 425 426
  :type 'function
  :group 'message-various)

;;; End of variables adopted from `message-utils.el'.

Miles Bader's avatar
Miles Bader committed
427 428 429 430 431 432 433 434 435 436
(defcustom message-signature-separator "^-- $"
  "Regexp matching the signature separator.
This variable is used to strip off the signature from quoted text
when `message-cite-function' is
`message-cite-original-without-signature'.  Most useful values
are \"^-- $\" (strict) and \"^-- *$\" (loose; allow missing
whitespace)."
  :type '(choice (const :tag "strict" "^-- $")
		 (const :tag "loose" "^-- *$")
		 regexp)
Miles Bader's avatar
Miles Bader committed
437
  :version "22.3" ;; Gnus 5.10.12 (changed default)
438
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
439 440
  :group 'message-various)

441
(defcustom message-elide-ellipsis "\n[...]\n\n"
442 443 444 445
  "*The string which is inserted for elided text.
This is a format-spec string, and you can use %l to say how many
lines were removed, and %c to say how many characters were
removed."
446
  :type 'string
447
  :link '(custom-manual "(message)Various Commands")
448
  :group 'message-various)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
449

450
(defcustom message-interactive mail-interactive
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
451
  "Non-nil means when sending a message wait for and display errors.
Juanma Barranquero's avatar
Juanma Barranquero committed
452
A value of nil means let mailer mail back a message to report errors."
453
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
454 455
  :group 'message-sending
  :group 'message-mail
456
  :link '(custom-manual "(message)Sending Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
457 458
  :type 'boolean)

Miles Bader's avatar
Miles Bader committed
459
(defcustom message-confirm-send nil
Miles Bader's avatar
Miles Bader committed
460
  "When non-nil, ask for confirmation when sending a message."
Miles Bader's avatar
Miles Bader committed
461 462
  :group 'message-sending
  :group 'message-mail
Miles Bader's avatar
Miles Bader committed
463
  :version "23.1" ;; No Gnus
Miles Bader's avatar
Miles Bader committed
464 465 466
  :link '(custom-manual "(message)Sending Variables")
  :type 'boolean)

467
(defcustom message-generate-new-buffers 'unsent
Miles Bader's avatar
Miles Bader committed
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
  "*Say whether to create a new message buffer to compose a message.
Valid values include:

nil
  Generate the buffer name in the Message way (e.g., *mail*, *news*,
  *mail to whom*, *news on group*, etc.) and continue editing in the
  existing buffer of that name.  If there is no such buffer, it will
  be newly created.

`unique' or t
  Create the new buffer with the name generated in the Message way.

`unsent'
  Similar to `unique' but the buffer name begins with \"*unsent \".

`standard'
  Similar to nil but the buffer name is simpler like *mail message*.

function
  If this is a function, call that function with three parameters:
  The type, the To address and the group name (any of these may be nil).
  The function should return the new buffer name."
490
  :version "24.1"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
491
  :group 'message-buffers
492
  :link '(custom-manual "(message)Message Buffers")
Miles Bader's avatar
Miles Bader committed
493 494 495 496 497 498
  :type '(choice (const nil)
		 (sexp :tag "unique" :format "unique\n" :value unique
		       :match (lambda (widget value) (memq value '(unique t))))
		 (const unsent)
		 (const standard)
		 (function :format "\n    %{%t%}: %v")))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
499 500 501 502

(defcustom message-kill-buffer-on-exit nil
  "*Non-nil means that the message buffer will be killed after sending a message."
  :group 'message-buffers
503
  :link '(custom-manual "(message)Message Buffers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
504 505
  :type 'boolean)

506 507 508
(defcustom message-kill-buffer-query t
  "*Non-nil means that killing a modified message buffer has to be confirmed.
This is used by `message-kill-buffer'."
509
  :version "23.1" ;; No Gnus
510 511 512
  :group 'message-buffers
  :type 'boolean)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
513
(defcustom message-user-organization
514 515
  (or (getenv "ORGANIZATION") t)
  "String to be used as an Organization header.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
516 517 518 519 520
If t, use `message-user-organization-file'."
  :group 'message-headers
  :type '(choice string
		 (const :tag "consult file" t)))

521 522 523 524 525 526 527 528
(defcustom message-user-organization-file
  (let (orgfile)
    (dolist (f (list "/etc/organization"
		     "/etc/news/organization"
		     "/usr/lib/news/organization"))
      (when (file-readable-p f)
	(setq orgfile f)))
    orgfile)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
529 530
  "*Local news organization file."
  :type 'file
531
  :link '(custom-manual "(message)News Headers")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
532 533
  :group 'message-headers)

534
(defcustom message-make-forward-subject-function
535
  #'message-forward-subject-name-subject
Dave Love's avatar
Dave Love committed
536
  "*List of functions called to generate subject headers for forwarded messages.
537 538 539 540 541
The subject generated by the previous function is passed into each
successive function.

The provided functions are:

542 543 544 545 546
* `message-forward-subject-author-subject' Source of article (author or
      newsgroup), in brackets followed by the subject
* `message-forward-subject-name-subject' Source of article (name of author
      or newsgroup), in brackets followed by the subject
* `message-forward-subject-fwd' Subject of article with 'Fwd:' prepended
547
      to it."
548
  :group 'message-forwarding
549
  :link '(custom-manual "(message)Forwarding")
550
  :type '(radio (function-item message-forward-subject-author-subject)
Dave Love's avatar
Dave Love committed
551
		(function-item message-forward-subject-fwd)
552
		(function-item message-forward-subject-name-subject)
Dave Love's avatar
Dave Love committed
553
		(repeat :tag "List of functions" function)))
554 555

(defcustom message-forward-as-mime t
556 557
  "*Non-nil means forward messages as an inline/rfc822 MIME section.
Otherwise, directly inline the old message in the forwarded message."
558
  :version "21.1"
559
  :group 'message-forwarding
560
  :link '(custom-manual "(message)Forwarding")
561 562
  :type 'boolean)

563 564 565 566 567 568 569 570
(defcustom message-forward-show-mml 'best
  "*Non-nil means show forwarded messages as MML (decoded from MIME).
Otherwise, forwarded messages are unchanged.
Can also be the symbol `best' to indicate that MML should be
used, except when it is a bad idea to use MML.  One example where
it is a bad idea is when forwarding a signed or encrypted
message, because converting MIME to MML would invalidate the
digital signature."
571
  :version "21.1"
572
  :group 'message-forwarding
573 574 575
  :type '(choice (const :tag "use MML" t)
		 (const :tag "don't use MML " nil)
		 (const :tag "use MML when appropriate" best)))
576 577

(defcustom message-forward-before-signature t
578
  "*Non-nil means put forwarded message before signature, else after."
579 580
  :group 'message-forwarding
  :type 'boolean)
581 582

(defcustom message-wash-forwarded-subjects nil
583 584
  "*Non-nil means try to remove as much cruft as possible from the subject.
Done before generating the new subject of a forward."
585
  :group 'message-forwarding
586
  :link '(custom-manual "(message)Forwarding")
587 588
  :type 'boolean)

589 590 591 592 593 594 595
(defcustom message-ignored-resent-headers
  ;; `Delivered-To' needs to be removed because some mailers use it to
  ;; detect loops, so if you resend a message to an address that ultimately
  ;; comes back to you (e.g. a mailing-list to which you subscribe, in which
  ;; case you may be removed from the list on the grounds that mail to you
  ;; bounced with a "mailing loop" error).
  "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
596 597
  "*All headers that match this regexp will be deleted when resending a message."
  :group 'message-interface
598
  :link '(custom-manual "(message)Resending")
599 600 601 602 603 604
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
		 regexp))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
605

606 607
(defcustom message-forward-ignored-headers "^Content-Transfer-Encoding:\\|^X-Gnus"
  "*All headers that match this regexp will be deleted when forwarding a message."
608
  :version "21.1"
609
  :group 'message-forwarding
610 611 612 613 614
  :type '(repeat :value-to-internal (lambda (widget value)
				      (custom-split-regexp-maybe value))
		 :match (lambda (widget value)
			  (or (stringp value)
			      (widget-editable-list-match widget value)))
615 616
		 regexp))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
617 618 619
(defcustom message-ignored-cited-headers "."
  "*Delete these headers from the messages you yank."
  :group 'message-insertion
620 621 622
  :link '(custom-manual "(message)Insertion Variables")
  :type 'regexp)

623
(defcustom message-cite-prefix-regexp mail-citation-prefix-regexp
624
  "*Regexp matching the longest possible citation prefix on a line."
625
  :version "24.1"
626 627
  :group 'message-insertion
  :link '(custom-manual "(message)Insertion Variables")
628 629 630 631 632 633 634
  :type 'regexp
  :set (lambda (symbol value)
	 (prog1
	     (custom-set-default symbol value)
	   (if (boundp 'gnus-message-cite-prefix-regexp)
	       (setq gnus-message-cite-prefix-regexp
		     (concat "^\\(?:" value "\\)"))))))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
635

636
(defcustom message-cancel-message "I am canceling my own article.\n"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
637 638
  "Message to be inserted in the cancel message."
  :group 'message-interface
639
  :link '(custom-manual "(message)Canceling News")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
640 641
  :type 'string)

642 643
(defun message-send-mail-function ()
  "Return suitable value for the variable `message-send-mail-function'."
644 645 646
  (cond ((and (require 'sendmail)
	      (boundp 'sendmail-program)
	      sendmail-program
647
	      (executable-find sendmail-program))
648
	 'message-send-mail-with-sendmail)
649
	((and (locate-library "smtpmail")
650
	      (boundp 'smtpmail-default-smtp-server)
651 652 653
	      smtpmail-default-smtp-server)
	 'message-smtpmail-send-it)
	((locate-library "mailclient")
654 655
	 'message-send-mail-with-mailclient)
	(t
656
	 (error "Don't know how to send mail.  Please customize `message-send-mail-function'"))))
657

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
658
;; Useful to set in site-init.el
Glenn Morris's avatar
Glenn Morris committed
659 660 661
(defcustom message-send-mail-function
  (cond ((eq send-mail-function 'smtpmail-send-it) 'message-smtpmail-send-it)
	((eq send-mail-function 'feedmail-send-it) 'feedmail-send-it)
662
	((eq send-mail-function 'sendmail-query-once) 'sendmail-query-once)
Glenn Morris's avatar
Glenn Morris committed
663 664 665
	((eq send-mail-function 'mailclient-send-it)
	 'message-send-mail-with-mailclient)
	(t (message-send-mail-function)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
666 667 668 669
  "Function to call to send the current buffer as mail.
The headers should be delimited by a line whose contents match the
variable `mail-header-separator'.

670
Valid values include `message-send-mail-with-sendmail'
Dave Love's avatar
Dave Love committed
671
`message-send-mail-with-mh', `message-send-mail-with-qmail',
672 673
`message-smtpmail-send-it', `smtpmail-send-it',
`feedmail-send-it' and `message-send-mail-with-mailclient'.  The
Miles Bader's avatar
Miles Bader committed
674 675
default is system dependent and determined by the function
`message-send-mail-function'.
Dave Love's avatar
Dave Love committed
676 677

See also `send-mail-function'."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
678 679 680
  :type '(radio (function-item message-send-mail-with-sendmail)
		(function-item message-send-mail-with-mh)
		(function-item message-send-mail-with-qmail)
681
		(function-item message-smtpmail-send-it)
682
		(function-item smtpmail-send-it)
Dave Love's avatar
Dave Love committed
683
		(function-item feedmail-send-it)
684 685 686
		(function-item message-send-mail-with-mailclient
			       :tag "Use Mailclient package")
 		(function :tag "Other"))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
687
  :group 'message-sending
Glenn Morris's avatar
Glenn Morris committed
688
  :version "23.2"
689
  :initialize 'custom-initialize-default
690
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
691 692 693 694 695 696 697 698
  :group 'message-mail)

(defcustom message-send-news-function 'message-send-news
  "Function to call to send the current buffer as news.
The headers should be delimited by a line whose contents match the
variable `mail-header-separator'."
  :group 'message-sending
  :group 'message-news
699
  :link '(custom-manual "(message)News Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
700 701 702
  :type 'function)

(defcustom message-reply-to-function nil
Dave Love's avatar
Dave Love committed
703
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
704 705 706
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
707
  :link '(custom-manual "(message)Reply")
Dave Love's avatar
Dave Love committed
708
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
709 710

(defcustom message-wide-reply-to-function nil
Dave Love's avatar
Dave Love committed
711
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
712 713 714
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
715
  :link '(custom-manual "(message)Wide Reply")
Dave Love's avatar
Dave Love committed
716
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
717 718

(defcustom message-followup-to-function nil
Dave Love's avatar
Dave Love committed
719
  "If non-nil, function that should return a list of headers.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
720 721 722
This function should pick out addresses from the To, Cc, and From headers
and respond with new To and Cc headers."
  :group 'message-interface
723
  :link '(custom-manual "(message)Followup")
Dave Love's avatar
Dave Love committed
724
  :type '(choice function (const nil)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
725

726 727 728 729 730 731
(defcustom message-extra-wide-headers nil
  "If non-nil, a list of additional address headers.
These are used when composing a wide reply."
  :group 'message-sending
  :type '(repeat string))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
732 733 734 735 736 737 738
(defcustom message-use-followup-to 'ask
  "*Specifies what to do with Followup-To header.
If nil, always ignore the header.  If it is t, use its value, but
query before using the \"poster\" value.  If it is the symbol `ask',
always query the user whether to use the value.  If it is the symbol
`use', always use the value."
  :group 'message-interface
739
  :link '(custom-manual "(message)Followup")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
740
  :type '(choice (const :tag "ignore" nil)
741
		 (const :tag "use & query" t)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
742 743 744
		 (const use)
		 (const ask)))

745 746 747 748 749
(defcustom message-use-mail-followup-to 'use
  "*Specifies what to do with Mail-Followup-To header.
If nil, always ignore the header.  If it is the symbol `ask', always
query the user whether to use the value.  If it is the symbol `use',
always use the value."
750
  :version "22.1"
751 752 753 754 755 756 757 758 759 760 761 762 763
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(choice (const :tag "ignore" nil)
		 (const use)
		 (const ask)))

(defcustom message-subscribed-address-functions nil
  "*Specifies functions for determining list subscription.
If nil, do not attempt to determine list subscription with functions.
If non-nil, this variable contains a list of functions which return
regular expressions to match lists.  These functions can be used in
conjunction with `message-subscribed-regexps' and
`message-subscribed-addresses'."
764
  :version "22.1"
765 766 767 768 769 770 771 772
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat sexp))

(defcustom message-subscribed-address-file nil
  "*A file containing addresses the user is subscribed to.
If nil, do not look at any files to determine list subscriptions.  If
non-nil, each line of this file should be a mailing list address."
773
  :version "22.1"
774 775
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
776
  :type '(radio file (const nil)))
777 778 779 780 781 782

(defcustom message-subscribed-addresses nil
  "*Specifies a list of addresses the user is subscribed to.
If nil, do not use any predefined list subscriptions.  This list of
addresses can be used in conjunction with
`message-subscribed-address-functions' and `message-subscribed-regexps'."
783
  :version "22.1"
784 785 786 787 788 789 790 791 792
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat string))

(defcustom message-subscribed-regexps nil
  "*Specifies a list of addresses the user is subscribed to.
If nil, do not use any predefined list subscriptions.  This list of
regular expressions can be used in conjunction with
`message-subscribed-address-functions' and `message-subscribed-addresses'."
793
  :version "22.1"
794 795 796 797 798 799 800 801 802
  :group 'message-interface
  :link '(custom-manual "(message)Mailing Lists")
  :type '(repeat regexp))

(defcustom message-allow-no-recipients 'ask
  "Specifies what to do when there are no recipients other than Gcc/Fcc.
If it is the symbol `always', the posting is allowed.  If it is the
symbol `never', the posting is not allowed.  If it is the symbol
`ask', you are prompted."
803
  :version "22.1"
804 805 806 807 808 809
  :group 'message-interface
  :link '(custom-manual "(message)Message Headers")
  :type '(choice (const always)
		 (const never)
		 (const ask)))

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
810
(defcustom message-sendmail-f-is-evil nil
Dave Love's avatar
Dave Love committed
811
  "*Non-nil means don't add \"-f username\" to the sendmail command line.
812
Doing so would be even more evil than leaving it out."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
813
  :group 'message-sending
814
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
815 816
  :type 'boolean)

817
(defcustom message-sendmail-envelope-from
818
  ;; `mail-envelope-from' is unavailable unless sendmail.el is loaded.
819
  (if (boundp 'mail-envelope-from) mail-envelope-from)
820 821 822
  "*Envelope-from when sending mail with sendmail.
If this is nil, use `user-mail-address'.  If it is the symbol
`header', use the From: header of the message."
823
  :version "23.2"
824 825 826 827 828 829
  :type '(choice (string :tag "From name")
		 (const :tag "Use From: header from message" header)
		 (const :tag "Use `user-mail-address'" nil))
  :link '(custom-manual "(message)Mail Variables")
  :group 'message-sending)

830 831 832
(defcustom message-sendmail-extra-arguments nil
  "Additional arguments to `sendmail-program'."
  ;; E.g. '("-a" "account") for msmtp
833
  :version "23.1" ;; No Gnus
834 835 836 837
  :type '(repeat string)
  ;; :link '(custom-manual "(message)Mail Variables")
  :group 'message-sending)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
838 839 840 841
;; qmail-related stuff
(defcustom message-qmail-inject-program "/var/qmail/bin/qmail-inject"
  "Location of the qmail-inject program."
  :group 'message-sending
842
  :link '(custom-manual "(message)Mail Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
843 844 845 846
  :type 'file)

(defcustom message-qmail-inject-args nil
  "Arguments passed to qmail-inject programs.
Juanma Barranquero's avatar
Juanma Barranquero committed
847 848
This should be a list of strings, one string for each argument.
It may also be a function.
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
849 850 851 852 853

For e.g., if you wish to set the envelope sender address so that bounces
go to the right place or to deal with listserv's usage of that address, you
might set this variable to '(\"-f\" \"you@some.where\")."
  :group 'message-sending
854 855 856
  :link '(custom-manual "(message)Mail Variables")
  :type '(choice (function)
		 (repeat string)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
857

Dan Nicolaescu's avatar
Dan Nicolaescu committed
858 859
(defvar gnus-post-method)
(defvar gnus-select-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
860 861
(defcustom message-post-method
  (cond ((and (boundp 'gnus-post-method)
862
	      (listp gnus-post-method)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
863 864 865 866 867
	      gnus-post-method)
	 gnus-post-method)
	((boundp 'gnus-select-method)
	 gnus-select-method)
	(t '(nnspool "")))
868 869 870
  "*Method used to post news.
Note that when posting from inside Gnus, for instance, this
variable isn't used."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
871 872 873 874 875 876
  :group 'message-news
  :group 'message-sending
  ;; This should be the `gnus-select-method' widget, but that might
  ;; create a dependence to `gnus.el'.
  :type 'sexp)

877
(defcustom message-generate-headers-first nil
878
  "Which headers should be generated before starting to compose a message.
879
If t, generate all required headers.  This can also be a list of headers to
880 881 882 883 884 885
generate.  The variables `message-required-news-headers' and
`message-required-mail-headers' specify which headers to generate.

Note that the variable `message-deletable-headers' specifies headers which
are to be deleted and then re-generated before sending, so this variable
will not have a visible effect for those headers."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
886
  :group 'message-headers
887 888
  :link '(custom-manual "(message)Message Headers")
  :type '(choice (const :tag "None" nil)
889 890 891 892 893 894 895 896 897 898 899
		 (const :tag "All" t)
		 (repeat (sexp :tag "Header"))))

(defcustom message-fill-column 72
  "Column beyond which automatic line-wrapping should happen.
Local value for message buffers.  If non-nil, also turn on
auto-fill in message buffers."
  :group 'message-various
  ;; :link '(custom-manual "(message)Message Headers")
  :type '(choice (const :tag "Don't turn on auto fill" nil)
		 (integer)))
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
900

901 902 903 904 905 906
(defcustom message-setup-hook nil
  "Normal hook, run each time a new outgoing message is initialized.
The function `message-setup' runs this hook."
  :group 'message-various
  :link '(custom-manual "(message)Various Message Variables")
  :type 'hook)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
907

908
(defcustom message-cancel-hook nil
Paul Eggert's avatar
Paul Eggert committed
909
  "Hook run when canceling articles."
910
  :group 'message-various
911
  :link '(custom-manual "(message)Various Message Variables")
912 913
  :type 'hook)

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
914 915 916 917 918
(defcustom message-signature-setup-hook nil
  "Normal hook, run each time a new outgoing message is initialized.
It is run after the headers have been inserted and before
the signature is inserted."
  :group 'message-various
919
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
920 921 922 923 924 925 926 927 928 929 930 931 932
  :type 'hook)

(defcustom message-mode-hook nil
  "Hook run in message mode buffers."
  :group 'message-various
  :type 'hook)

(defcustom message-header-hook nil
  "Hook run in a message mode buffer narrowed to the headers."
  :group 'message-various
  :type 'hook)

(defcustom message-header-setup-hook nil
933
  "Hook called narrowed to the headers when setting up a message buffer."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
934
  :group 'message-various
935
  :link '(custom-manual "(message)Various Message Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
936 937
  :type 'hook)

938 939 940 941
(defcustom message-minibuffer-local-map
  (let ((map (make-sparse-keymap 'message-minibuffer-local-map)))
    (set-keymap-parent map minibuffer-local-map)
    map)
942
  "Keymap for `message-read-from-minibuffer'."
943 944
  :version "22.1"
  :group 'message-various)
945

Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
946
(defcustom message-citation-line-function 'message-insert-citation-line
947 948
  "*Function called to insert the \"Whomever writes:\" line.

949
Predefined functions include `message-insert-citation-line' and
Miles Bader's avatar
Miles Bader committed
950
`message-insert-formatted-citation-line' (see the variable
951 952
`message-citation-line-format').

953 954 955 956
Note that Gnus provides a feature where the reader can click on
`writes:' to hide the cited text.  If you change this line too much,
people who read your message will have to change their Gnus
configuration.  See the variable `gnus-cite-attribution-suffix'."
957 958
  :type '(choice
	  (function-item :tag "plain" message-insert-citation-line)
Miles Bader's avatar
Miles Bader committed
959
	  (function-item :tag "formatted" message-insert-formatted-citation-line)
960
	  (function :tag "Other"))
961
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
962 963
  :group 'message-insertion)

964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
(defcustom message-citation-line-format "On %a, %b %d %Y, %N wrote:\n"
  "Format of the \"Whomever writes:\" line.

The string is formatted using `format-spec'.  The following
constructs are replaced:

  %f   The full From, e.g. \"John Doe <john.doe@example.invalid>\".
  %n   The mail address, e.g. \"john.doe@example.invalid\".
  %N   The real name if present, e.g.: \"John Doe\", else fall
       back to the mail address.
  %F   The first name if present, e.g.: \"John\".
  %L   The last name if present, e.g.: \"Doe\".

All other format specifiers are passed to `format-time-string'
which is called using the date from the article your replying to.
Extracting the first (%F) and last name (%L) is done
heuristically, so you should always check it yourself.

Please also read the note in the documentation of
`message-citation-line-function'."
  :type '(choice (const :tag "Plain" "%f writes:")
		 (const :tag "Include date" "On %a, %b %d %Y, %n wrote:")
		 string)
  :link '(custom-manual "(message)Insertion Variables")
988
  :version "23.1" ;; No Gnus
989 990
  :group 'message-insertion)

991
(defcustom message-yank-prefix mail-yank-prefix
992 993
  "*Prefix inserted on the lines of yanked messages.
Fix `message-cite-prefix-regexp' if it is set to an abnormal value.
994
See also `message-yank-cited-prefix' and `message-yank-empty-prefix'."
995
  :version "23.2"
996 997 998 999 1000
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-insertion)

(defcustom message-yank-cited-prefix ">"
1001
  "*Prefix inserted on cited lines of yanked messages.
1002
Fix `message-cite-prefix-regexp' if it is set to an abnormal value.
1003 1004 1005 1006 1007 1008 1009 1010 1011
See also `message-yank-prefix' and `message-yank-empty-prefix'."
  :version "22.1"
  :type 'string
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-insertion)

(defcustom message-yank-empty-prefix ">"
  "*Prefix inserted on empty lines of yanked messages.
See also `message-yank-prefix' and `message-yank-cited-prefix'."
1012
  :version "22.1"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1013
  :type 'string
1014
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1015 1016
  :group 'message-insertion)

1017
(defcustom message-indentation-spaces mail-indentation-spaces
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1018 1019
  "*Number of spaces to insert at the beginning of each cited line.
Used by `message-yank-original' via `message-yank-cite'."
1020
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1021
  :group 'message-insertion
1022
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1023 1024
  :type 'integer)

Miles Bader's avatar
Miles Bader committed
1025
(defcustom message-cite-function 'message-cite-original-without-signature
1026 1027 1028
  "*Function for citing an original message.
Predefined functions include `message-cite-original' and
`message-cite-original-without-signature'.
1029
Note that these functions use `mail-citation-hook' if that is non-nil."
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1030
  :type '(radio (function-item message-cite-original)
1031
		(function-item message-cite-original-without-signature)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1032 1033
		(function-item sc-cite-original)
		(function :tag "Other"))
1034
  :link '(custom-manual "(message)Insertion Variables")
Miles Bader's avatar
Miles Bader committed
1035
  :version "22.3" ;; Gnus 5.10.12 (changed default)
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1036 1037 1038 1039 1040 1041 1042 1043
  :group 'message-insertion)

(defcustom message-indent-citation-function 'message-indent-citation
  "*Function for modifying a citation just inserted in the mail buffer.
This can also be a list of functions.  Each function can find the
citation between (point) and (mark t).  And each function should leave
point and mark around the citation text as modified."
  :type 'function
1044
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1045 1046
  :group 'message-insertion)

1047
(defcustom message-signature mail-signature
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1048 1049 1050 1051
  "*String to be inserted at the end of the message buffer.
If t, the `message-signature-file' file will be inserted instead.
If a function, the result from the function will be used instead.
If a form, the result from the form will be used instead."
1052
  :version "23.2"
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1053
  :type 'sexp
1054
  :link '(custom-manual "(message)Insertion Variables")
Lars Magne Ingebrigtsen's avatar
Lars Magne Ingebrigtsen committed
1055 1056
  :group 'message-insertion)

1057
(defcustom message-signature-file mail-signature-file
1058 1059
  "*Name of file containing the text inserted at end of message buffer.
Ignored if the named file doesn't exist.
1060 1061 1062
If nil, don't insert a signature.
If a path is specified, the value of `message-signature-directory' is ignored,
even if set."
1063
  :version "23.2"
1064
  :type '(choice file (const :tags "None" nil))
1065 1066 1067
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-insertion)

1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
(defcustom message-signature-directory nil
  "*Name of directory containing signature files.
Comes in handy if you have many such files, handled via posting styles for
instance.
If nil, `message-signature-file' is expected to specify the directory if
needed."
  :type '(choice string (const :tags "None" nil))
  :link '(custom-manual "(message)Insertion Variables")
  :group 'message-insertion)

1078 1079
(defcustom message-signature-insert-empty-line t
  "*If non-nil, insert an empty line before the signature separator."
1080
  :version "22.1"
1081 1082
  :type 'boolean
  :link '(custom-manual "(message)Insertion Variables")