[cl-smtp-cvs] CVS update: cl-smtp/CHANGELOG cl-smtp/cl-smtp.asd cl-smtp/cl-smtp.lisp
Jan Idzikowski
jidzikowski at common-lisp.net
Sat Dec 10 21:00:18 UTC 2005
Update of /project/cl-smtp/cvsroot/cl-smtp
In directory common-lisp.net:/tmp/cvs-serv3441
Modified Files:
CHANGELOG cl-smtp.asd cl-smtp.lisp
Log Message:
add new key authentication to send-email, send-smtp for
for smtp authentication PLAIN and LOGIN,
:authentication value list '(:plain "username" "password")
or '(:login "username" "password")
Date: Sat Dec 10 22:00:11 2005
Author: jidzikowski
Index: cl-smtp/CHANGELOG
diff -u cl-smtp/CHANGELOG:1.1.1.1 cl-smtp/CHANGELOG:1.2
--- cl-smtp/CHANGELOG:1.1.1.1 Tue Nov 1 19:34:57 2005
+++ cl-smtp/CHANGELOG Sat Dec 10 22:00:10 2005
@@ -1,3 +1,9 @@
+Version 20051210.1
+2005-12-10
+"ADD" key authentication for smtp authentication: '(:plain "username" "password")
+or '(:login "username" "password")
+add dependency to CL-BASE64 except allegro
+
Version 20050729.1
2005-07-29
"CHANGE" license from LGPL to LLGPL
Index: cl-smtp/cl-smtp.asd
diff -u cl-smtp/cl-smtp.asd:1.1.1.1 cl-smtp/cl-smtp.asd:1.2
--- cl-smtp/cl-smtp.asd:1.1.1.1 Tue Nov 1 19:34:57 2005
+++ cl-smtp/cl-smtp.asd Sat Dec 10 22:00:10 2005
@@ -26,7 +26,9 @@
(in-package :cl-smtp)
(asdf:defsystem :cl-smtp
- :version "20050729.1"
+ :version "20051210.1"
+ :depends-on
+ (#-allegro :cl-base64)
:components
(#+sbcl(:file "sbcl")
#+allegro(:file "acl")
Index: cl-smtp/cl-smtp.lisp
diff -u cl-smtp/cl-smtp.lisp:1.1.1.1 cl-smtp/cl-smtp.lisp:1.2
--- cl-smtp/cl-smtp.lisp:1.1.1.1 Tue Nov 1 19:34:57 2005
+++ cl-smtp/cl-smtp.lisp Sat Dec 10 22:00:10 2005
@@ -57,32 +57,29 @@
(mask str))
resultstr))
+(defun string-to-base64-string (str)
+ #+allegro (excl:string-to-base64-string str)
+ #-allegro (cl-base64:string-to-base64-string str))
+
(defun send-email (host from to subject message
&key (port 25) cc bcc reply-to extra-headers
- display-name)
+ display-name authentication)
(send-smtp host from (check-arg to "to") subject (mask-dot message)
:port port :cc (check-arg cc "cc") :bcc (check-arg bcc "bcc")
:reply-to reply-to
:extra-headers extra-headers
- :display-name display-name))
+ :display-name display-name
+ :authentication authentication))
(defun send-smtp (host from to subject message
&key (port 25) cc bcc reply-to extra-headers
- display-name)
+ display-name authentication)
(let ((sock (socket-stream (make-smtp-socket host port))))
(unwind-protect
(progn
- (multiple-value-bind (code msgstr)
- (read-from-smtp sock)
- (when (/= code 220)
- (error "wrong response from smtp server: ~A" msgstr)))
- (write-to-smtp sock (format nil "HELO ~A" (get-host-name)))
- (multiple-value-bind (code msgstr)
- (read-from-smtp sock)
- (when (/= code 250)
- (error "wrong response from smtp server: ~A" msgstr)))
+ (open-smtp-connection sock :authentication authentication)
(write-to-smtp sock
(format nil "MAIL FROM:~@[~A ~]<~A>" display-name from))
(multiple-value-bind (code msgstr)
@@ -132,6 +129,55 @@
(error "in QUIT command:: ~A" msgstr))))
(close sock))))
+(defun open-smtp-connection (sock &key authentication)
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 220)
+ (error "wrong response from smtp server: ~A" msgstr)))
+ (cond
+ (authentication
+ (write-to-smtp sock (format nil "EHLO ~A" (get-host-name)))
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 250)
+ (error "wrong response from smtp server: ~A" msgstr)))
+ (cond
+ ((eq (car authentication) :plain)
+ (write-to-smtp sock (format nil "AUTH PLAIN ~A"
+ (string-to-base64-string
+ (format nil "~A~C~A~C~A" (cadr authentication)
+ #\null (cadr authentication) #\null
+ (caddr authentication)))))
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 235)
+ (error "plain authentication failed: ~A" msgstr))))
+ ((eq (car authentication) :login)
+ (write-to-smtp sock "AUTH LOGIN")
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 334)
+ (error "login authentication failed: ~A" msgstr)))
+ (write-to-smtp sock (string-to-base64-string (cadr authentication)))
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 334)
+ (error "login authentication send username failed: ~A" msgstr)))
+ (write-to-smtp sock (string-to-base64-string (caddr authentication)))
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 235)
+ (error "login authentication send password failed: ~A" msgstr))))
+ (t
+ (error "authentication ~A is not supported in cl-smtp"
+ (car authentication)))))
+ (t
+ (write-to-smtp sock (format nil "HELO ~A" (get-host-name)))
+ (multiple-value-bind (code msgstr)
+ (read-from-smtp sock)
+ (when (/= code 250)
+ (error "wrong response from smtp server: ~A" msgstr))))))
+
(defun compute-rcpt-command (sock adresses)
(dolist (to adresses)
More information about the Cl-smtp-cvs
mailing list