aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Reilly2002-03-19 19:42:46 +0000
committerPaul Reilly2002-03-19 19:42:46 +0000
commitbb0974cf08f071167ac187bab3524783d74d89f2 (patch)
tree772c3ad579cc56177be05f143c456f9f9fa06fa9
parent0ffba6bd01475f481f62c8a040de8e1e09bd73e8 (diff)
downloademacs-bb0974cf08f071167ac187bab3524783d74d89f2.tar.gz
emacs-bb0974cf08f071167ac187bab3524783d74d89f2.zip
(rmail-dont-reply-to): Overhaul to correctly apply the regular
expressions in the variable `rmail-dont-reply-to-names' to the list of destination addresses. Contributed by lorentey@elte.hu.
-rw-r--r--lisp/mail/mail-utils.el94
1 files changed, 45 insertions, 49 deletions
diff --git a/lisp/mail/mail-utils.el b/lisp/mail/mail-utils.el
index 84ed13e58bb..fb5c7d1330e 100644
--- a/lisp/mail/mail-utils.el
+++ b/lisp/mail/mail-utils.el
@@ -197,63 +197,59 @@ Return a modified address list."
197 nil 'literal address 2))) 197 nil 'literal address 2)))
198 address)))) 198 address))))
199 199
200; rmail-dont-reply-to-names is defined in loaddefs 200;;; The following piece of ugliness is legacy code. The name was an
201(defun rmail-dont-reply-to (userids) 201;;; unfortunate choice --- a flagrant violation of the Emacs Lisp
202 "Returns string of mail addresses USERIDS sans any recipients 202;;; coding conventions. `mail-dont-reply-to' would have been
203that start with matches for `rmail-dont-reply-to-names'. 203;;; infinitely better. Also, `rmail-dont-reply-to-names' might have
204Usenet paths ending in an element that matches are removed also." 204;;; been better named `mail-dont-reply-to-names' and sourced from this
205;;; file instead of in rmail.el. Yuck. -pmr
206(defun rmail-dont-reply-to (destinations)
207 "Prune addresses from DESTINATIONS, a list of recipient addresses.
208All addresses matching `rmail-dont-reply-to-names' are removed from
209the comma-separated list. The pruned list is returned."
205 (if (null rmail-dont-reply-to-names) 210 (if (null rmail-dont-reply-to-names)
206 (setq rmail-dont-reply-to-names 211 (setq rmail-dont-reply-to-names
207 (concat (if rmail-default-dont-reply-to-names 212 (concat (if rmail-default-dont-reply-to-names
208 (concat rmail-default-dont-reply-to-names "\\|") 213 (concat rmail-default-dont-reply-to-names "\\|")
209 "") 214 "")
210 (concat (regexp-quote (user-login-name)) 215 (if (and user-mail-address
211 "\\>")))) 216 (not (equal user-mail-address user-login-name)))
212 (let ((match (concat "\\(^\\|,\\)[ \t\n]*" 217 (concat (regexp-quote user-mail-address) "\\|")
213 ;; Can anyone figure out what this is for? 218 "")
214 ;; Is it an obsolete remnant of another way of 219 (concat (regexp-quote user-login-name) "\\>"))))
215 ;; handling Foo Bar <foo@machine>? 220 ;; Split up DESTINATIONS and match each element separately.
216 "\\([^,\n]*[!<]\\|\\)" 221 (let ((start-pos 0) (cur-pos 0)
217 "\\(" 222 (case-fold-search t))
218 rmail-dont-reply-to-names 223 (while start-pos
219 "\\|" 224 (setq cur-pos (string-match "[,\"]" destinations cur-pos))
220 ;; Include the human name that precedes <foo@bar>. 225 (if (and cur-pos (equal (match-string 0 destinations) "\""))
221 "\\([^\,.<\"]\\|\"[^\"]*\"\\)*" 226 ;; Search for matching quote.
222 "<\\(" rmail-dont-reply-to-names "\\)" 227 (let ((next-pos (string-match "\"" destinations (1+ cur-pos))))
223 "\\)[^,]*")) 228 (if next-pos
224 (case-fold-search t) 229 (setq cur-pos (1+ next-pos))
225 pos epos)
226 (while (and (setq pos (string-match match userids pos))
227 (> (length userids) 0))
228 ;; If there's a match, it starts at the beginning of the string,
229 ;; or with `,'. We must delete from that position to the
230 ;; end of the user-id which starts at match-beginning 2.
231 (let (inside-quotes quote-pos last-quote-pos)
232 (save-match-data
233 (while (and (setq quote-pos (string-match "\"" userids quote-pos))
234 (< quote-pos pos))
235 (setq last-quote-pos quote-pos)
236 (setq quote-pos (1+ quote-pos))
237 (setq inside-quotes (not inside-quotes))))
238 (if inside-quotes
239 (if (string-match "\"" userids pos)
240 (setq pos (string-match "\"" userids pos))
241 ;; If the open-quote has no close-quote, 230 ;; If the open-quote has no close-quote,
242 ;; delete the open-quote to get something well-defined. 231 ;; delete the open-quote to get something well-defined.
243 ;; This case is not valid, but it can happen if things 232 ;; This case is not valid, but it can happen if things
244 ;; are weird elsewhere. 233 ;; are weird elsewhere.
245 (setq userids (replace-match "" nil nil userids)) 234 (setq destinations (concat (substring destinations 0 cur-pos)
246 (setq userids (concat (substring userids 0 last-quote-pos) 235 (substring destinations (1+ cur-pos))))
247 (substring userids (1+ last-quote-pos)))) 236 (setq cur-pos start-pos)))
248 (setq pos (1- pos))) 237 (let* ((address (substring destinations start-pos cur-pos))
249 (setq userids (replace-match "" nil nil userids))))) 238 (naked-address (mail-strip-quoted-names address)))
250 ;; get rid of any trailing commas 239 (if (string-match rmail-dont-reply-to-names naked-address)
251 (if (setq pos (string-match "[ ,\t\n]*\\'" userids)) 240 (setq destinations (concat (substring destinations 0 start-pos)
252 (setq userids (substring userids 0 pos))) 241 (and cur-pos (substring destinations
253 ;; remove leading spaces. they bother me. 242 (1+ cur-pos))))
254 (if (string-match "\\(\\s \\|,\\)*" userids) 243 cur-pos start-pos)
255 (substring userids (match-end 0)) 244 (setq cur-pos (and cur-pos (1+ cur-pos))
256 userids))) 245 start-pos cur-pos))))))
246 ;; get rid of any trailing commas
247 (if (setq pos (string-match "[ ,\t\n]*\\'" destinations))
248 (setq destinations (substring destinations 0 pos)))
249 ;; remove leading spaces. they bother me.
250 (if (string-match "\\(\\s \\|,\\)*" destinations)
251 (substring destinations (match-end 0))
252 destinations))
257 253
258 254
259;;;###autoload 255;;;###autoload