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
これはこれで使えますね.