;;; pop3.el --- Post Office Protocol (RFC 1460) interface
;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-;; 2004, 2005 Free Software Foundation, Inc.
+;; 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Richard L. Pieri <ratinox@peorth.gweep.net>
;; Maintainer: FSF
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;;; Code:
(require 'mail-utils)
+(defvar parse-time-months)
(defgroup pop3 nil
"Post Office Protocol."
on the POP server after fetching. Note that POP servers maintain
no state information between sessions, so what the client
believes is there and what is actually there may not match up.
-If they do not, then the whole thing can fall apart and leave you
-with a corrupt mailbox."
+If they do not, then you may get duplicate mails or the whole
+thing can fall apart and leave you with a corrupt mailbox."
+ ;; We can't use the UILD support from XEmacs mail-lib or cvs.m17n.org:
+ ;; http://thread.gmane.org/v9lld8fml4.fsf@marauder.physik.uni-ulm.de
+ ;; http://thread.gmane.org/b9yy8hzy9ej.fsf@jpl.org
+ ;; Any volunteer to re-implement this?
:version "22.1" ;; Oort Gnus
:type 'boolean
:group 'pop3)
(pop3-dele process n))
(setq n (+ 1 n))
(if pop3-debug (sit-for 1) (sit-for 0.1))) ; why?
+ (when (and pop3-leave-mail-on-server
+ (> n 1))
+ (message "pop3.el doesn't support UIDL. Setting `pop3-leave-mail-on-server'
+to %s might not give the result you'd expect." pop3-leave-mail-on-server)
+ (sit-for 1))
(pop3-quit process))
(kill-buffer crashbuf))
t)
(autoload 'open-tls-stream "tls")
(autoload 'starttls-open-stream "starttls")
+(autoload 'starttls-negotiate "starttls") ; avoid warning
(defcustom pop3-stream-type nil
"*Transport security type for POP3 connexions.
to turn on TLS security after opening the stream). However, if
this is nil, `ssl' is assumed for connexions to port
995 (pop3s)."
- :version "23.1" ; fixme?
+ :version "23.0" ;; No Gnus
:group 'pop3
:type '(choice (const :tag "Plain" nil)
(const :tag "SSL/TLS" ssl)
(setq process
(cond
((or (eq pop3-stream-type 'ssl)
- (and (not pop3-stream-type) (= port 995))) ; pop3s
+ (and (not pop3-stream-type) (member port '(995 "pop3s"))))
+ ;; gnutls-cli, openssl don't accept service names
+ (if (or (equal port "pop3s")
+ (null port))
+ (setq port 995))
(let ((process (open-tls-stream "POP" (current-buffer)
mailhost port)))
(when process
;; There's a load of info printed that needs deleting.
- (while (when (memq (process-status process) '(open run))
- (pop3-accept-process-output process)
- (goto-char (point-max))
- (forward-line -1)
- (if (looking-at "\\+OK")
- (delete-region (point-min) (point))
+ (let ((again 't))
+ ;; repeat until
+ ;; - either we received the +OK line
+ ;; - or accept-process-output timed out without getting
+ ;; anything
+ (while (and again
+ (setq again (memq (process-status process)
+ '(open run))))
+ (setq again (pop3-accept-process-output process))
+ (goto-char (point-max))
+ (forward-line -1)
+ (cond ((looking-at "\\+OK")
+ (setq again nil)
+ (delete-region (point-min) (point)))
+ ((not again)
(pop3-quit process)
- (error "POP SSL connexion failed"))))
+ (error "POP SSL connexion failed")))))
process)))
((eq pop3-stream-type 'starttls)
+ ;; gnutls-cli, openssl don't accept service names
+ (if (equal port "pop3")
+ (setq port 110))
(let ((process (starttls-open-stream "POP" (current-buffer)
- mailhost port)))
+ mailhost (or port 110))))
(pop3-send-command process "STLS")
(let ((response (pop3-read-response process t)))
(if (and response (string-match "+OK" response))
(setq match-end (point))
(goto-char pop3-read-point)
(if (looking-at "-ERR")
- (error (buffer-substring (point) (- match-end 2)))
+ (error "%s" (buffer-substring (point) (- match-end 2)))
(if (not (looking-at "+OK"))
(progn (setq pop3-read-point match-end) nil)
(setq pop3-read-point match-end)
(forward-char)))
(set-marker end nil))
-(eval-when-compile (defvar parse-time-months))
-
;; Copied from message-make-date.
(defun pop3-make-date (&optional now)
"Make a valid date header.