Email::Send::Gmail でメール送信

GmailSMTPPerlで叩いてメール送信する。
自前でメールサーバとかとか立ててない場合に便利。

#!/usr/bin/perl
use strict;
use warnings;

use Email::Send;
use Email::Send::Gmail;
use Email::Simple::Creator;

use Config::Pit;

my $config = Config::Pit::get('Gmail');

my $email = Email::Simple->create(
    header => [
        From    => $config->{account},
        To      => 'foo@example.com',
        Subject => 'test',
    ],
    body => 'TEST',
);

my $sender = Email::Send->new({
    mailer      => 'Gmail',
    mailer_args => [
        username => $config->{account},
        password => $config->{password},
    ]
});

$sender->send($email);


Email::Send / Email::Send::Gmail / Email::Simple::Creator はわりと簡単にインストールできたんだけど、なぜか全然メールが送れなくてまいった。
別マシンからだと同じコードで送信可能だったりもするので、何かこちらの環境がおかしいかなと思って調査開始。


エラーメッセージからして、Net::SMTP::SSLでこけているようだったので、そこだけ取り出した簡単なスクリプトを書いた。

#!/usr/bin/perl
use strict;
use warnings;

use Net::SMTP::SSL;

my $smtp = Net::SMTP::SSL->new(
    'smtp.gmail.com',
    Port  => 465,
    Debug => 1,
) || die "oops";


案の定、こけて、どうしようかなあと思ったのだが、たぶん依存モジュールのバージョンが古いとかだろうなと思って、Net::SMTP::SSL のソースを開く。

$ perldoc -m Net::SMTP::SSL


IO::Socket::SSL と Net::SMTP が use されていて、Net::SMTPもIO::Socket::SSLも最新版が入っていた。
あきらめず、IO::Socket::SSL を開く。

use IO::Socket;
use Net::SSLeay 1.21;
use Exporter ();
use Errno qw( EAGAIN ETIMEDOUT );
use Carp;
use strict;


Net::SSLeay が怪しいよなあ、これは、勘だけど。
そういうわけで、入れなおす。

# cpan -if Net::SSLeay


無事、メール送信できた。