>From c6222dcbb210dae3998fed3400d4c7de08c1bb82 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 20 Jul 2010 23:35:13 +0100 Subject: [PATCH 1/3] New functions to send emails in mbox files from dired New functions gnus-dired-map-over-mbox, gnus-dired-import-mbox-as-draft and gnus-dired-send-mbox. Load message.el in gnus-dired-map-over-mbox for message-unix-mail-delimiter. --- lisp/gnus/gnus-dired.el | 63 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 62 insertions(+), 1 deletions(-) diff --git a/lisp/gnus/gnus-dired.el b/lisp/gnus/gnus-dired.el index 595a9fe..9d8713c 100644 --- a/lisp/gnus/gnus-dired.el +++ b/lisp/gnus/gnus-dired.el @@ -40,6 +40,7 @@ ;;; Code: (require 'dired) +(eval-when-compile (require 'cl)) (autoload 'mml-attach-file "mml") (autoload 'mm-default-file-encoding "mm-decode");; Shift this to `mailcap.el'? (autoload 'mailcap-extension-to-mime "mailcap") @@ -64,8 +65,10 @@ (setq gnus-dired-mode-map (make-sparse-keymap)) (define-key gnus-dired-mode-map "\C-c\C-m\C-a" 'gnus-dired-attach) + (define-key gnus-dired-mode-map "\C-c\C-m\C-i" 'gnus-dired-import-mbox-as-draft) (define-key gnus-dired-mode-map "\C-c\C-m\C-l" 'gnus-dired-find-file-mailcap) - (define-key gnus-dired-mode-map "\C-c\C-m\C-p" 'gnus-dired-print)) + (define-key gnus-dired-mode-map "\C-c\C-m\C-p" 'gnus-dired-print) + (define-key gnus-dired-mode-map "\C-c\C-m\C-s" 'gnus-dired-send-mbox)) ;; FIXME: Make it customizable, change the default to `mail-user-agent' when ;; this file is renamed (e.g. to `dired-mime.el'). @@ -185,6 +188,64 @@ filenames." (setq files-to-attach (cdr files-to-attach))) (message "Attached file(s) %s" files-str)))) +(defvar message-unix-mail-delimiter) ; quiet compiler +(autoload 'gnus-alive-p "gnus-util") + +(declare-function nndraft-request-associate-buffer "nndraft") +(declare-function gnus-agent-queue-setup "gnus-agent") +(declare-function message-fetch-field "message") +(declare-function message-add-header "message") +(declare-function message-send "message") +(declare-function message-narrow-to-headers-or-head "message") + +(defun gnus-dired-map-over-mbox (function mbox-files) + "Call FUNCTION for each email in MBOX-FILES." + (require 'message) + (let (beg end email) + (dolist (m mbox-files) + (with-temp-buffer + (insert-file-contents m) + (while (re-search-forward message-unix-mail-delimiter nil t) + (replace-match "") + (setq beg (point)) + (if (re-search-forward message-unix-mail-delimiter nil t) + (setq end (goto-char (match-beginning 0))) + (setq end (point-max))) + (setq email (buffer-substring beg end)) + (delete-region beg end) + (with-temp-buffer + (insert email) + (goto-char (point-min)) + (re-search-forward "^$") + (insert mail-header-separator) + (funcall function))))))) + +(defun gnus-dired-import-mbox-as-draft (&rest mbox-files) + "Import emails in MBOX-FILES into the draft group." + (interactive (dired-get-marked-files)) + (assert (gnus-alive-p) nil "Gnus is not running") + (gnus-agent-queue-setup "drafts") + (gnus-dired-map-over-mbox + (lambda () + (nndraft-request-associate-buffer "drafts") + (save-buffer 0)) + mbox-files)) + +(defun gnus-dired-send-mbox (&rest mbox-files) + "Send all emails in MBOX-FILES." + (interactive (dired-get-marked-files)) + (let (to-address) + (gnus-dired-map-over-mbox + (lambda () + (message-mode) + (message-narrow-to-headers-or-head) + (unless (message-fetch-field "to") + (unless to-address + (setq to-address (read-string "To address: "))) + (message-add-header (format "To: %s" to-address))) + (message-send)) + mbox-files))) + (autoload 'mailcap-parse-mailcaps "mailcap" "" t) (defun gnus-dired-find-file-mailcap (&optional file-name arg) -- 1.7.3