さくらインターネットでイメぴたっぽいことをしてみる
さくらインターネットでgaucheをつかってイメぴたっぽいことをしてみる
この辺を参考にしました
http://faq.sakuratan.com/wiki/wiki.cgi?%A5%E1%A1%BC%A5%EB#i25
http://makingx.net/blog/2008/01/01/auto-reply-to-happy-new-year-mail/
やるにはもちろんこの辺でも見てgaucheをインストールしてないと駄目でやんす
まず/home/username/Mailbox/mail-account/.mailfilterを編集する
to "| /home/username/bin/image-paste.scm | mailbot -t /home/username/misc/reply -A 'From: mail-account@username.net' /usr/sbin/sendmail -t; chmod 644 /home/username/www/images/image-paste/*; rm /home/username/misc/reply " exit
つぎにgaucheで適当なスクリプトを書く.
あらためてみると結構ひどいな…
/home/username/bin/image-paste.scm
#!/home/username/bin/gosh (use gauche.regexp) (use gauche.charconv) (use rfc.822) (use rfc.mime) (use srfi-1) (use srfi-13) (use srfi-19) (use util.list) (use text.tree) (use text.html-lite) (use file.util) (define *reply-fname* "/home/username/misc/reply") (define *image-dir* "/home/username/www/images/image-paste/") (define *html-dir* "/home/username/www/images/image-paste/") (define *url-root* "http://username.net") (define *www-root* "/home/username/www") (define (make-reply fname html-file) (let ((port (open-output-file fname :if-exists :append :if-does-not-exist :create))) (format port "automaticaly created ~A~%" html-file) (close-output-port port) #t)) (define (make-error-reply fname) (let ((port (open-output-file fname :if-exists :append :if-does-not-exist :create))) (format port "no image was found~%") (close-output-port port) #t)) (define (message-handle from subject part xport) (let ((image-dir *image-dir*) (html-dir *html-dir*) (reply-fname *reply-fname*)) (let ((type (slot-ref part 'type))) (if (string=? type "image") (let ((prefix (x->string (time-second (current-time)))) (suffix (rxmatch-after (rxmatch #/\./ (cdr (assoc "name" (slot-ref part 'parameters) string=?)))))) (let ((image-file-name (string-concatenate (list image-dir prefix "." suffix))) (html-file-name (string-concatenate (list html-dir prefix ".html")))) ;; jpgファイルを書き出す (let ((oport (open-output-file image-file-name))) (mime-retrieve-body part xport oport) (close-output-port oport) ) ;; 対応するhtmlファイルを作る (let ((tree (make-html-tree (regexp-replace-all (string->regexp *www-root*) image-file-name "") from subject))) (let ((oport (open-output-file html-file-name))) (write-tree tree oport) (close-output-port oport)) ) ;; 返信用の文章をつくる (make-reply reply-fname (regexp-replace-all (string->regexp *www-root*) html-file-name *url-root*)) )) (mime-body->string part xport))))) (define (make-html-tree ifname from subject) (list (html-doctype :type :html-4.01) (html:html (html:head (html:meta :http-equiv "Content-Type" :content "text/html; charset=UTF-8") (html:title (string-concatenate (map html-escape-string (list "image paste ::" subject))))) (html:body :lang "ja" :bgcolor "#ffffff" :text "#000000" :link "#0000ff" :vlink "#800080" :alink "#ff0000" (html:div (html:h3 (string-concatenate (map html-escape-string (list "from::" (regexp-replace-all #/@/ from "__at__"))))) (html:h3 (string-concatenate (map html-escape-string (list "subject::" subject))))) (html:a :href ifname (html:img :border "0" :src ifname :alt ifname)) ) ))) (define (main args) (let ((port (standard-input-port))) (let ((headers (rfc822-read-headers port))) (if (mime-parse-version (rfc822-header-ref headers "mime-version")) (let ((from (rfc822-header-ref headers "from")) (subject (rfc822-header-ref headers "subject"))) (mime-parse-message port headers (cut message-handle from subject <> <>)))) ;; めんどうなのでreplyがあるかチェックしてなかったらエラー用のものを作る (if (not (file-is-readable? *reply-fname*)) (make-error-reply *reply-fname*)) (rfc822-write-headers headers) )))
適当にディレクトリを変えたりすれば動くはず.
これで.mailfilterを編集したアドレスにメールすると返信がくる.
自分のとこだとimage __at__ garaemon.netに画像を添付してメールすると
こんなかんじになる