2008-08-03
_ Publish::IMAP を SSL 対応にする
Plagger でメール送信といえば Publish::Gmail ですが,Gmail で見るだけなら,Publish::IMAP 使う方法もあるなぁ,ということで試してみたら動かない.Gmail の IMAP 接続には SSL が必要なので,Publish::IMAP で SSL 通信のオプション渡せるように手を加えてみました.
use_ssl オプションで 1 を指定し,ホスト名とポート番号を指定します.デフォルトは localhost:993 です.以下 diff です.
--- IMAP.pm 2008-07-24 13:27:36.000000000 +0900 +++ IMAP.pm.new 2008-07-24 16:36:25.000000000 +0900 @@ -8,6 +8,7 @@ use Encode::MIME::Header; use MIME::Lite; use IO::File; +use IO::Socket::SSL; use Mail::IMAPClient; use Digest::MD5 qw/ md5_hex /; @@ -27,7 +28,18 @@ sub initialize { my($self, $context, $args) = @_; my $cfg = $self->conf; + + my $socket = undef; + if ($cfg->{use_ssl}) { + $socket = IO::Socket::SSL->new( + Proto => 'tcp', + PeerAddr => $cfg->{host} || 'localhost', + PeerPort => $cfg->{port} || 993, + ) or die $context->log(error => "create scoket error; $@"); + } + $self->{imap} = Mail::IMAPClient->new( + Socket => $socket, User => $cfg->{username}, Password => $cfg->{password}, Server => $cfg->{host} || 'localhost',
Gmail への IMAP 接続時の設定を例にすると以下のようになります.
- module: Publish::IMAP config: use_ssl: 1 host: imap.gmail.com port: 993 username: example@gmail.com password: password folder: plagger
余談ですが,stone を使って中継すると,Publish::IMAP には手を加えずに接続できたりします.例えば,以下のように stone を実行して,Publish::IMAP ではローカルのポートに接続するといった形になります.
$ stone imap.gmail.com:993/ssl 10143
これはこれで使えますね.