X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=smtp.el;h=994bb47186fe227390703641ac21a39f5d6c3e8b;hb=04123d21ebf8e2f0d2b74d725e7e6ca82888e8b4;hp=31e393d016b91bbe0953bb9130e28906ff137d43;hpb=caf43ddadf46a06e795f0a220118fca4318af85f;p=elisp%2Fflim.git diff --git a/smtp.el b/smtp.el index 31e393d..994bb47 100644 --- a/smtp.el +++ b/smtp.el @@ -1,6 +1,7 @@ ;;; smtp.el --- basic functions to send mail with SMTP server -;; Copyright (C) 1995, 1996, 1998, 1999, 2000 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001 ,2002, 2004 +;; Free Software Foundation, Inc. ;; Author: Tomoji Kagatani ;; Simon Leinen (ESMTP support) @@ -22,8 +23,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -130,6 +131,11 @@ don't define this value." :type '(repeat string) :group 'smtp-extensions) +(defcustom smtp-debug nil + "*If non-nil, smtp debug info printout into messages." + :type 'boolean + :group 'smtp) + (defvar sasl-mechanisms) ;;;###autoload @@ -148,8 +154,7 @@ Here is an example: It connects to a SMTP server using \"ssh\" before actually connecting to the SMTP port. Where the command \"nc\" is the netcat executable; see http://www.atstake.com/research/tools/index.html#network_utilities -for details. In addition, you will have to modify the value for -`smtp-end-of-line' to \"\\n\" if you use \"telnet\" instead of \"nc\".") +for details.") (defvar smtp-read-point nil) @@ -157,11 +162,6 @@ for details. In addition, you will have to modify the value for (defvar smtp-submit-package-function #'smtp-submit-package) -(defvar smtp-end-of-line "\r\n" - "*String to use as end-of-line marker when talking to a SMTP server. -This is \"\\r\\n\" by default, but it may have to be \"\\n\" when using a non -native connection function. See also `smtp-open-connection-function'.") - ;;; @ SMTP package ;;; A package contains a mail message, an envelope sender address, ;;; and one or more envelope recipient addresses. In ESMTP model @@ -400,7 +400,9 @@ BUFFER may be a buffer or a buffer name which contains mail message." (smtp-primitive-data package)) (let ((connection (smtp-find-connection (current-buffer)))) (when (smtp-connection-opened connection) - (smtp-primitive-quit package) + (condition-case nil + (smtp-primitive-quit package) + (smtp-error)) (smtp-close-connection connection))))) (defun smtp-send-buffer-by-myself (sender recipients buffer) @@ -437,7 +439,7 @@ BUFFER may be a buffer or a buffer name which contains mail message." (let ((smtp-use-sasl nil) (smtp-use-starttls-ignore-error t)) (funcall smtp-submit-package-function package))) - (setq servers (cdr servers))))) + (setq servers (cdr servers))))) ;;; @ hook methods for `smtp-submit-package' ;;; @@ -633,24 +635,31 @@ BUFFER may be a buffer or a buffer name which contains mail message." response) (while response-continue (goto-char smtp-read-point) - (while (not (search-forward smtp-end-of-line nil t)) + (while (not (re-search-forward "\r?\n" nil t)) + (unless (smtp-connection-opened connection) + (signal 'smtp-error "Connection closed")) (accept-process-output (smtp-connection-process-internal connection)) (goto-char smtp-read-point)) - (if decoder - (let ((string (buffer-substring smtp-read-point (- (point) 2)))) - (delete-region smtp-read-point (point)) - (insert (funcall decoder string) smtp-end-of-line))) - (setq response - (nconc response - (list (buffer-substring - (+ 4 smtp-read-point) - (- (point) 2))))) - (goto-char - (prog1 smtp-read-point - (setq smtp-read-point (point)))) - (if (looking-at "[1-5][0-9][0-9] ") - (setq response (cons (read (point-marker)) response) - response-continue nil))) + (let ((bol smtp-read-point) + (eol (match-beginning 0))) + (when decoder + (let ((string (buffer-substring bol eol))) + (delete-region bol (point)) + (insert (funcall decoder string)) + (setq eol (point)) + (insert "\r\n"))) + (setq smtp-read-point (point)) + (goto-char bol) + (cond + ((looking-at "[1-5][0-9][0-9]\\([ -]\\)") + (setq response + (nconc response + (list (buffer-substring (match-end 0) eol)))) + (when (string= (match-string 1) " ") + (setq response (cons (read (point-marker)) response) + response-continue nil))) + (smtp-debug + (message "Invalid response: %s" (buffer-substring bol eol)))))) response)) (defun smtp-send-command (connection command) @@ -661,7 +670,7 @@ BUFFER may be a buffer or a buffer name which contains mail message." (smtp-connection-encoder-internal connection))) (set-buffer (process-buffer process)) (goto-char (point-max)) - (setq command (concat command smtp-end-of-line)) + (setq command (concat command "\r\n")) (insert command) (setq smtp-read-point (point)) (if encoder @@ -675,8 +684,8 @@ BUFFER may be a buffer or a buffer name which contains mail message." (smtp-connection-encoder-internal connection))) ;; Escape "." at start of a line. (if (eq (string-to-char data) ?.) - (setq data (concat "." data smtp-end-of-line)) - (setq data (concat data smtp-end-of-line))) + (setq data (concat "." data "\r\n")) + (setq data (concat data "\r\n"))) (if encoder (setq data (funcall encoder data))) (process-send-string process data))) @@ -718,9 +727,7 @@ BUFFER may be a buffer or a buffer name which contains mail message." (mail-strip-quoted-names (buffer-substring this-line this-line-end))))) (erase-buffer) - (insert-string " ") - (insert-string simple-address-list) - (insert-string "\n") + (insert " " simple-address-list "\n") ;; newline --> blank (subst-char-in-region (point-min) (point-max) 10 ? t) ;; comma --> blank