2013年11月13日水曜日

FreeBSD で Net::SMTP::TLS を使うには (2013/11 現在)

 Net::SMTP::TLS は2006年1月以来更新が止まっていて,2016年時点ではすでに非推奨になっている。 そこで,2016年11月に FreeBSD で,Perl で gmail からメールを送る:Net::SMTP::TLS をやめて,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うことにした というのを書いたので,そちらも参照してみて欲しい。
 以前,FreeBSD, Perl の Net::SMTP::TLS ではまるという投稿を書いた。 それは,FreeBSD のサーバーから,Perl で 587 番ポートを使って gmail からメールを送信する際に, Net::SMTP::TLS がうまく使えない,という話だった。 その時は CPAN にある Net-SMTP-TLS-ButMaintained というのが使えそう,という事を書いた。 その当時(2012/12),FreeBSD の ports には,Net-SMTP-TLS のバージョン 0.12 しかなく,Net::SMTP::TLS を使って Perl で 587 番ポートを通じてメールを送信するのは不可能だった。 その時の解決策は CPAN の Net-SMTP-TLS-ButMaintained を取ってきて,TLS.pm を置換える作戦だった。 その作戦を使うと TLS.pm + Perl で 587 番ポート経由でメールを送信することができた。

 その後,そのままメールを使っていたのだが,Perl のバージョンを 5.18 に上げた際に,Perl + Net::SMTP::TLS で 587 番ポートからメールが送信できなくなったので,以前の話を思い出した。 Perl のバージョンを上げると,Perl 関連のパッケージをインストールしなおさないと行けないのだが,Net::SMTP::TLS は,ButMaintained を手動で置換えないといけないのだった。 その時,FreeBSD の ports を見ると,p5-Net-SMTP-TLS 以外に p5-Net-SMTP-TLS-ButMaintained という ports が作られているのを見つけた。 これは使えるかもしれない,と思って,p5-Net-SMTP-TLS-ButMaintained を使ってみようと思ったのが,今回の話。

 まず考えたのが,いきなり p5-Net-SMTP-TLS-ButMaintained だけを ports から入れてみる作戦だった。 ports は
/usr/ports/mail/p5-Net-SMTP-TLS-ButMaintained/
にある。 そこで make install clean としてインストールしてみた。 どこにどんなファイルができるかというと,
/usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS/ButMaintained.pm
というファイルが作られていた。

 しかし…, p5-Net-SMTP-TLS-ButMaintained だけをインストールしただけだと,うまくいかなかった。 そもそも Net::SMTP::TLS がない,と言われた。 そこで,mail の送信スクリプトで
use Net::SMTP::TLS;
use Net::SMTP::TLS::ButMaintained;
としてみたのだが,これまたダメだった。

 次の作戦としては,p5-Net-SMTP-TLSp5-Net-SMTP-TLS-ButMaintained をインストールして,ButMaintained.pmTLS.pm を置き換える作戦。p5-Net-SMTP-TLS をインストールすると,
/usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS.pm
が作られる。そこで,
/usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS/ButMaintained.pm
/usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS.pm
に上書きコピーした。 メール送信の perl スクリプトの中は
use Net::SMTP::TLS;
のままとしておいた。

 しかし…,この作戦もうまくいかなかった…。 実は,ButMaintained.pmTLS.pm にコピーしただけだと,TLS.pm の先頭付近が,
package Net::SMTP::TLS::ButMaintained;
{
  $Net::SMTP::TLS::ButMaintained::VERSION = '0.24';
}
となってしまっていた。 それを
package Net::SMTP::TLS;
{
  $Net::SMTP::TLS::VERSION = '0.24';
}
と置き換えるとうまくいった。 まぁ,考えてみれば当たり前といえば当たり前の事だった。

 今回もアプリケーションのアップデートに伴うトラブルだった。 特に Perl などの基本的なアプリケーションのバージョンアップには気をつけないといけない,と思うのだった。

 最終的にうまくいった方法をまとめると,以下のようになる。
1. /usr/ports/mail/p5-Net-SMTP-TLS/ から Net-SMTP-TLS をインストール
2. /usr/ports/mail/p5-Net-SMTP-TLS-ButMaintained/ から Net-SMTP-TLS-ButMaintained をインストール
3. /usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS/ButMaintained.pm を
   /usr/local/lib/perl5/site_perl/5.18/Net/SMTP/TLS.pm にコピー(置換える)
4. 新しい TLS.pm の先頭の Net::SMTP::TLS::ButMaintained(2ヶ所)を
   Net::SMTP::TLS に変更する

0 件のコメント: