雑廉堂の雑記帳

expectでIMAPサーバと会話する

自社用のメールサーバを運営しています。
アカウントを追加する際に、メールボックスのACLを追加して、事業所内でメールを共有できるようにしているのですが、その設定が面倒くさい・・

そこで、expectというツールを使って、ACL追加を自動化してみることを試みました。

これはその覚書です。

これまでACLを追加するために、サーバにSSHでログインして、telnetでlocalhostのimapサーバに接続していたのですが、他の仕事が立て込んできている時には面倒くさく感じるものです。

ゴール

目的は次の通り。

色々あれこれ調べてみた結果、次のようなスクリプトで今のところいけています。

#!/usr/bin/expect -f
set timeout 10
set server localhost
set port 143
set user {user@mydomain.com}
set pass {p@ssw0rd}
set group {belongto@mydomain.com}
set manager {manager@mydomain.com}

spawn telnet $server $port
expect {
    timeout {puts stdout "timeout while connecting to $server"; exit 1}
    "* OK"
}

send "1 login $user $pass\r"
expect {
    timeout {puts stdout "timed out after login"; exit 1}
    "1 NO" {puts stdout "bad login"; exit 1}
    "1 OK"
}

send "2 create Sent\r"
expect {
    timeout {puts stdout "timed out"; exit 1}
    "2 NO" {puts stdout "already exists"}
    "2 OK"
}
send "3 setacl INBOX ${group} lr\r"
expect {
    timeout {puts stdout "timed out"; exit 1}
    "3 NO" {puts stdout "setacl failed.."}
    "3 OK"
}
send "4 setacl INBOX ${manager} lr\r"
expect {
    timeout {puts stdout "timed out"; exit 1}
    "4 NO" {puts stdout "setacl failed.."}
    "4 OK"
}
send "5 setacl Sent ${manager} lr\r"
expect {
    timeout {puts stdout "timed out"; exit 1}
    "5 NO" {puts stdout "setacl failed.."}
    "5 OK"
}
send "6 logout\r"
expect {
    timeout {puts stdout "timed out"; exit 1}
    "6 OK"
}

exit

もちろんユーザにはINBOXやSentが共有されていることは教えています。

モバイルバージョンを終了