3
;; Author: Kazu Yamamoto <Kazu@Mew.org>
4
;; Created: Dec 14, 1999
10
(defsubst mew-case-default-p (case)
11
(or (null case) (string= case mew-case-default)))
13
(defvar mew-generate-mail-address-list nil)
14
(defvar mew-generate-mail-domain-list nil)
15
(defvar mew-generate-from-list nil)
21
(defun mew-cfent-value (case key def &optional symbol)
22
(let ((cases (and case (mapcar 'mew-chop (mew-split case ?,))))
24
(or (member mew-case-default cases)
25
(setq cases (cons mew-case-default cases)))
26
(setq cases (nreverse cases))
29
(setq ent (assoc key (mew-cfent-by-case (car cases))))
32
(if symbol (setq ret (symbol-value ret)))
33
(if ent (throw 'loop nil)))
34
(setq cases (cdr cases)))
38
(defvar mew-config-cases nil)
39
(defvar mew-config-cases2 nil)
40
(defvar mew-inbox-folders nil)
41
(defvar mew-queue-folders nil)
42
(defvar mew-postq-folders nil)
44
(defun mew-config-init ()
45
(if (null mew-mail-address-list) (setq mew-generate-mail-address-list t))
46
(if (null mew-mail-domain-list) (setq mew-generate-mail-domain-list t))
47
(if (null mew-from-list) (setq mew-generate-from-list t)))
49
(defun mew-config-setup ()
50
(if mew-generate-mail-address-list (setq mew-mail-address-list nil))
51
(if mew-generate-mail-domain-list (setq mew-mail-domain-list nil))
52
(if mew-generate-from-list (setq mew-from-list nil))
53
(setq mew-inbox-folders nil)
54
(setq mew-queue-folders nil)
55
(setq mew-postq-folders nil)
56
(setq mew-config-cases (mapcar 'car mew-config-alist))
57
(or (member mew-case-default mew-config-cases)
58
(setq mew-config-cases (cons mew-case-default mew-config-cases)))
59
(setq mew-config-cases2
60
(append mew-folder-prefixes
61
(mapcar (lambda (x) (concat x ":")) mew-config-cases)))
62
(let ((cases (reverse mew-config-cases)) ;; must copy
65
(setq case (car cases))
66
(setq cases (cdr cases))
67
(setq val (mew-inbox-folder case))
68
(or (mew-folder-inboxp val)
69
(setq mew-inbox-folders (cons val mew-inbox-folders)))
70
(setq val (mew-queue-folder case))
71
(or (mew-folder-queuep val)
72
(setq mew-queue-folders (cons val mew-queue-folders)))
73
(setq val (mew-postq-folder case))
74
(or (mew-folder-postqp val)
75
(setq mew-postq-folders (cons val mew-postq-folders)))
76
(when mew-generate-mail-address-list
77
(setq val (concat "^" (regexp-quote (mew-mail-address case)) "$"))
78
(or (member val mew-mail-address-list)
79
(setq mew-mail-address-list (cons val mew-mail-address-list))))
80
(when mew-generate-mail-domain-list
81
(setq val (mew-mail-domain case))
82
(or (member val mew-mail-domain-list)
83
(setq mew-mail-domain-list (cons val mew-mail-domain-list))))
84
(when mew-generate-from-list
85
(setq val (mew-from case))
86
(or (member val mew-from-list)
87
(setq mew-from-list (cons val mew-from-list)))))))
93
(defun mew-name (&optional case)
94
(mew-cfent-value case "name" mew-name))
96
(defun mew-user (&optional case)
97
(mew-cfent-value case "user" mew-user))
99
(defun mew-mail-domain (&optional case)
100
(mew-cfent-value case "mail-domain" mew-mail-domain))
102
(defun mew-mail-address (&optional case)
103
(concat (mew-user case) "@" (mew-mail-domain case)))
105
;; mew-from is really strange to maintain backword compatibility.
106
(defun mew-from (&optional case)
107
(or (unless mew-config-alist
108
(if mew-generate-from-list
110
(car mew-from-list)))
111
(let ((name (mew-name case))
112
(addr (mew-mail-address case)))
113
(if (and name (string-match "[^ \t]" name))
114
(format "%s <%s>" name addr)
117
(defun mew-cc (&optional case)
118
(let ((cc (mew-cfent-value case "cc" mew-cc)))
119
(if (eq cc 'me) (mew-mail-address case) cc)))
121
(defun mew-fcc (&optional case)
122
(mew-cfent-value case "fcc" mew-fcc))
124
(defun mew-dcc (&optional case)
125
(let ((dcc (mew-cfent-value case "dcc" mew-dcc)))
126
(if (eq dcc 'me) (mew-mail-address case) dcc)))
128
(defun mew-reply-to (&optional case)
129
(mew-cfent-value case "reply-to" mew-reply-to))
131
(defun mew-organization (&optional case)
132
(mew-cfent-value case "organization" mew-organization))
136
(defun mew-smtp-server (&optional case)
137
(mew-cfent-value case "smtp-server" mew-smtp-server))
139
(defun mew-smtp-port (&optional case)
140
(mew-cfent-value case "smtp-port" mew-smtp-port))
142
(defun mew-smtp-ssh-server (&optional case)
143
(mew-cfent-value case "smtp-ssh-server" mew-smtp-ssh-server))
145
(defun mew-smtp-ssl (&optional case)
146
(mew-cfent-value case "smtp-ssl" mew-smtp-ssl))
148
(defun mew-smtp-ssl-port (&optional case)
149
(mew-cfent-value case "smtp-ssl-port" mew-smtp-ssl-port))
151
(defun mew-smtp-helo-domain (&optional case)
152
(mew-cfent-value case "smtp-helo-domain" mew-smtp-helo-domain))
154
(defun mew-smtp-user (&optional case)
155
(mew-cfent-value case "smtp-user" mew-smtp-user))
157
(defun mew-smtp-auth-list (&optional case)
158
(mew-cfent-value case "smtp-auth-list" mew-smtp-auth-list))
160
(defun mew-smtp-mail-from (&optional case)
161
(mew-cfent-value case "smtp-mail-from" mew-smtp-mail-from))
163
(defun mew-smtp-msgid-user (&optional case)
164
(or (mew-cfent-value case "smtp-msgid-user" mew-smtp-msgid-user)
167
(defun mew-smtp-msgid-domain (&optional case)
168
(or (mew-cfent-value case "smtp-msgid-domain" mew-smtp-msgid-domain)
169
(mew-mail-domain case)))
171
(defun mew-smtp-message-id (&optional case)
172
(let* ((random (format "%08d" (mew-random)))
173
(domain (mew-smtp-msgid-domain case))
174
(user (mew-smtp-msgid-user case))
175
(time (mew-time-ctz-to-msgid (current-time))))
176
(concat "<" time "." random "." user "@" domain ">")))
180
(defun mew-mailbox-type (&optional case)
181
(mew-cfent-value case "mailbox-type" mew-mailbox-type))
185
(defun mew-mbox-command (&optional case)
186
(mew-cfent-value case "mbox-command" mew-mbox-command))
188
(defun mew-mbox-command-arg (&optional case)
189
(mew-cfent-value case "mbox-command-arg" mew-mbox-command-arg))
193
(defun mew-pop-server (&optional case)
194
(mew-cfent-value case "pop-server" mew-pop-server))
196
(defun mew-pop-port (&optional case)
197
(mew-cfent-value case "pop-port" mew-pop-port))
199
(defun mew-pop-auth (&optional case)
200
(mew-cfent-value case "pop-auth" mew-pop-auth))
202
(defun mew-pop-ssh-server (&optional case)
203
(mew-cfent-value case "pop-ssh-server" mew-pop-ssh-server))
205
(defun mew-pop-ssl (&optional case)
206
(mew-cfent-value case "pop-ssl" mew-pop-ssl))
208
(defun mew-pop-ssl-port (&optional case)
209
(mew-cfent-value case "pop-ssl-port" mew-pop-ssl-port))
211
(defun mew-pop-proxy-server (&optional case)
212
(mew-cfent-value case "pop-proxy-server" mew-pop-proxy-server))
214
(defun mew-pop-proxy-port (&optional case)
215
(mew-cfent-value case "pop-proxy-port" mew-pop-proxy-port))
217
(defun mew-pop-user (&optional case)
218
(mew-cfent-value case "pop-user" mew-pop-user))
220
(defun mew-pop-auth-list (&optional case)
221
(mew-cfent-value case "pop-auth-list" mew-pop-auth-list))
223
(defun mew-pop-size (&optional case)
224
(mew-cfent-value case "pop-size" mew-pop-size))
226
(defun mew-pop-body-lines (&optional case)
227
(mew-cfent-value case "pop-body-lines" mew-pop-body-lines))
229
(defun mew-pop-delete (&optional case)
230
(mew-cfent-value case "pop-delete" mew-pop-delete))
232
(defun mew-pop-header-only (&optional case)
233
(mew-cfent-value case "pop-header-only" mew-pop-header-only))
237
(defun mew-imap-server (&optional case)
238
(mew-cfent-value case "imap-server" mew-imap-server))
240
(defun mew-imap-port (&optional case)
241
(mew-cfent-value case "imap-port" mew-imap-port))
243
(defun mew-imap-auth (&optional case)
244
(mew-cfent-value case "imap-auth" mew-imap-auth))
246
(defun mew-imap-ssh-server (&optional case)
247
(mew-cfent-value case "imap-ssh-server" mew-imap-ssh-server))
249
(defun mew-imap-ssl (&optional case)
250
(mew-cfent-value case "imap-ssl" mew-imap-ssl))
252
(defun mew-imap-ssl-port (&optional case)
253
(mew-cfent-value case "imap-ssl-port" mew-imap-ssl-port))
255
(defun mew-imap-user (&optional case)
256
(mew-cfent-value case "imap-user" mew-imap-user))
258
(defun mew-imap-auth-list (&optional case)
259
(mew-cfent-value case "imap-auth-list" mew-imap-auth-list))
261
(defun mew-imap-size (&optional case)
262
(mew-cfent-value case "imap-size" mew-imap-size))
264
(defun mew-imap-delete (&optional case)
265
(mew-cfent-value case "imap-delete" mew-imap-delete))
267
(defun mew-imap-header-only (&optional case)
268
(mew-cfent-value case "imap-header-only" mew-imap-header-only))
270
(defun mew-imap-prefix-list (&optional case)
271
(mew-cfent-value case "imap-prefix-list" mew-imap-prefix-list))
275
(defun mew-nntp-server (&optional case)
276
(mew-cfent-value case "nntp-server" mew-nntp-server))
278
(defun mew-nntp-port (&optional case)
279
(mew-cfent-value case "nntp-port" mew-nntp-port))
281
(defun mew-nntp-ssh-server (&optional case)
282
(mew-cfent-value case "nntp-ssh-server" mew-nntp-ssh-server))
284
(defun mew-nntp-ssl (&optional case)
285
(mew-cfent-value case "nntp-ssl" mew-nntp-ssl))
287
(defun mew-nntp-ssl-port (&optional case)
288
(mew-cfent-value case "nntp-ssl-port" mew-nntp-ssl-port))
290
(defun mew-nntp-user (&optional case)
291
(mew-cfent-value case "nntp-user" mew-nntp-user))
293
(defun mew-nntp-size (&optional case)
294
(mew-cfent-value case "nntp-size" mew-nntp-size))
296
(defun mew-nntp-header-only (&optional case)
297
(mew-cfent-value case "nntp-header-only" mew-nntp-header-only))
299
(defun mew-nntp-msgid-user (&optional case)
300
(or (mew-cfent-value case "nntp-msgid-user" mew-nntp-msgid-user)
303
(defun mew-nntp-msgid-domain (&optional case)
304
(or (mew-cfent-value case "nntp-msgid-domain" mew-nntp-msgid-domain)
305
(mew-mail-domain case)))
307
(defun mew-nntp-message-id (&optional case)
308
(let* ((random (format "%08d" (mew-random)))
309
(domain (mew-nntp-msgid-domain case))
310
(user (mew-nntp-msgid-user case))
311
(time (mew-time-ctz-to-msgid (current-time))))
312
(concat "<" time "." random "." user "@" domain ">")))
315
(defun mew-inbox-folder (&optional case)
316
(mew-cfent-value case "inbox-folder" mew-inbox-folder))
318
(defun mew-nntp-newsgroup (&optional case)
319
(mew-cfent-value case "nntp-newsgroup" mew-nntp-newsgroup))
321
(defun mew-imap-friend-folder (&optional case)
322
(mew-cfent-value case "imap-friend-folder" mew-imap-friend-folder))
324
(defun mew-queue-folder (&optional case)
325
(mew-cfent-value case "queue-folder" mew-queue-folder))
327
(defun mew-postq-folder (&optional case)
328
(mew-cfent-value case "postq-folder" mew-postq-folder))
330
(defun mew-imap-queue-folder (&optional case)
331
(mew-cfent-value case "imap-queue-folder" mew-imap-queue-folder))
333
(defun mew-imap-trash-folder (&optional case)
334
(mew-cfent-value case "imap-trash-folder" mew-imap-trash-folder))
336
(defun mew-imap-trash-folder-list (&optional case)
337
(mew-cfent-value case "imap-trash-folder-list" mew-imap-trash-folder-list))
339
(defun mew-header-alist (&optional case)
340
(mew-cfent-value case "header-alist" mew-header-alist))
342
(defun mew-signature-file (&optional case)
343
(mew-cfent-value case "signature-file" mew-signature-file))
345
(defun mew-content-type (&optional case)
346
(mew-capitalize (mew-cfent-value case "content-type" mew-content-type)))
348
(defun mew-use-retrieve (&optional case)
349
(mew-cfent-value case "use-retrieve" mew-use-retrieve))
351
(defun mew-imap-spam-field (&optional case)
352
(mew-cfent-value case "imap-spam-field" mew-imap-spam-field))
354
(defun mew-imap-spam-word (&optional case)
355
(mew-cfent-value case "imap-spam-word" mew-imap-spam-word))
359
(defun mew-proto (&optional case)
360
(mew-cfent-value case "proto" mew-proto))
364
(defun mew-ssh-prog (&optional case)
365
(mew-cfent-value case "ssh-prog" mew-ssh-prog))
367
(defun mew-ssh-prog-args (&optional case)
368
(mew-cfent-value case "ssh-prog-args" mew-ssh-prog-args))
370
(defun mew-ssh-prog-ver (&optional case)
371
(mew-cfent-value case "ssh-prog-ver" mew-ssh-prog-ver))
373
(defun mew-spam-prog (&optional case)
374
(mew-cfent-value case "spam-prog" mew-spam-prog))
376
(defun mew-spam-prog-args (&optional case)
377
(mew-cfent-value case "spam-prog-args" mew-spam-prog-args))
379
(defun mew-ham-prog (&optional case)
380
(mew-cfent-value case "ham-prog" mew-ham-prog))
382
(defun mew-ham-prog-args (&optional case)
383
(mew-cfent-value case "ham-prog-args" mew-ham-prog-args))
387
(defun mew-refile-guess-alist (&optional case)
388
(mew-cfent-value case "refile-guess-alist" mew-refile-guess-alist 'symbol))
392
(defun mew-use-old-pgp (&optional case)
393
(mew-cfent-value case "use-old-pgp" mew-use-old-pgp))
399
(defvar mew-case-input nil
400
"\\<mew-summary-mode-map>This is used for
401
1. '\\[mew-summary-retrieve]' to select a POP server (or something)
402
2. Biff to select a server (or somthing)
403
3. If 'mew-use-case-input-completion' is non-nil, this value
404
is automatically inserted when inputing a folder>")
406
(defvar mew-case-output nil
409
It is used to complete Newsgroups,
410
choose default Content-Type: for a file to be attached,
411
choose a signature file,
412
select a SMTP server (or something).
413
2. flushing a message queue.")
415
(defun mew-case-set-both ()
416
"Set the case both for input and output."
418
(let ((case (mew-input-case mew-case-input "Input/Output")))
419
(setq mew-case-input case)
420
(setq mew-case-output case)))
422
(defun mew-case-set-input ()
423
"Set the case for input. If 'mew-case-synchronize' is
424
non-nil, set the case for output, too."
426
(if mew-case-synchronize
428
(setq mew-case-input (mew-input-case mew-case-input "Input"))))
430
(defun mew-case-set-output ()
431
"Set the case for output. If 'mew-case-synchronize' is
432
non-nil, set the case for input, too."
434
(if mew-case-synchronize
436
(setq mew-case-output (mew-input-case mew-case-output "Output"))))
438
(defun mew-summary-set-case (&optional output)
440
(1) If 'mew-case-synchronize' is non-nil, set the case both for
442
(2) If called with '\\[universal-argument]', set the case for output.
443
(3) Otherwise, set the case for input."
446
(mew-summary-or-thread
448
(setq case (mew-case-set-output))
449
(setq case (mew-case-set-input))))
451
(let ((bufs mew-buffers))
453
(if (get-buffer (car bufs))
455
(set-buffer (car bufs))
458
(mew-summary-mode-name mew-mode-name-summary))
460
(mew-summary-mode-name mew-mode-name-virtual)))))
461
(setq bufs (cdr bufs)))))
462
(when mew-visit-inbox-after-setting-case
463
(setq inbox (mew-case-folder
465
(mew-proto-inbox-folder (mew-proto case) case)))
466
(mew-summary-visit-folder inbox))))
468
(defun mew-draft-set-case (&optional arg)
469
"Guess case and set the case for output to it. The value is
470
locally stored in Draft mode. If called with '\\[universal-argument]',
471
you can modify the locally stored value. Then this command replace
472
fields in the header according to the new value."
474
(let ((old-case (mew-tinfo-get-case)) new-case)
476
(setq new-case (mew-input-case old-case "This draft" 'edit))
477
(setq new-case (mew-draft-get-case-by-guess))
478
(if mew-case-guess-addition
479
(setq new-case (mew-draft-add-case old-case new-case)))
481
(mew-input-case (or new-case mew-case-output) "This draft")))
482
(mew-tinfo-set-case new-case)
483
(mew-draft-mode-name (mew-tinfo-get-hdr-file))
484
(mew-draft-replace-fields old-case)
485
(mew-highlight-header)
486
(unless (mew-tinfo-get-hdr-file) (mew-draft-header-keymap))
489
(defun mew-draft-replace-fields (old-case)
491
(goto-char (point-min))
492
(let ((new-case (mew-tinfo-get-case))
494
;; (mew-header-end) cannot be used here
495
(mew-header-goto-end)
497
(goto-char (point-min))
499
((mew-draft-resent-p eoh)
500
(setq from mew-resent-from:)
501
;; (setq cc mew-resent-cc:)
502
(setq dcc mew-resent-dcc:))
504
(setq from mew-from:)
506
(setq dcc mew-dcc:)))
507
(mew-header-replace-value from (mew-from new-case))
508
;; (mew-header-replace-value cc (mew-cc new-case))
509
(mew-header-replace-value dcc (mew-dcc new-case))
510
(mew-header-replace-value mew-fcc: (mew-fcc new-case))
511
(mew-header-replace-value mew-reply-to: (mew-reply-to new-case))
512
(mew-header-replace-value mew-organization: (mew-organization new-case))
513
(mew-header-delete-lines (mapcar 'car (mew-header-alist old-case)))
514
(mew-header-delete-lines (mapcar 'car (mew-header-alist new-case)))
515
(mew-header-delete-lines (list mew-x-mailer:))
516
(mew-header-goto-end)
517
(mew-draft-header-insert-alist (mew-header-alist new-case))
518
;; X-Mailer: must be the last
519
(mew-draft-header-insert mew-x-mailer: mew-x-mailer))))
521
(defun mew-draft-get-case-by-guess (&optional alist)
522
"Guess case according to 'mew-case-guess-alist'."
523
(unless alist (setq alist mew-case-guess-alist))
524
(let ((cases (mew-refile-guess-by-alist1 alist)))
529
(defun mew-draft-set-case-by-guess ()
530
(let ((case (mew-draft-get-case-by-guess)))
532
(if mew-case-guess-addition
533
(setq case (mew-draft-add-case (mew-tinfo-get-case) case)))
534
(mew-tinfo-set-case case))))
536
(defun mew-draft-add-case (dst src)
537
(if (mew-case-default-p dst)
539
(if (> (length src) 0)
542
(mew-uniq-list (nreverse (mew-split (concat dst "," src) ?,)))))
545
(provide 'mew-config)
547
;;; Copyright Notice:
549
;; Copyright (C) 1999-2003 Mew developing team.
550
;; All rights reserved.
552
;; Redistribution and use in source and binary forms, with or without
553
;; modification, are permitted provided that the following conditions
556
;; 1. Redistributions of source code must retain the above copyright
557
;; notice, this list of conditions and the following disclaimer.
558
;; 2. Redistributions in binary form must reproduce the above copyright
559
;; notice, this list of conditions and the following disclaimer in the
560
;; documentation and/or other materials provided with the distribution.
561
;; 3. Neither the name of the team nor the names of its contributors
562
;; may be used to endorse or promote products derived from this software
563
;; without specific prior written permission.
565
;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND
566
;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
567
;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
568
;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE
569
;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
570
;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
571
;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
572
;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
573
;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
574
;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
575
;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
577
;;; mew-config.el ends here