脳汁でコードを書く

Archive for 12 月, 2008

さくらにGauche-dbd-mysqlを入れる

水曜日, 12 月 24th, 2008

めもめも

Gauche-dbd-mysql-0.2.2.tgz

すでにgaucheはいれてあるとすると

tarボールを解凍したあとに./configureまでやってMakefileをいじる

MYSQL_LIBSをいじる
libgauche.soが/home/username/libにあるとして

MYSQL_LIBS   = -L/usr/local/lib/mysql -lmysqlclient -lz -lcrypt -lm -Wl,--rpath,/home/username/lib -lgauche

みたいにする

./configure --prefix=/home/username

でよかったみたい
欝だお

さくらインターネットでイメぴたっぽいことをしてみる

月曜日, 12 月 22nd, 2008

さくらインターネットで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に画像を添付してメールすると
こんなかんじになる