SendGridを試す
以前にメール配信サービスMandrillを試したが、競合のSendGridもPerlで呼び出してみた。その際、REST APIで複数の送信先を指定したらうまくいかなかった。
そのときの対応のメモ。
SendGrid
以下の公式サイトでアカウントを作成
SendGrid
UIが親切で英語でも特に躓くことなく登録完了。
設定もダッシュボードから行って完了。
ドキュメントも豊富で、このなかを探せば大抵のことは書いてある。
Sendgridでは多くの言語対応が進んでいるようで、Perl用のモジュールもgithubで公開されている。
sendgrid/sendgrid-perl
Email::SendGrid::Transpost::REST
sendgrid-perlの使い方はgithubのREADME.mdに書いてある通り。設定がうまくいっていれば難なくメール送信できる。しかし、複数の送信先を指定するとエラーとなりメールは正常に配信されなかった。エラーを起こした箇所は、Email::SendGrid::Transpost::RESTモジュールのサブルーチン"deliver“である。
“deliver“の中でコールされる"splitAddresses“では、Mail::Addressモジュールの"parse“を使っている
sub splitAddresses { my $self = shift; my $field = shift; 〜〜〜〜 my @addrs = Mail::Address->parse($str); # ここ!! foreach my $addr ( @addrs ) { push(@ad, $addr->address()); push(@name, $addr->name()) if ( $addr->name() ); } return (\@ad, \@name); }
“Mail::Address->parse“で、引数$strを意図したようにパースできないケースがあるようで、@nameにうまく名前データが入っていなかった。
原因をそれ以上追わなかったが、日本語の文字列が入っているとよろしくないのかもしれない。
そして"deliver“に戻って、61行目から始まる"name"と"address"の数の比較検証で落ちていた。この比較検証の処理に意味あるのかいまいち理解できなかったので、とりあえずコメントアウトして対応した。
sub deliver { my $self = shift; my $sg = shift; 〜〜〜〜 # Get the To fields. my ($toAddr, $toName) = $self->splitAddresses($sg->get('to')); # Do a sanity check on the argument lengths # if ( scalar(@$toName) && scalar(@$toName) != scalar(@$toAddr) ) # { # croak "There are an inconsistant number of recipients in the to field" . # "that have names, which is incompatible with the REST API"; # } 〜〜〜〜 }