2010/10/06

Common Lisp でメール送信

g000001 さんに元となるソースコードをもらって、 Common Lisp でメール送信するする関数を書いてみた。

cl-smtp を使ったけど、その内部で使われている FLEXI-STREAMS が iso-2022-jp に対応していない。そこは適当にだまくらかした。

(eval-when (:compile-toplevel :load-toplevel :execute)
(asdf:oos 'asdf:load-op :trivial-shell)
(asdf:oos 'asdf:load-op :cl-smtp))

(defpackage :メール送信
(:use :cl))

(in-package :メール送信)

(defun encode-subject (subject)
(let ((subject (trivial-shell:shell-command
"nkf -M"
:input (trivial-shell:shell-command
"nkf -j"
:input subject))))
(subseq subject 0 (1- (length subject)))))
;; (encode-subject "あいう")

(defun encode-message (message)
(trivial-shell:shell-command "nkf -j"
:input (format nil "~a~%" message)))
;; (encode-message "あいう")

;; flexi-streams をだます。
(pushnew '(:iso-2022-jp . :utf-8) flex::+name-map+ :test #'equal)

(defun send-mail (host from to subject message)
(let ((subject (encode-subject subject))
(message (encode-message message)))
(cl-smtp:send-email host from to subject message
:external-format :iso-2022-jp
:extra-headers '(("Content-Transfer-Encoding" "7bit")))))
#|
(send-mail "localhost" "read.eval.print+from@gmail.com" "read.eval.print+to@gmail.com" "テスト" "テストです。")
|#

0 件のコメント: