annotate lisp/net/imap-hash.el @ 105498:3cdeeb563149

Markus Rost <rost at math.uni-bielefeld.de> (describe-no-warranty): Place point in a slightly better position in the GPLv3 text.
author Glenn Morris <rgm@gnu.org>
date Wed, 07 Oct 2009 02:52:37 +0000
parents 7f4c7f5c0eba
children ac408704629c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
105223
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
1 ;;; imap-hash.el --- Hashtable-like interface to an IMAP mailbox
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
2
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
3 ;; Copyright (C) 2009 Free Software Foundation, Inc.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
4
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
5 ;; Author: Teodor Zlatanov <tzz@lifelogs.com>
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
6 ;; Keywords: mail
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
7
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
8 ;; This program is free software; you can redistribute it and/or modify
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
9 ;; it under the terms of the GNU General Public License as published by
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
10 ;; the Free Software Foundation, either version 3 of the License, or
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
11 ;; (at your option) any later version.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
12
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
13 ;; This program is distributed in the hope that it will be useful,
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
16 ;; GNU General Public License for more details.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
17
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
18 ;; You should have received a copy of the GNU General Public License
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
19 ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
20
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
21 ;;; Commentary:
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
22
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
23 ;; This module provides hashtable-like functions on top of imap.el
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
24 ;; functionality. All the authentication is handled by auth-source so
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
25 ;; there are no authentication options here, only the server and
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
26 ;; mailbox names are needed.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
27
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
28 ;; Create a IHT (imap-hash table) object with `imap-hash-make'. Then
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
29 ;; use it with `imap-hash-map' to map a function across all the
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
30 ;; messages. Use `imap-hash-get' and `imap-hash-rem' to operate on
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
31 ;; individual messages. See the tramp-imap.el library in Tramp if you
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
32 ;; need to see practical examples.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
33
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
34 ;; This only works with IMAP4r1. Sorry to everyone without it, but
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
35 ;; the compatibility code is too annoying and it's 2009.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
36
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
37 ;; TODO: Use SEARCH instead of FETCH when a test is specified. List
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
38 ;; available mailboxes. Don't select an invalid mailbox.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
39
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
40 ;;; Code:
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
41
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
42 (require 'assoc)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
43 (require 'imap)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
44 (require 'sendmail) ; for mail-header-separator
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
45 (require 'message)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
46 (autoload 'auth-source-user-or-password "auth-source")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
47
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
48 ;; retrieve these headers
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
49 (defvar imap-hash-headers
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
50 (append '(Subject From Date Message-Id References In-Reply-To Xref)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
51
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
52 ;; from nnheader.el
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
53 (defsubst imap-hash-remove-cr-followed-by-lf ()
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
54 (goto-char (point-max))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
55 (while (search-backward "\r\n" nil t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
56 (delete-char 1)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
57
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
58 ;; from nnheader.el
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
59 (defun imap-hash-ms-strip-cr (&optional string)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
60 "Strip ^M from the end of all lines in current buffer or STRING."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
61 (if string
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
62 (with-temp-buffer
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
63 (insert string)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
64 (imap-hash-remove-cr-followed-by-lf)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
65 (buffer-string))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
66 (save-excursion
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
67 (imap-hash-remove-cr-followed-by-lf))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
68
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
69 (defun imap-hash-make (server port mailbox &optional user password ssl)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
70 "Makes a new imap-hash object using SERVER, PORT, and MAILBOX.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
71 SSL, USER, PASSWORD are optional.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
72 The test is set to t, meaning all messages are considered."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
73 (when (and server port mailbox)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
74 (list :server server :port port :mailbox mailbox
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
75 :ssl ssl :user user :password password
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
76 :test t)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
77
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
78 (defun imap-hash-p (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
79 "Checks whether IHT is a valid imap-hash."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
80 (and
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
81 (imap-hash-server iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
82 (imap-hash-port iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
83 (imap-hash-mailbox iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
84 (imap-hash-test iht)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
85
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
86 (defmacro imap-hash-gather (uid)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
87 `(imap-message-get ,uid 'BODYDETAIL))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
88
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
89 (defmacro imap-hash-data-body (details)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
90 `(nth 2 (nth 1 ,details)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
91
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
92 (defmacro imap-hash-data-headers (details)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
93 `(nth 2 (nth 0 ,details)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
94
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
95 (defun imap-hash-get (key iht &optional refetch)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
96 "Get the value for KEY in the imap-hash IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
97 Requires either `imap-hash-fetch' to be called beforehand
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
98 (e.g. by `imap-hash-map'), or REFETCH to be t.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
99 Returns a list of the headers (an alist, see `imap-hash-map') and
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
100 the body of the message as a string.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
101 Also see `imap-hash-test'."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
102 (with-current-buffer (imap-hash-get-buffer iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
103 (when refetch
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
104 (imap-hash-fetch iht nil key))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
105 (let ((details (imap-hash-gather key)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
106 (list
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
107 (imap-hash-get-headers
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
108 (imap-hash-data-headers details))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
109 (imap-hash-get-body
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
110 (imap-hash-data-body details))))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
111
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
112 (defun imap-hash-put (value iht &optional key)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
113 "Put VALUE in the imap-hash IHT. Returns the new key.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
114 If KEY is given, removes it.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
115 VALUE can be a list of the headers (an alist, see `imap-hash-map')
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
116 and the body of the message as a string. It can also be a uid,
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
117 in which case `imap-hash-get' will be called to get the value.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
118 Also see `imap-hash-test'."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
119 (let ((server-buffer (imap-hash-get-buffer iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
120 (value (if (listp value) value (imap-hash-get value iht)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
121 newuid)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
122 (when value
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
123 (with-temp-buffer
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
124 (funcall 'imap-hash-make-message
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
125 (nth 0 value)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
126 (nth 1 value)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
127 nil)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
128 (setq newuid (nth 1 (imap-message-append
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
129 (imap-hash-mailbox iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
130 (current-buffer) nil nil server-buffer)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
131 (when key (imap-hash-rem key iht))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
132 newuid))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
133
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
134 (defun imap-hash-make-message (headers body &optional overrides)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
135 "Make a message with HEADERS and BODY suitable for `imap-append',
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
136 using `message-setup'..
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
137 Look in the alist OVERRIDES for header overrides as per `imap-hash-headers'."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
138 ;; don't insert a signature no matter what
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
139 (let (message-signature)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
140 (message-setup
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
141 (append overrides headers))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
142 (message-generate-headers message-required-mail-headers)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
143 (message-remove-header "X-Draft-From")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
144 (message-goto-body)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
145 (insert (or (aget overrides 'body)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
146 body
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
147 ""))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
148 (goto-char (point-min))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
149 ;; TODO: make this search better
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
150 (if (search-forward mail-header-separator nil t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
151 (delete-region (line-beginning-position) (line-end-position))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
152 (error "Could not find the body separator in the encoded message!"))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
153
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
154 (defun imap-hash-rem (key iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
155 "Remove KEY in the imap-hash IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
156 Also see `imap-hash-test'. Requires `imap-hash-fetch' to have
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
157 been called and the imap-hash server buffer to be current,
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
158 so it's best to use it inside `imap-hash-map'.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
159 The key will not be found on the next `imap-hash-map' call."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
160 (with-current-buffer (imap-hash-get-buffer iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
161 (imap-message-flags-add
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
162 (imap-range-to-message-set (list key))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
163 "\\Deleted" 'silent)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
164 (imap-mailbox-expunge t)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
165
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
166 (defun imap-hash-clear (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
167 "Remove all keys in the imap-hash IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
168 Also see `imap-hash-test'."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
169 (imap-hash-map (lambda (uid b c) (imap-hash-rem uid iht)) iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
170
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
171 (defun imap-hash-get-headers (text-headers)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
172 (with-temp-buffer
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
173 (insert (or text-headers ""))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
174 (imap-hash-remove-cr-followed-by-lf)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
175 (mapcar (lambda (header)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
176 (cons header
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
177 (message-fetch-field (format "%s" header))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
178 imap-hash-headers)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
179
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
180 (defun imap-hash-get-body (text)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
181 (with-temp-buffer
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
182 (insert (or text ""))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
183 (imap-hash-remove-cr-followed-by-lf)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
184 (buffer-string)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
185
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
186 (defun imap-hash-map (function iht &optional headers-only &rest messages)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
187 "Call FUNCTION for all entries in IHT and pass it the message uid,
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
188 the headers (an alist, see `imap-hash-headers'), and the body
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
189 contents as a string. If HEADERS-ONLY is not nil, the body will be nil.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
190 Returns results of evaluating, as would `mapcar'.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
191 If MESSAGES are given, iterate only over those UIDs.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
192 Also see `imap-hash-test'."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
193 (imap-hash-fetch iht headers-only)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
194 (let ((test (imap-hash-test iht)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
195 (with-current-buffer (imap-hash-get-buffer iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
196 (delq nil
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
197 (imap-message-map (lambda (message ignored-parameter)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
198 (let* ((details (imap-hash-gather message))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
199 (headers (imap-hash-data-headers details))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
200 (hlist (imap-hash-get-headers headers))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
201 (runit (cond
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
202 ((stringp test)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
203 (string-match
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
204 test
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
205 (format "%s" (aget hlist 'Subject))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
206 ((functionp test)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
207 (funcall test hlist))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
208 ;; otherwise, return test itself
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
209 (t test))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
210 ;;(debug message headers)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
211 (when runit
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
212 (funcall function
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
213 message
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
214 (imap-hash-get-headers
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
215 headers)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
216 (imap-hash-get-body
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
217 (imap-hash-data-body details))))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
218 "UID")))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
219
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
220 (defun imap-hash-count (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
221 "Counts the number of messages in the imap-hash IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
222 Also see `imap-hash-test'. It uses `imap-hash-map' so just use that
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
223 function if you want to do more than count the elements."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
224 (length (imap-hash-map (lambda (a b c)) iht t)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
225
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
226 (defalias 'imap-hash-size 'imap-hash-count)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
227
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
228 (defun imap-hash-test (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
229 "Returns the test used by `imap-hash-map' for IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
230 When the test is t, any key will be a candidate.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
231 When the test is a string, messages will be filtered on that string as a regexp
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
232 against the subject.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
233 When the test is a function, messages will be filtered with it.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
234 The function is passed the message headers (see `imap-hash-get-headers')."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
235 (plist-get iht :test))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
236
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
237 (defun imap-hash-server (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
238 "Returns the server used by the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
239 (plist-get iht :server))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
240
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
241 (defun imap-hash-port (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
242 "Returns the port used by the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
243 (plist-get iht :port))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
244
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
245 (defun imap-hash-ssl (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
246 "Returns the SSL need for the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
247 (plist-get iht :ssl))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
248
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
249 (defun imap-hash-mailbox (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
250 "Returns the mailbox used by the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
251 (plist-get iht :mailbox))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
252
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
253 (defun imap-hash-user (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
254 "Returns the username used by the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
255 (plist-get iht :user))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
256
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
257 (defun imap-hash-password (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
258 "Returns the password used by the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
259 (plist-get iht :password))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
260
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
261 (defun imap-hash-open-connection (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
262 "Open the connection used for IMAP interactions with the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
263 (let* ((server (imap-hash-server iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
264 (port (imap-hash-port iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
265 (ssl-need (imap-hash-ssl iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
266 (auth-need (not (and (imap-hash-user iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
267 (imap-hash-password iht))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
268 ;; this will not be needed if auth-need is t
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
269 (auth-info (when auth-need
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
270 (auth-source-user-or-password
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
271 '("login" "password")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
272 server port)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
273 (auth-user (or (imap-hash-user iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
274 (nth 0 auth-info)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
275 (auth-passwd (or (imap-hash-password iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
276 (nth 1 auth-info)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
277 (imap-logout-timeout nil))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
278
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
279 ;; (debug "opening server: opened+state" (imap-opened) imap-state)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
280 ;; this is the only place where IMAP vs IMAPS matters
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
281 (if (imap-open server port (if ssl-need 'ssl nil) nil (current-buffer))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
282 (progn
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
283 ;; (debug "after opening server: opened+state" (imap-opened (current-buffer)) imap-state)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
284 ;; (debug "authenticating" auth-user auth-passwd)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
285 (if (not (imap-capability 'IMAP4rev1))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
286 (error "IMAP server does not support IMAP4r1, it won't work, sorry.")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
287 (imap-authenticate auth-user auth-passwd)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
288 (imap-id)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
289 ;; (debug "after authenticating: opened+state" (imap-opened (current-buffer)) imap-state)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
290 (imap-opened (current-buffer))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
291 (error "Could not open the IMAP buffer"))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
292
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
293 (defun imap-hash-get-buffer (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
294 "Get or create the connection buffer to be used for the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
295 (let* ((name (imap-hash-buffer-name iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
296 (buffer (get-buffer name)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
297 (if (and buffer (imap-opened buffer))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
298 buffer
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
299 (when buffer (kill-buffer buffer))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
300 (with-current-buffer (get-buffer-create name)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
301 (setq buffer-undo-list t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
302 (when (imap-hash-open-connection iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
303 (current-buffer))))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
304
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
305 (defun imap-hash-buffer-name (iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
306 "Get the connection buffer to be used for the imap-hash IHT."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
307 (when (imap-hash-p iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
308 (let ((server (imap-hash-server iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
309 (port (imap-hash-port iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
310 (ssl-text (if (imap-hash-ssl iht) "SSL" "NoSSL")))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
311 (format "*imap-hash/%s:%s:%s*" server port ssl-text))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
312
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
313 (defun imap-hash-fetch (iht &optional headers-only &rest messages)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
314 "Fetch all the messages for imap-hash IHT.
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
315 Get only the headers if HEADERS-ONLY is not nil."
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
316 (with-current-buffer (imap-hash-get-buffer iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
317 (let ((range (if messages
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
318 (list
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
319 (imap-range-to-message-set messages)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
320 (imap-range-to-message-set messages))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
321 '("1:*" . "1,*:*"))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
322
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
323 ;; (with-current-buffer "*imap-debug*"
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
324 ;; (erase-buffer))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
325 (imap-mailbox-unselect)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
326 (imap-mailbox-select (imap-hash-mailbox iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
327 ;; (debug "after selecting mailbox: opened+state" (imap-opened) imap-state)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
328 ;; (setq imap-message-data (make-vector imap-message-prime 0)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
329 (imap-fetch-safe range
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
330 (concat (format "(UID RFC822.SIZE BODY %s "
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
331 (if headers-only "" "BODY.PEEK[TEXT]"))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
332 (format "BODY.PEEK[HEADER.FIELDS %s])"
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
333 imap-hash-headers))))))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
334
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
335 (provide 'imap-hash)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
336 ;;; imap-hash.el ends here
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
337
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
338 ;; ignore, for testing only
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
339
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
340 ;;; (setq iht (imap-hash-make "yourhosthere.com" "imap" "INBOX.test"))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
341 ;;; (setq iht (imap-hash-make "yourhosthere.com" "imap" "test"))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
342 ;;; (imap-hash-make "server1" "INBOX.mailbox2")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
343 ;;; (imap-hash-p iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
344 ;;; (imap-hash-get 35 iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
345 ;;; (imap-hash-get 38 iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
346 ;;; (imap-hash-get 37 iht t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
347 ;;; (mapc (lambda (buffer) (with-current-buffer buffer (erase-buffer))) '("*imap-debug*" "*imap-log*"))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
348 ;;; (imap-hash-put (imap-hash-get 5 iht) iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
349 ;;; (with-current-buffer (imap-hash-get-buffer iht) (let ((uid (imap-hash-put (imap-hash-get 5 iht) iht))) (imap-hash-put uid iht uid)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
350 ;;; (imap-hash-put (imap-hash-get 35 iht) iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
351 ;;; (imap-hash-make-message '((Subject . "normal")) "normal body")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
352 ;;; (imap-hash-make-message '((Subject . "old")) "old body" '((Subject . "new")))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
353 ;;; (imap-hash-make-message '((Subject . "old")) "old body" '((body . "new body")) (lambda (subject) (concat "overwrite-" subject)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
354 ;;; (imap-hash-make-message '((Subject . "old")) "old body" '((Subject . "change this")) (lambda (subject) (concat "overwrite-" subject)))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
355 ;;; (imap-hash-make-message '((Subject . "Twelcome")) "body here" nil)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
356 ;; (with-current-buffer (imap-hash-get-buffer iht) (imap-hash-rem (imap-hash-put (imap-hash-get 5 iht) iht) iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
357 ;;; (kill-buffer (imap-hash-buffer-name iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
358 ;;; (imap-hash-map 'debug iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
359 ;;; (imap-hash-map 'debug iht t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
360 ;;;(tramp-imap-handle-file-inode "/imap:yourhosthere.com:/test/welcome")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
361 ;;;(imap-hash-count iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
362 ;;; (mapc (lambda (buffer) (with-current-buffer buffer (erase-buffer))) '("*imap-debug*" "*imap-log*"))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
363 ;;; (kill-buffer (imap-hash-buffer-name iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
364 ;;; this should always return t if the server is up, automatically reopening if needed
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
365 ;;; (imap-opened (imap-hash-get-buffer iht))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
366 ;;; (imap-hash-buffer-name iht)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
367 ;;; (with-current-buffer (imap-hash-get-buffer iht) (debug "mailbox data, auth and state" imap-mailbox-data imap-auth imap-state))
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
368 ;;;(tramp-imap-handle-file-inode "/imap:yourhosthere.com:/test/welcome")
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
369 ;;; (imap-hash-fetch iht nil)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
370 ;;; (imap-hash-fetch iht t)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
371 ;;; (imap-hash-fetch iht nil 1 2 3)
95bdce3df18d * net/imap-hash.el: New library, see NEWS.
Teodor Zlatanov <tzz@lifelogs.com>
parents:
diff changeset
372 ;;; (imap-hash-fetch iht t 1 2 3)
105377
7f4c7f5c0eba Add arch tagline
Miles Bader <miles@gnu.org>
parents: 105223
diff changeset
373
7f4c7f5c0eba Add arch tagline
Miles Bader <miles@gnu.org>
parents: 105223
diff changeset
374 ;; arch-tag: 071410ac-91dc-4e36-b892-18e057d639c5