(defvar wl-draft-reedit nil)
(defvar wl-draft-reply-buffer nil)
(defvar wl-draft-forward nil)
-(defvar wl-draft-parent-folder nil)
+(defvar wl-draft-doing-mime-bcc nil)
+
+(defvar wl-draft-parent-folder nil
+ "Folder name of the summary in which current draft is invoked.
+This variable is local in each draft buffer.
+You can refer its value in `wl-draft-config-alist'.
+
+e.g.
+\(setq wl-draft-config-alist
+ '(((string-match \".*@domain1$\" wl-draft-parent-folder)
+ (\"From\" . \"user@domain1\"))
+ ((string-match \".*@domain2$\" wl-draft-parent-folder)
+ (\"From\" . \"user@domain2\"))))")
+
+(defvar wl-draft-parent-number nil)
+
+(defconst wl-draft-reply-saved-variables
+ '(wl-draft-parent-folder
+ wl-draft-parent-number))
(defvar wl-draft-config-sub-func-alist
'((body . wl-draft-config-sub-body)
(make-variable-buffer-local 'wl-draft-fcc-list)
(make-variable-buffer-local 'wl-draft-reply-buffer)
(make-variable-buffer-local 'wl-draft-parent-folder)
+(make-variable-buffer-local 'wl-draft-parent-number)
(defsubst wl-smtp-password-key (user mechanism server)
(format "SMTP:%s/%s@%s"
"Insert From field."
;; Put the "From:" field in unless for some odd reason
;; they put one in themselves.
- (let* ((login (or user-mail-address (user-login-name)))
- (fullname (user-full-name)))
- (cond ((eq mail-from-style 'angles)
- (insert "From: " fullname)
- (let ((fullname-start (+ (point-min) (length "From: ")))
- (fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; Look for a character that cannot appear unquoted
- ;; according to RFC 822.
- (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]"
- fullname-end 1)
- (progn
- ;; Quote fullname, escaping specials.
- (goto-char fullname-start)
- (insert "\"")
- (while (re-search-forward "[\"\\]"
- fullname-end 1)
- (replace-match "\\\\\\&" t))
- (insert "\""))))
- (insert " <" login ">\n"))
- ((eq mail-from-style 'parens)
- (insert "From: " login " (")
- (let ((fullname-start (point)))
- (insert fullname)
- (let ((fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; RFC 822 says \ and nonmatching parentheses
- ;; must be escaped in comments.
- ;; Escape every instance of ()\ ...
- (while (re-search-forward "[()\\]" fullname-end 1)
- (replace-match "\\\\\\&" t))
- ;; ... then undo escaping of matching parentheses,
- ;; including matching nested parentheses.
- (goto-char fullname-start)
- (while (re-search-forward
- "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)"
- fullname-end 1)
- (replace-match "\\1(\\3)" t)
- (goto-char fullname-start))))
- (insert ")\n"))
- ((not mail-from-style)
- (insert "From: " login "\n")))))
+ (let (from)
+ (condition-case err
+ (setq from (wl-draft-eword-encode-address-list wl-from))
+ (error (error "Please look at `wl-from' again")))
+ (insert "From: " from "\n")))
(defun wl-draft-insert-x-face-field ()
"Insert X-Face header."
(interactive)
(if (not (file-exists-p wl-x-face-file))
(error "File %s does not exist" wl-x-face-file)
- (beginning-of-buffer)
+ (goto-char (point-min))
(search-forward mail-header-separator nil t)
(beginning-of-line)
(wl-draft-insert-x-face-field-here)
(defun wl-draft-insert-x-face-field-here ()
"Insert X-Face field at point."
(let ((x-face-string (elmo-get-file-string wl-x-face-file)))
- (when (string-match "^[ \t]*" x-face-string)
+ (when (string-match "^\\(X-Face:\\)?[ \t\n]*" x-face-string)
(setq x-face-string (substring x-face-string (match-end 0))))
(insert "X-Face: " x-face-string))
(when (not (= (preceding-char) ?\n)) ; for chomped (choped) x-face-string
(defun wl-draft-setup ()
(let ((field wl-draft-fields)
- ret-val)
+ cl)
(while field
- (setq ret-val (append ret-val
- (list (cons (concat (car field) " ")
- (concat (car field) " ")))))
+ (setq cl (append cl
+ (list (cons (concat (car field) " ")
+ (concat (car field) " ")))))
(setq field (cdr field)))
- (setq wl-draft-field-completion-list ret-val)))
+ (setq cl
+ (cons (cons (concat wl-draft-mime-bcc-field-name ": ")
+ (concat wl-draft-mime-bcc-field-name ": "))
+ cl))
+ (setq wl-draft-field-completion-list cl)
+ (setq wl-address-complete-header-regexp
+ (wl-regexp-opt
+ (append wl-address-complete-header-list
+ (list (concat wl-draft-mime-bcc-field-name ":")))))))
(defun wl-draft-make-mail-followup-to (recipients)
(if (elmo-list-member
(let ((rlist (elmo-list-delete
(or wl-user-mail-address-list
(list (wl-address-header-extract-address wl-from)))
- (copy-sequence recipients))))
+ recipients
+ (lambda (elem list)
+ (elmo-delete-if
+ (lambda (item) (string= (downcase elem)
+ (downcase item)))
+ list)))))
(if (elmo-list-member rlist (mapcar 'downcase
wl-subscribed-mailing-list))
rlist
(let ((myself (or wl-user-mail-address-list
(list (wl-address-header-extract-address wl-from)))))
(cond (wl-draft-always-delete-myself ; always-delete option
- (elmo-list-delete myself cc))
+ (elmo-list-delete myself cc
+ (lambda (elem list)
+ (elmo-delete-if
+ (lambda (item) (string= (downcase elem)
+ (downcase item)))
+ list))))
((elmo-list-member (append to cc) ; subscribed mailing-list
(mapcar 'downcase wl-subscribed-mailing-list))
- (elmo-list-delete myself cc))
+ (elmo-list-delete myself cc
+ (lambda (elem list)
+ (elmo-delete-if
+ (lambda (item) (string= (downcase elem)
+ (downcase item)))
+ list))))
(t cc))))
(defun wl-draft-forward (original-subject summary-buf)
- (let (references)
+ (let (references parent-folder)
+ (with-current-buffer summary-buf
+ (setq parent-folder (wl-summary-buffer-folder-name)))
(with-current-buffer (wl-message-get-original-buffer)
(setq references (nconc
(std11-field-bodies '("References" "In-Reply-To"))
references (wl-delete-duplicates references)
references (when references
(mapconcat 'identity references "\n\t"))))
- (wl-draft "" (concat "Forward: " original-subject)
- nil nil references nil nil nil nil nil nil summary-buf))
+ (and wl-draft-use-frame
+ (get-buffer-window summary-buf)
+ (select-window (get-buffer-window summary-buf)))
+ (wl-draft (list (cons 'To "")
+ (cons 'Subject
+ (concat wl-forward-subject-prefix original-subject))
+ (cons 'References references))
+ nil nil nil nil parent-folder))
(goto-char (point-max))
(wl-draft-insert-message)
(mail-position-on-field "To"))
(defun wl-draft-strip-subject-re (subject)
- "Remove \"Re:\" from subject lines. Shamelessly copied from Gnus."
+ "Remove \"Re:\" from SUBJECT string. Shamelessly copied from Gnus."
(if (string-match wl-subject-prefix-regexp subject)
(substring subject (match-end 0))
subject))
-(defun wl-draft-reply-list-symbol (with-arg)
- "Return symbol `wl-draft-reply-*-argument-list' match condition.
-Check WITH-ARG and From: field."
- (if (wl-address-user-mail-address-p (or (elmo-field-body "From") ""))
- (if with-arg
- 'wl-draft-reply-myself-with-argument-list
- 'wl-draft-reply-myself-without-argument-list)
- (if with-arg
- 'wl-draft-reply-with-argument-list
- 'wl-draft-reply-without-argument-list)))
-
-(defun wl-draft-reply (buf with-arg summary-buf)
+(defun wl-draft-self-reply-p ()
+ "Return t when From address in the current message is user's self one or not."
+ (wl-address-user-mail-address-p (or (elmo-field-body "From") "")))
+
+(defun wl-draft-reply (buf with-arg summary-buf &optional number)
"Reply to BUF buffer message.
Reply to author if WITH-ARG is non-nil."
;;;(save-excursion
(let (r-list
to mail-followup-to cc subject in-reply-to references newsgroups
- from to-alist cc-alist decoder parent-folder)
- (set-buffer summary-buf)
- (setq parent-folder (wl-summary-buffer-folder-name))
- (set-buffer buf)
- (setq r-list (symbol-value (wl-draft-reply-list-symbol with-arg)))
+ to-alist cc-alist decoder parent-folder)
+ (when (buffer-live-p summary-buf)
+ (with-current-buffer summary-buf
+ (setq parent-folder (wl-summary-buffer-folder-name))))
+ (set-buffer (or buf mime-mother-buffer))
+ (setq r-list (if with-arg wl-draft-reply-with-argument-list
+ wl-draft-reply-without-argument-list))
(catch 'done
(while r-list
(when (let ((condition (car (car r-list))))
((listp condition)
(catch 'done
(while condition
- (if (not (std11-field-body (car condition)))
- (throw 'done nil))
+ (cond
+ ((stringp (car condition))
+ (or (std11-field-body (car condition))
+ (throw 'done nil)))
+ ((symbolp (car condition))
+ (or (funcall (car condition))
+ (throw 'done nil)))
+ (t
+ (debug)))
(setq condition (cdr condition)))
t))
((symbolp condition)
(when (and (member "Followup-To" r-ng-list)
(string= (std11-field-body "Followup-To") "poster"))
(setq r-to-list (cons "From" r-to-list))
- (setq r-ng-list (delete "Followup-To" (copy-sequence r-ng-list))))
- (setq to (wl-concat-list (cons to
- (elmo-multiple-fields-body-list
- r-to-list))
- ","))
- (setq cc (wl-concat-list (cons cc
- (elmo-multiple-fields-body-list
- r-cc-list))
- ","))
- (setq newsgroups (wl-concat-list (cons newsgroups
- (std11-field-bodies
- r-ng-list))
- ",")))
+ (setq r-ng-list (delete "Followup-To"
+ (copy-sequence r-ng-list))))
+ (if (and r-to-list (symbolp r-to-list))
+ (setq to (wl-concat-list (funcall r-to-list) ","))
+ (setq to (wl-concat-list (cons to
+ (elmo-multiple-fields-body-list
+ r-to-list))
+ ",")))
+ (if (and r-cc-list (symbolp r-cc-list))
+ (setq cc (wl-concat-list (funcall r-cc-list) ","))
+ (setq cc (wl-concat-list (cons cc
+ (elmo-multiple-fields-body-list
+ r-cc-list))
+ ",")))
+ (if (and r-ng-list (symbolp r-ng-list))
+ (setq newsgroups (wl-concat-list (funcall r-ng-list) ","))
+ (setq newsgroups (wl-concat-list (cons newsgroups
+ (std11-field-bodies
+ r-ng-list))
+ ","))))
(throw 'done nil))
(setq r-list (cdr r-list)))
- (error "No match field: check your `%s'"
- (symbol-name (wl-draft-reply-list-symbol with-arg))))
+ (error "No match field: check your `wl-draft-reply-%s-argument-list'"
+ (if with-arg "with" "without")))
(setq subject (std11-field-body "Subject"))
(setq to (wl-parse-addresses to)
cc (wl-parse-addresses cc))
references (wl-delete-duplicates references)
references (if references
(mapconcat 'identity references "\n\t")))
- (wl-draft
- to subject in-reply-to cc references newsgroups mail-followup-to
- nil nil nil nil summary-buf nil parent-folder)
- (setq wl-draft-reply-buffer buf))
+ (and wl-draft-use-frame
+ (get-buffer-window summary-buf)
+ (select-window (get-buffer-window summary-buf)))
+ (wl-draft (list (cons 'To to)
+ (cons 'Cc cc)
+ (cons 'Newsgroups newsgroups)
+ (cons 'Subject subject)
+ (cons 'In-Reply-To in-reply-to)
+ (cons 'References references)
+ (cons 'Mail-Followup-To mail-followup-to))
+ nil nil nil nil parent-folder)
+ (setq wl-draft-parent-number number)
+ (setq wl-draft-reply-buffer buf)
+ (setq wl-draft-config-variables
+ (append wl-draft-reply-saved-variables
+ wl-draft-config-variables)))
(run-hooks 'wl-reply-hook))
+(defun wl-draft-reply-position (position)
+ (cond ((eq position 'body)
+ (wl-draft-body-goto-top))
+ ((eq position 'bottom)
+ (wl-draft-body-goto-bottom))
+ ((eq position 'top)
+ (goto-char (point-min)))
+ ((and (stringp position)
+ (std11-field-body position))
+ (progn (mail-position-on-field position)
+ (wl-draft-beginning-of-line)))
+ ((listp position)
+ (while (car position)
+ (wl-draft-reply-position (car position))
+ (setq position (cdr position))))))
+
(defun wl-draft-add-references ()
(wl-draft-add-in-reply-to "References"))
(when wl-highlight-body-too
(wl-highlight-body-region beg (point-max)))))
-(defun wl-draft-confirm ()
- "Confirm send message."
- (interactive)
- (y-or-n-p (format "Send current draft as %s? "
- (cond ((and (wl-message-mail-p) (wl-message-news-p))
- "Mail and News")
- ((wl-message-mail-p) "Mail")
- ((wl-message-news-p) "News")))))
-
(defun wl-message-news-p ()
"If exist valid Newsgroups field, return non-nil."
(std11-field-body "Newsgroups"))
(wl-message-field-exists-p "Resent-to")
(wl-message-field-exists-p "Cc")
(wl-message-field-exists-p "Bcc")
+ (wl-message-field-exists-p wl-draft-mime-bcc-field-name)
;;; This may be needed..
;;; (wl-message-field-exists-p "Fcc")
))
-(defun wl-draft-open-file (&optional file)
- "Open FILE for edit."
- (interactive)
-;;;(interactive "*fFile to edit: ")
- (wl-draft-edit-string (elmo-get-file-string
- (or file
- (read-file-name "File to edit: "
- (or wl-temporary-file-directory
- "~/"))))))
-
(defun wl-draft-edit-string (string)
(let ((cur-buf (current-buffer))
(tmp-buf (get-buffer-create " *wl-draft-edit-string*"))
to subject in-reply-to cc references newsgroups mail-followup-to
content-type content-transfer-encoding from
- body-beg buffer-read-only)
+ body-beg)
(set-buffer tmp-buf)
(erase-buffer)
(insert string)
(search-forward (concat mail-header-separator "\n") nil t))
(unwind-protect
(set-buffer
- (wl-draft to subject in-reply-to cc references newsgroups
- mail-followup-to
+ (wl-draft (list
+ (cons 'From
+ (if (member
+ (nth 1 (std11-extract-address-components from))
+ wl-user-mail-address-list)
+ from))
+ (cons 'To to)
+ (cons 'Cc cc)
+ (cons 'Subject subject)
+ (cons 'Newsgroups newsgroups)
+ (cons 'Mail-Followup-To mail-followup-to)
+ (cons 'In-Reply-To in-reply-to)
+ (cons 'References references))
content-type content-transfer-encoding
(buffer-substring (point) (point-max))
- 'edit-again nil
- (if (member (nth 1 (std11-extract-address-components from))
- wl-user-mail-address-list)
- from)))
- (and to (mail-position-on-field "To"))
- (delete-other-windows)
- (kill-buffer tmp-buf)))
- (setq buffer-read-only nil) ;;??
- (run-hooks 'wl-draft-reedit-hook))
+ 'edit-again))
+ (kill-buffer tmp-buf))
+ ;; Set cursor point to the top.
+ (goto-char (point-min))
+ (search-forward (concat mail-header-separator "\n") nil t)
+ (run-hooks 'wl-draft-reedit-hook)
+ (and to (mail-position-on-field "To"))))
(defun wl-draft-insert-current-message (dummy)
(interactive)
(defun wl-default-draft-cite ()
(let ((mail-yank-ignored-headers "[^:]+:")
(mail-yank-prefix "> ")
- (summary-buf wl-current-summary-buffer)
- (message-buf (get-buffer (wl-current-message-buffer)))
- from date cite-title num entity)
- (if (and summary-buf
- (buffer-live-p summary-buf)
- message-buf
- (buffer-live-p message-buf))
- (progn
- (with-current-buffer summary-buf
- (setq num (save-excursion
- (set-buffer message-buf)
- wl-message-buffer-cur-number))
- (setq entity (elmo-msgdb-overview-get-entity
- num (wl-summary-buffer-msgdb)))
- (setq date (elmo-msgdb-overview-entity-get-date entity))
- (setq from (elmo-msgdb-overview-entity-get-from entity)))
- (setq cite-title (format "At %s,\n%s wrote:"
- (or date "some time ago")
- (if wl-default-draft-cite-decorate-author
- (wl-summary-from-func-internal
- (or from "you"))
- (or from "you"))))))
- (and cite-title
- (insert cite-title "\n"))
+ date from cite-title)
+ (save-restriction
+ (if (< (mark t) (point))
+ (exchange-point-and-mark))
+ (narrow-to-region (point)(point-max))
+ (setq date (std11-field-body "date")
+ from (std11-field-body "from")))
+ (when (or date from)
+ (insert (format "At %s,\n%s wrote:\n"
+ (or date "some time ago")
+ (if wl-default-draft-cite-decorate-author
+ (funcall wl-summary-from-function
+ (or from "you"))
+ (or from "you")))))
(mail-indent-citation)))
-(defvar wl-draft-buffer nil "Draft buffer to yank content")
+(defvar wl-draft-buffer nil "Draft buffer to yank content.")
(defun wl-draft-yank-to-draft-buffer (buffer)
"Yank BUFFER content to `wl-draft-buffer'."
(set-buffer wl-draft-buffer)
(if arg
(let (buf mail-reply-buffer)
(elmo-set-work-buf
+ (insert "\n")
(yank)
(setq buf (current-buffer)))
(setq mail-reply-buffer buf)
(delete-frame)
;; hide draft window
(or (one-window-p)
- (delete-window)))
- ;; stay folder window if required
- (when wl-stay-folder-window
- (if (setq fld-buf (get-buffer wl-folder-buffer-name))
- (if (setq fld-win (get-buffer-window fld-buf))
- (select-window fld-win)
- (if wl-draft-resume-folder-window ;; resume folder window
- (switch-to-buffer fld-buf)))))
- (if (buffer-live-p sum-buf)
- (if (setq sum-win (get-buffer-window sum-buf t))
- ;; if Summary is on the frame, select it.
- (select-window sum-win)
- ;; if summary is not on the frame, switch to it.
- (if (and wl-stay-folder-window
- (or wl-draft-resume-folder-window fld-win))
- (wl-folder-select-buffer sum-buf)
- (switch-to-buffer sum-buf)))))))
+ (delete-window))
+ ;; stay folder window if required
+ (when wl-stay-folder-window
+ (if (setq fld-buf (get-buffer wl-folder-buffer-name))
+ (if (setq fld-win (get-buffer-window fld-buf))
+ (select-window fld-win)
+ (if wl-draft-resume-folder-window ;; resume folder window
+ (switch-to-buffer fld-buf)))))
+ (if (buffer-live-p sum-buf)
+ (if (setq sum-win (get-buffer-window sum-buf t))
+ ;; if Summary is on the frame, select it.
+ (select-window sum-win)
+ ;; if summary is not on the frame, switch to it.
+ (if (and wl-stay-folder-window
+ (or wl-draft-resume-folder-window fld-win))
+ (wl-folder-select-buffer sum-buf)
+ (switch-to-buffer sum-buf))))))))
(defun wl-draft-delete (editing-buffer)
- "kill the editing draft buffer and delete the file corresponds to it."
+ "Kill the editing draft buffer and delete the file corresponds to it."
(save-excursion
(when editing-buffer
(set-buffer editing-buffer)
(or force-kill
(y-or-n-p "Kill Current Draft? ")))
(let ((cur-buf (current-buffer)))
+ (when (and wl-draft-parent-number
+ (not (string= wl-draft-parent-folder "")))
+ (let* ((number wl-draft-parent-number)
+ (folder-name wl-draft-parent-folder)
+ (folder (wl-folder-get-elmo-folder folder-name))
+ buffer)
+ (if (and (setq buffer (wl-summary-get-buffer folder-name))
+ (with-current-buffer buffer
+ (string= (wl-summary-buffer-folder-name)
+ folder-name)))
+ (with-current-buffer buffer
+ (elmo-folder-unmark-answered folder (list number))
+ (wl-summary-jump-to-msg number)
+ (wl-summary-update-mark number))
+ (elmo-folder-open folder 'load-msgdb)
+ (elmo-folder-unmark-answered folder (list number))
+ (elmo-folder-close folder))))
(wl-draft-hide cur-buf)
(wl-draft-delete cur-buf)))
(message "")))
(kill-region b e)
(insert wl-draft-elide-ellipsis))
+;; Imported from message.el.
+(defun wl-draft-beginning-of-line (&optional n)
+ "Move point to beginning of header value or to beginning of line."
+ (interactive "p")
+ (let ((zrs 'zmacs-region-stays))
+ (when (and (interactive-p) (boundp zrs))
+ (set zrs t)))
+ (if (wl-draft-point-in-header-p)
+ (let* ((here (point))
+ (bol (progn (beginning-of-line n) (point)))
+ (eol (line-end-position))
+ (eoh (and (looking-at "[^ \t]")
+ (re-search-forward ": *" eol t))))
+ (if (and eoh (or (> here eoh) (= here bol)))
+ (goto-char eoh)
+ (goto-char bol)))
+ (beginning-of-line n)))
+
+(defun wl-draft-point-in-header-p ()
+ "Return t if point is in the header."
+ (save-excursion
+ (let ((p (point)))
+ (goto-char (point-min))
+ (not (re-search-forward
+ (concat "^" (regexp-quote mail-header-separator) "\n")
+ p t)))))
+
;; function for wl-sent-message-via
(defmacro wl-draft-sent-message-p (type)
","))))
""))
(id (if id (concat " id=" id) ""))
- (time (wl-sendlog-time)))
+ (time (format-time-string "%Y/%m/%d %T")))
(insert (format "%s proto=%s stat=%s%s%s%s\n"
time proto status server to id))
(if (and wl-draft-sendlog-max-size filesize
msg-id-list))))
(nreverse msg-id-list)))
+(defun wl-draft-eword-encode-address-list (string &optional column)
+ "Encode header field STRING as list of address, and return the result.
+Cause an error when STRING contains invalid address.
+Optional argument COLUMN is start-position of the field."
+ (car (eword-encode-rword-list
+ (or column eword-encode-default-start-column)
+ (eword-encode-addresses-to-rword-list
+ (wl-draft-std11-parse-addresses (std11-lexical-analyze string))))))
+
(defun wl-draft-std11-parse-addresses (lal)
(let ((ret (std11-parse-address lal)))
+ (when (and (not (and (eq (length lal) 1)
+ (eq (car (car lal)) 'spaces)))
+ (null ret))
+ (error "Error while parsing address"))
(if ret
(let ((dest (list (car ret))))
(setq lal (cdr ret))
"Get address list suitable for smtp RCPT TO:<address>.
Group list content is removed if `wl-draft-remove-group-list-contents' is
non-nil."
- (let ((fields '("to" "cc" "bcc"))
+ (let ((fields (if (and wl-draft-doing-mime-bcc
+ wl-draft-disable-bcc-for-mime-bcc)
+ '("to" "cc")
+ '("to" "cc" "bcc")))
(resent-fields '("resent-to" "resent-cc" "resent-bcc"))
(case-fold-search t)
addrs recipients)
"$\\|^$") nil t)
(point-marker)))
(smtp-server
- (or wl-smtp-posting-server
- ;; Compatibility stuff for FLIM 1.12.5 or earlier.
- ;; They don't accept a function as the value of `smtp-server'.
- (if (functionp smtp-server)
- (funcall
- smtp-server
- sender
- ;; no harm..
- (let (wl-draft-remove-group-list-contents)
- (wl-draft-deduce-address-list
- (current-buffer) (point-min) delimline)))
- (or smtp-server "localhost"))))
+ (or wl-smtp-posting-server smtp-server "localhost"))
(smtp-service (or wl-smtp-posting-port smtp-service))
(smtp-local-domain (or smtp-local-domain wl-local-domain))
(id (std11-field-body "message-id"))
(wl-draft-write-sendlog 'failed 'smtp smtp-server
recipients id)
(if (and (eq (car err) 'smtp-response-error)
- (/= (nth 1 err) 334))
+ (= (nth 1 err) 535))
(elmo-remove-passwd
(wl-smtp-password-key
smtp-sasl-user-name
(car smtp-sasl-mechanisms)
smtp-server)))
+ (signal (car err) (cdr err)))
+ (quit
+ (wl-draft-write-sendlog 'uncertain 'smtp smtp-server
+ recipients id)
(signal (car err) (cdr err)))))
(wl-draft-set-sent-message 'mail 'sent)
(wl-draft-write-sendlog
(defun wl-draft-insert-required-fields (&optional force-msgid)
"Insert Message-ID, Date, and From field.
-If FORCE-MSGID, ignore 'wl-insert-message-id'."
+If FORCE-MSGID, insert message-id regardless of `wl-insert-message-id'."
;; Insert Message-Id field...
(goto-char (point-min))
(when (and (or force-msgid
(defun wl-draft-dispatch-message (&optional mes-string)
"Send the message in the current buffer. Not modified the header fields."
- (let (delimline)
+ (let (delimline mime-bcc)
(if (and wl-draft-verbose-send mes-string)
- (message mes-string))
+ (message "%s" mes-string))
;; get fcc folders.
(setq delimline (wl-draft-get-header-delimiter t))
(unless wl-draft-fcc-list
(if (or (not (or wl-draft-force-queuing
wl-draft-force-queuing-mail))
(memq 'mail wl-sent-message-queued))
- (funcall wl-draft-send-mail-function)
+ (progn
+ (setq mime-bcc (wl-draft-mime-bcc-field))
+ (funcall wl-draft-send-mail-function)
+ (when (not (zerop (length mime-bcc)))
+ (wl-draft-do-mime-bcc mime-bcc)))
(push 'mail wl-sent-message-queued)
(wl-draft-set-sent-message 'mail 'unplugged)))
(if (and (wl-message-news-p)
(funcall wl-draft-send-news-function)
(push 'news wl-sent-message-queued)
(wl-draft-set-sent-message 'news 'unplugged))))
- ;;
(let* ((status (wl-draft-sent-message-results))
(unplugged-via (car status))
(sent-via (nth 1 status)))
;; If one sent, process fcc folder.
(if (and sent-via wl-draft-fcc-list)
(progn
- (wl-draft-do-fcc (wl-draft-get-header-delimiter) wl-draft-fcc-list)
+ (wl-draft-do-fcc (wl-draft-get-header-delimiter)
+ wl-draft-fcc-list)
(setq wl-draft-fcc-list nil)))
(if wl-draft-use-cache
(let ((id (std11-field-body "Message-ID"))
(setq wl-draft-verbose-msg
(format "Sending%s and Queuing%s..."
sent-via unplugged-via))
- (message (concat wl-draft-verbose-msg "done")))
+ (message "%sdone" wl-draft-verbose-msg))
(if mes-string
- (message (concat mes-string
- (if sent-via "done" "failed")))))))))
+ (message "%s%s"
+ mes-string
+ (if sent-via "done" "failed"))))))))
(not wl-sent-message-modified)) ;; return value
(defun wl-draft-raw-send (&optional kill-when-done force-pre-hook mes-string)
(setq locals (cdr locals)))
result))
+(defcustom wl-draft-send-confirm-with-preview t
+ "Non-nil to invoke preview through confirmation of sending.
+This variable is valid when `wl-interactive-send' has non-nil value."
+ :type 'boolean
+ :group 'wl-draft)
+
+(defun wl-draft-send-confirm ()
+ (let (answer)
+ (unwind-protect
+ (condition-case quit
+ (progn
+ (when wl-draft-send-confirm-with-preview
+ (wl-draft-preview-message))
+ (save-excursion
+ (goto-char (point-min)) ; to show recipients in header
+ (catch 'done
+ (while t
+ (message "Send current draft? <y/n/j(up)/k(down)> ")
+ (setq answer (let ((cursor-in-echo-area t)) (read-char)))
+ (cond
+ ((or (eq answer ?y)
+ (eq answer ?Y)
+ (eq answer ? ))
+ (throw 'done t))
+ ((or (eq answer ?v)
+ (eq answer ?j)
+ (eq answer ?J))
+ (condition-case err
+ (scroll-up)
+ (error nil)))
+ ((or (eq answer ?^)
+ (eq answer ?k)
+ (eq answer ?K))
+ (condition-case err
+ (scroll-down)
+ (error nil)))
+ (t
+ (throw 'done nil)))))))
+ (quit nil))
+ (when wl-draft-send-confirm-with-preview
+ (mime-preview-quit)))))
+
(defun wl-draft-send (&optional kill-when-done mes-string)
"Send current draft message.
If KILL-WHEN-DONE is non-nil, current draft buffer is killed"
;; (wl-draft-config-exec)
(run-hooks 'wl-draft-send-hook)
(when (or (not wl-interactive-send)
- (y-or-n-p "Do you really want to send current draft? "))
+ (wl-draft-send-confirm))
(let ((send-mail-function 'wl-draft-raw-send)
(editing-buffer (current-buffer))
(sending-buffer (wl-draft-generate-clone-buffer
(wl-draft-verbose-msg nil)
err)
(unwind-protect
- (save-excursion (set-buffer sending-buffer)
+ (save-excursion
+ (set-buffer sending-buffer)
(if (and (not (wl-message-mail-p))
(not (wl-message-news-p)))
(error "No recipient is specified"))
- (expand-abbrev) ; for mail-abbrevs
- (run-hooks 'mail-send-hook) ; translate buffer
+ (expand-abbrev) ; for mail-abbrevs
+ (let ((mime-header-encode-method-alist
+ (append
+ '((wl-draft-eword-encode-address-list
+ . (To Cc Bcc Resent-To Resent-Cc Resent-Bcc From)))
+ (if (boundp 'mime-header-encode-method-alist)
+ (symbol-value 'mime-header-encode-method-alist)))))
+ (run-hooks 'mail-send-hook) ; translate buffer
+ )
+ ;;
(if wl-draft-verbose-send
- (message (or mes-string "Sending...")))
+ (message "%s" (or mes-string "Sending...")))
(funcall wl-draft-send-function editing-buffer kill-when-done)
;; Now perform actions on successful sending.
(while mail-send-actions
(cdr (car mail-send-actions)))
(error))
(setq mail-send-actions (cdr mail-send-actions)))
-;; (if (or (eq major-mode 'wl-draft-mode)
-;; (eq major-mode 'mail-mode))
-;; (local-set-key "\C-c\C-s" 'wl-draft-send)) ; override
(if wl-draft-verbose-send
- (message (concat (or wl-draft-verbose-msg
- mes-string "Sending...")
- "done"))))
+ (message "%sdone"
+ (or wl-draft-verbose-msg
+ mes-string
+ "Sending..."))))
;; kill sending buffer, anyway.
(and (buffer-live-p sending-buffer)
(kill-buffer sending-buffer))))))
+(defun wl-draft-mime-bcc-field ()
+ "Return the MIME-Bcc field body. The field is deleted."
+ (prog1 (std11-field-body wl-draft-mime-bcc-field-name)
+ (wl-draft-delete-field wl-draft-mime-bcc-field-name)))
+
+(defun wl-draft-do-mime-bcc (field-body)
+ "Send MIME-Bcc (Encapsulated blind carbon copy)."
+ (let ((orig-from (mime-decode-field-body (std11-field-body "from")
+ 'From))
+ (orig-subj (mime-decode-field-body (or (std11-field-body "subject")
+ "")
+ 'Subject))
+ (recipients (wl-parse-addresses field-body))
+ (draft-buffer (current-buffer))
+ wl-draft-use-frame)
+ (save-window-excursion
+ (when (and (not wl-draft-doing-mime-bcc) ; To avoid infinite loop.
+ (not (zerop (length field-body))))
+ (let ((wl-draft-doing-mime-bcc t))
+ (dolist (recipient recipients)
+ (wl-draft-create-buffer)
+ (wl-draft-create-contents
+ (append `((From . ,orig-from)
+ (To . ,recipient)
+ (Subject . ,(concat "A blind carbon copy ("
+ orig-subj
+ ")")))
+ (wl-draft-default-headers)))
+ (wl-draft-insert-mail-header-separator)
+ (wl-draft-prepare-edit)
+ (goto-char (point-max))
+ (insert (or wl-draft-mime-bcc-body
+ "This is a blind carbon copy.")
+ "\n")
+ (mime-edit-insert-tag "message" "rfc822")
+ (insert-buffer draft-buffer)
+ (let (wl-interactive-send)
+ (wl-draft-send 'kill-when-done))))))))
+
+;; Derived from `message-save-drafts' in T-gnus.
(defun wl-draft-save ()
- "Save current draft.
-Derived from `message-save-drafts' in T-gnus."
+ "Save current draft."
(interactive)
(if (buffer-modified-p)
(progn
(if (or (not bufname)
(string-equal bufname "")
(string-equal bufname (buffer-name)))
- (wl-draft-save-and-exit)
+ (let ((bufname (current-buffer)))
+ (when (or (not (buffer-modified-p))
+ (yes-or-no-p
+ (format "Buffer %s modified; kill anyway? " bufname)))
+ (set-buffer-modified-p nil)
+ (wl-draft-hide bufname)
+ (kill-buffer bufname)))
(kill-buffer bufname))))
(defun wl-draft-save-and-exit ()
(point-max)))))))
(defun wl-draft-get-fcc-list (header-end)
- (let (fcc-list
- (case-fold-search t))
- (or (markerp header-end) (error "HEADER-END must be a marker"))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "^Fcc:[ \t]*" header-end t)
- (setq fcc-list
- (cons (buffer-substring-no-properties
- (point)
- (progn
- (end-of-line)
- (skip-chars-backward " \t")
- (point)))
- fcc-list))
- (save-match-data
- (wl-folder-confirm-existence
- (wl-folder-get-elmo-folder (eword-decode-string (car fcc-list)))))
- (delete-region (match-beginning 0)
- (progn (forward-line 1) (point)))))
- fcc-list))
+ (if (and wl-draft-doing-mime-bcc
+ wl-draft-disable-fcc-for-mime-bcc)
+ (progn
+ (wl-draft-delete-field "fcc")
+ nil)
+ (let (fcc-list
+ (case-fold-search t))
+ (or (markerp header-end) (error "HEADER-END must be a marker"))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^Fcc:[ \t]*" header-end t)
+ (save-match-data
+ (setq fcc-list
+ (append fcc-list
+ (split-string
+ (buffer-substring-no-properties
+ (point)
+ (progn
+ (end-of-line)
+ (skip-chars-backward " \t")
+ (point)))
+ ",[ \t]*")))
+ (dolist (folder fcc-list)
+ (wl-folder-confirm-existence
+ (wl-folder-get-elmo-folder (eword-decode-string folder)))))
+ (delete-region (match-beginning 0)
+ (progn (forward-line 1) (point)))))
+ fcc-list)))
(defun wl-draft-do-fcc (header-end &optional fcc-list)
(let ((send-mail-buffer (current-buffer))
(if (elmo-folder-append-buffer
(wl-folder-get-elmo-folder
(eword-decode-string (car fcc-list)))
- (not wl-fcc-force-as-read))
+ (and wl-fcc-force-as-read 'read))
(wl-draft-write-sendlog 'ok 'fcc nil (car fcc-list) id)
(wl-draft-write-sendlog 'failed 'fcc nil (car fcc-list) id))
(setq fcc-list (cdr fcc-list)))))
nil
(if (re-search-forward ":" pos t) nil t)))))))
-(defun wl-draft-random-alphabet ()
- (let ((alphabet '(?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z)))
- (nth (abs (% (random) 26)) alphabet)))
-
;;;;;;;;;;;;;;;;
;;;###autoload
-(defun wl-draft (&optional to subject in-reply-to cc references newsgroups
- mail-followup-to
+(defun wl-draft (&optional header-alist
content-type content-transfer-encoding
- body edit-again summary-buf from parent-folder)
+ body edit-again
+ parent-folder)
"Write and send mail/news message with Wanderlust."
(interactive)
(require 'wl)
(let (wl-demo)
(wl-init)) ; returns immediately if already initialized.
- (let (buf-name header-alist)
+
+ (let (buf-name header-alist-internal)
(setq buf-name
- (wl-draft-create-buffer
- (or
- (eq this-command 'wl-draft)
- (eq this-command 'wl-summary-write)
- (eq this-command 'wl-summary-write-current-folder))
- parent-folder summary-buf))
- (setq header-alist
- (list
- (cons "From: " (or from wl-from))
- (cons "To: " (or to
- (and
- (or (interactive-p)
- (eq this-command 'wl-summary-write))
- "")))
- (cons "Cc: " cc)
- (cons "Subject: " (or subject ""))
- (cons "Newsgroups: " newsgroups)
- (cons "Mail-Followup-To: " mail-followup-to)
- (cons "In-Reply-To: " in-reply-to)
- (cons "References: " references)))
+ (wl-draft-create-buffer parent-folder))
+
+ (unless (cdr (assq 'From header-alist))
+ (setq header-alist
+ (append (list (cons 'From wl-from)) header-alist)))
+ (unless (cdr (assq 'To header-alist))
+ (let ((to))
+ (when (setq to (and
+ (interactive-p)
+ ""))
+ (if (assq 'To header-alist)
+ (setcdr (assq 'To header-alist) to)
+ (setq header-alist
+ (append header-alist
+ (list (cons 'To to))))))))
+ (unless (cdr (assq 'Subject header-alist))
+ (if (assq 'Subject header-alist)
+ (setcdr (assq 'Subject header-alist) "")
+ (setq header-alist
+ (append header-alist (list (cons 'Subject ""))))))
(setq header-alist (append header-alist
(wl-draft-default-headers)
- (if body (list "" body))))
+ wl-draft-additional-header-alist
+ (if body (list "" (cons 'Body body)))))
(wl-draft-create-contents header-alist)
(if edit-again
(wl-draft-decode-body
(wl-draft-prepare-edit)
(if (interactive-p)
(run-hooks 'wl-mail-setup-hook))
-
(goto-char (point-min))
(wl-user-agent-compose-internal) ;; user-agent
- (cond ((eq this-command 'wl-summary-write-current-newsgroup)
- (mail-position-on-field "Subject"))
- ((and (interactive-p) (null to))
+ (cond ((and
+ (interactive-p)
+ (string= (cdr (assq 'To header-alist)) ""))
(mail-position-on-field "To"))
(t
(goto-char (point-max))))
buf-name))
-(defun wl-draft-create-buffer (&optional full parent-folder summary-buf)
+(defun wl-draft-create-buffer (&optional parent-folder)
(let* ((draft-folder (wl-folder-get-elmo-folder wl-draft-folder))
(parent-folder (or parent-folder (wl-summary-buffer-folder-name)))
- (summary-buf (or summary-buf (wl-summary-get-buffer parent-folder)))
- buf-name file-name num change-major-mode-hook)
+ (summary-buf (wl-summary-get-buffer parent-folder))
+ (reply-or-forward
+ (or (eq this-command 'wl-summary-reply)
+ (eq this-command 'wl-summary-reply-with-citation)
+ (eq this-command 'wl-summary-forward)
+ (eq this-command 'wl-summary-target-mark-forward)
+ (eq this-command 'wl-summary-target-mark-reply-with-citation)))
+ buf-name file-name num change-major-mode-hook)
(if (not (elmo-folder-message-file-p draft-folder))
(error "%s folder cannot be used for draft folder" wl-draft-folder))
(setq num (elmo-max-of-list
(elmo-message-file-name
(wl-folder-get-elmo-folder wl-draft-folder)
num))))
+ ;; switch-buffer according to draft buffer style.
(if wl-draft-use-frame
(switch-to-buffer-other-frame buf-name)
- (switch-to-buffer buf-name))
+ (if reply-or-forward
+ (case wl-draft-reply-buffer-style
+ (split
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer buf-name))
+ (keep
+ (switch-to-buffer buf-name))
+ (full
+ (delete-other-windows)
+ (switch-to-buffer buf-name))
+ (t
+ (if (functionp wl-draft-reply-buffer-style)
+ (funcall wl-draft-reply-buffer-style buf-name)
+ (error "Invalid value for wl-draft-reply-buffer-style"))))
+ (case wl-draft-buffer-style
+ (split
+ (when (eq major-mode 'wl-summary-mode)
+ (wl-summary-toggle-disp-msg 'off))
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer buf-name))
+ (keep
+ (switch-to-buffer buf-name))
+ (full
+ (delete-other-windows)
+ (switch-to-buffer buf-name))
+ (t (if (functionp wl-draft-buffer-style)
+ (funcall wl-draft-buffer-style buf-name)
+ (error "Invalid value for wl-draft-buffer-style"))))))
(set-buffer buf-name)
(if (not (string-match (regexp-quote wl-draft-folder)
(buffer-name)))
(rename-buffer (concat wl-draft-folder "/" (int-to-string num))))
- (if (or (eq wl-draft-reply-buffer-style 'full)
- full)
- (delete-other-windows))
(auto-save-mode -1)
(wl-draft-mode)
(make-local-variable 'truncate-partial-width-windows)
(setq wl-sent-message-queued nil)
(setq wl-draft-buffer-file-name file-name)
(setq wl-draft-config-exec-flag t)
- (setq wl-draft-parent-folder parent-folder)
- (setq wl-draft-buffer-cur-summary-buffer summary-buf)
+ (setq wl-draft-parent-folder (or parent-folder ""))
+ (or (eq this-command 'wl-folder-write-current-folder)
+ (setq wl-draft-buffer-cur-summary-buffer summary-buf))
buf-name))
(defun wl-draft-create-contents (header-alist)
"header-alist' sample
'(function ;; funcall
string ;; insert string
- (string . string) ;; insert string string
- (string . function) ;; insert string (funcall)
- (string . nil) ;; insert nothing
- (function . (arg1 arg2 ..)) ;; call function with argument
- nil ;; insert nothing
-"
+ (symbol . string) ;; insert symbol-value: string
+ (symbol . function) ;; (funcall) and if it returns string,
+ ;; insert symbol-value: string
+ (symbol . nil) ;; do nothing
+ nil ;; do nothing
+ )"
(unless (eq major-mode 'wl-draft-mode)
- (error "wl-draft-create-header must be use in wl-draft-mode."))
+ (error "`wl-draft-create-header' must be use in wl-draft-mode"))
(let ((halist header-alist)
field value)
(while halist
(setq field (car (car halist)))
(setq value (cdr (car halist)))
(cond
- ((functionp field) (apply field value))
- ((stringp field)
+ ((symbolp field)
(cond
- ((stringp value) (insert field value "\n"))
- ((functionp value) (insert field (funcall value) "\n"))
+ ((eq field 'Body) ; body
+ (insert value))
+ ((stringp value) (insert (symbol-name field) ": " value "\n"))
+ ((functionp value)
+ (let ((value-return (funcall value)))
+ (when (stringp value-return)
+ (insert (symbol-name field) ": " value-return "\n"))))
((not value))
(t
(debug))))
(defun wl-draft-prepare-edit ()
(unless (eq major-mode 'wl-draft-mode)
- (error "wl-draft-create-header must be use in wl-draft-mode."))
+ (error "`wl-draft-create-header' must be use in wl-draft-mode"))
(let (change-major-mode-hook)
(wl-draft-editor-mode)
- (add-hook 'local-write-file-hooks 'wl-draft-save)
+ (when wl-draft-write-file-function
+ (add-hook 'local-write-file-hooks wl-draft-write-file-function))
(wl-draft-overload-functions)
(wl-highlight-headers 'for-draft)
(wl-draft-save)
(if (not (= (preceding-char) ?\n))
(insert ?\n)))
-(defsubst wl-draft-insert-ccs (str cc)
+(defsubst wl-draft-trim-ccs (cc)
(let ((field
(if (functionp cc)
(funcall cc)
(wl-parse-addresses (std11-field-body "To"))
(wl-parse-addresses (std11-field-body "Cc"))))
(mapcar 'downcase wl-subscribed-mailing-list)))))
- (insert str field "\n"))))
+ field
+ nil)))
(defsubst wl-draft-default-headers ()
(list
- (cons "Mail-Reply-To: " (and wl-insert-mail-reply-to
- (wl-address-header-extract-address
- wl-from)))
- (cons "" wl-generate-mailer-string-function)
- (cons "Reply-To: " mail-default-reply-to)
- (cons 'wl-draft-insert-ccs
- (list "Bcc: " (or wl-bcc
- (and mail-self-blind (user-login-name)))))
- (cons 'wl-draft-insert-ccs
- (list "Fcc: " wl-fcc))
- (cons "Organization: " wl-organization)
+ (cons 'Mail-Reply-To (and wl-insert-mail-reply-to
+ (wl-address-header-extract-address
+ wl-from)))
+ (cons 'User-Agent wl-generate-mailer-string-function)
+ (cons 'Reply-To mail-default-reply-to)
+ (cons 'Bcc (function
+ (lambda ()
+ (wl-draft-trim-ccs
+ (or wl-bcc (and mail-self-blind (user-login-name)))))))
+ (cons 'Fcc (function
+ (lambda ()
+ (wl-draft-trim-ccs wl-fcc))))
+ (cons 'Organization wl-organization)
(and wl-auto-insert-x-face
(file-exists-p wl-x-face-file)
'wl-draft-insert-x-face-field-here) ;; allow nil
mail-default-headers
;; check \n at th end of line for `mail-default-headers'
'wl-draft-check-new-line
-; wl-draft-default-headers
-; 'wl-draft-check-new-line
))
(defun wl-draft-insert-mail-header-separator (&optional delimline)
(progn
(insert mail-header-separator "\n")
(1- (point)))
- 'category 'mail-header-separator)))
+ 'category 'mail-header-separator)
+ (point)))
;;;;;;;;;;;;;;;;
(elmo-nntp-default-port
(or wl-nntp-posting-port elmo-nntp-default-port))
(elmo-nntp-default-stream-type
- (or wl-nntp-posting-stream-type elmo-nntp-default-stream-type)))
+ (or wl-nntp-posting-stream-type elmo-nntp-default-stream-type))
+ (elmo-nntp-default-function wl-nntp-posting-function)
+ condition)
+ (if (setq condition (cdr (elmo-string-matched-assoc
+ (std11-field-body "Newsgroups")
+ wl-nntp-posting-config-alist)))
+ (if (stringp condition)
+ (setq elmo-nntp-default-server condition)
+ (while (car condition)
+ (set (intern (format "elmo-nntp-default-%s"
+ (symbol-name (caar condition))))
+ (cdar condition))
+ (setq condition (cdr condition)))))
+ (unless elmo-nntp-default-function
+ (error "wl-draft-nntp-send: posting-function is nil"))
(if (not (elmo-plugged-p elmo-nntp-default-server elmo-nntp-default-port))
(wl-draft-set-sent-message 'news 'unplugged
(cons elmo-nntp-default-server
elmo-nntp-default-port))
- (elmo-nntp-post elmo-nntp-default-server (current-buffer))
+ (funcall elmo-nntp-default-function
+ elmo-nntp-default-server (current-buffer))
(wl-draft-set-sent-message 'news 'sent)
(wl-draft-write-sendlog 'ok 'nntp elmo-nntp-default-server
(std11-field-body "Newsgroups")
(setq local-variables (cdr local-variables)))
(current-buffer))))
+(defun wl-draft-remove-text-plain-tag ()
+ "Remove text/plain tag of mime-edit."
+ (when (string= (mime-make-text-tag "plain")
+ (buffer-substring-no-properties (point-at-bol)(point-at-eol)))
+ (delete-region (point-at-bol)(1+ (point-at-eol)))))
+
(defun wl-draft-reedit (number)
(let ((draft-folder (wl-folder-get-elmo-folder wl-draft-folder))
(wl-draft-reedit t)
- buffer file-name change-major-mode-hook)
+ buffer file-name change-major-mode-hook body-top)
(setq file-name (elmo-message-file-name draft-folder number))
(unless (file-exists-p file-name)
(error "File %s does not exist" file-name))
(switch-to-buffer buffer))
(set-buffer buffer))
(setq buffer (get-buffer-create (number-to-string number)))
+ ;; switch-buffer according to draft buffer style.
(if wl-draft-use-frame
(switch-to-buffer-other-frame buffer)
- (switch-to-buffer buffer))
+ (case wl-draft-buffer-style
+ (split
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer buffer))
+ (keep
+ (switch-to-buffer buffer))
+ (full
+ (delete-other-windows)
+ (switch-to-buffer buffer))
+ (t (if (functionp wl-draft-buffer-style)
+ (funcall wl-draft-buffer-style buffer)
+ (error "Invalid value for wl-draft-buffer-style")))))
(set-buffer buffer)
+ (setq wl-draft-parent-folder "")
(insert-file-contents-as-binary file-name)
+ (elmo-delete-cr-buffer)
(let((mime-edit-again-ignored-field-regexp
"^\\(Content-.*\\|Mime-Version\\):"))
(wl-draft-decode-message-in-buffer))
- (wl-draft-insert-mail-header-separator)
+ (setq body-top (wl-draft-insert-mail-header-separator))
(if (not (string-match (regexp-quote wl-draft-folder)
(buffer-name)))
(rename-buffer (concat wl-draft-folder "/" (buffer-name))))
(goto-char (point-min))
(wl-draft-overload-functions)
(wl-draft-editor-mode)
- (add-hook 'local-write-file-hooks 'wl-draft-save)
+ (when wl-draft-write-file-function
+ (add-hook 'local-write-file-hooks wl-draft-write-file-function))
(wl-highlight-headers 'for-draft)
+ (goto-char body-top)
(run-hooks 'wl-draft-reedit-hook)
(goto-char (point-max))
buffer)))
(beginning-of-line)
(goto-char (point-max))))))
+(defsubst wl-draft-config-sub-eval-insert (content &optional newline)
+ (let (content-value)
+ (when (and content
+ (stringp (setq content-value (eval content))))
+ (insert content-value)
+ (if newline (insert "\n")))))
+
(defun wl-draft-config-sub-body (content)
(wl-draft-body-goto-top)
(delete-region (point) (point-max))
- (if content (insert (eval content))))
+ (wl-draft-config-sub-eval-insert content))
(defun wl-draft-config-sub-top (content)
(wl-draft-body-goto-top)
- (if content (insert (eval content))))
+ (wl-draft-config-sub-eval-insert content))
(defun wl-draft-config-sub-bottom (content)
(wl-draft-body-goto-bottom)
- (if content (insert (eval content))))
+ (wl-draft-config-sub-eval-insert content))
(defun wl-draft-config-sub-header (content)
(wl-draft-config-body-goto-header)
- (if content (insert (concat (eval content) "\n"))))
+ (wl-draft-config-sub-eval-insert content 'newline))
(defun wl-draft-config-sub-header-top (content)
(goto-char (point-min))
- (if content (insert (concat (eval content) "\n"))))
+ (wl-draft-config-sub-eval-insert content 'newline))
(defun wl-draft-config-sub-part-top (content)
(goto-char (mime-edit-content-beginning))
- (if content (insert (concat (eval content) "\n"))))
+ (wl-draft-config-sub-eval-insert content 'newline))
(defun wl-draft-config-sub-part-bottom (content)
(goto-char (mime-edit-content-end))
- (if content (insert (concat (eval content) "\n"))))
+ (wl-draft-config-sub-eval-insert content 'newline))
(defsubst wl-draft-config-sub-file (content)
(let ((coding-system-for-read wl-cs-autoconv)
(wl-draft-config-exec config-alist reply-buf)))))
(defun wl-draft-config-exec (&optional config-alist reply-buf)
- "Change headers in draft sending time."
+ "Change headers according to the value of `wl-draft-config-alist'.
+Automatically applied in draft sending time."
(interactive)
(let ((case-fold-search t)
(alist (or config-alist wl-draft-config-alist))
(let ((send-buffer (current-buffer))
(folder (wl-folder-get-elmo-folder wl-queue-folder))
(message-id (std11-field-body "Message-ID")))
- (if (elmo-folder-append-buffer folder t)
+ (if (elmo-folder-append-buffer folder)
(progn
(wl-draft-queue-info-operation
(car (elmo-folder-status folder))
(interactive "P")
(if arg
(wl-jump-to-draft-folder)
- (let ((bufs (buffer-list))
- (draft-regexp (concat
- "^" (regexp-quote
- (elmo-localdir-folder-directory-internal
- (wl-folder-get-elmo-folder wl-draft-folder)))))
- buf draft-bufs)
- (while bufs
- (if (and
- (setq buf (with-current-buffer (car bufs)
- wl-draft-buffer-file-name))
- (string-match draft-regexp buf))
- (setq draft-bufs (cons (buffer-name (car bufs)) draft-bufs)))
- (setq bufs (cdr bufs)))
+ (let ((draft-bufs (wl-collect-draft))
+ buf)
(cond
((null draft-bufs)
(message "No draft buffer exist."))
(t
(setq draft-bufs
- (sort draft-bufs (function (lambda (a b) (not (string< a b))))))
- (if (setq buf (cdr (member (buffer-name) draft-bufs)))
+ (sort (mapcar 'buffer-name draft-bufs)
+ (function (lambda (a b)
+ (not (string< a b))))))
+ (if (setq buf (cdr (member (buffer-name)
+ draft-bufs)))
(setq buf (car buf))
(setq buf (car draft-bufs)))
(switch-to-buffer buf))))))
(defun wl-draft-highlight-and-recenter (&optional n)
(interactive "P")
- (if wl-highlight-body-too
- (let ((beg (point-min))
- (end (point-max)))
- (put-text-property beg end 'face nil)
- (wl-highlight-message beg end t)))
+ (when wl-highlight-body-too
+ (let ((modified (buffer-modified-p)))
+ (unwind-protect
+ (progn
+ (put-text-property (point-min) (point-max) 'face nil)
+ (wl-highlight-message (point-min) (point-max) t))
+ (set-buffer-modified-p modified))))
(recenter n))
;;;; user-agent support by Sen Nagata
(unless (featurep 'wl)
(require 'wl))
+ (or switch-function
+ (setq switch-function 'keep))
;; protect these -- to and subject get bound at some point, so it looks
;; to be necessary to protect the values used w/in
(let ((wl-user-agent-headers-and-body-alist other-headers)
(wl-draft-use-frame (eq switch-function 'switch-to-buffer-other-frame))
- (wl-draft-reply-buffer-style 'split))
- (when (eq switch-function 'switch-to-buffer-other-window)
- (when (one-window-p t)
- (if (window-minibuffer-p) (other-window 1))
- (split-window))
- (other-window 1))
+ (wl-draft-buffer-style switch-function))
(if to
(if (wl-string-match-assoc "to" wl-user-agent-headers-and-body-alist
'ignore-case)