さくらのサーバ スタンダードプランでPerl CGIからSSLメールするには? ‘24.3月版

さくらのサーバ でお問合わせWEBページなど、CGIからメール送信したい場合、簡単な方法としてはunixのsendmailコマンドで用いることができます。当方では一旦fileに生成してsendmailにリダイレクトしていました。言語は Perl です。

しかしこれでは平文で送信されてしまいます。ステータスなどの自動送信ならこれで良いですが、個人情報を扱う場合はまずいです。問合せユーザに写しを送りたい場合、gmail にも弾かれてしまいます。

そこで SSL(STARTLS) のメール送信を Perl CGIに仕込もうと記事1記事2 のサイトを参考にさせていただきました。しかし、投稿時期の違いか、契約プランの違いなのかうまくいきません。調査を開始しました。

【課題1】SMTPSパッケージが入っていない/入れられない

さくらのサーバ では、STARTLSを送信するためのパッケージ Net::SMTPS を use 文を書くと実行エラーとなります。当パッケージは入っていないようです。 さくらのサーバに Teraterm から ssh でログインして、Perlの cpan ユーティリティでインストールしてみると以下のように root権限無しでエラーになってしまいます。

しかし、sudo、su はスタンダードプランでは未対応で、VPSプランからのようです。usergrp コマンドもとおりません。そこで以下のようにしました。

  • cpanユーティリティで、Getコマンドで Net::SNTPS をdonwload。
  • Net-SMTPS-0.10.tar.gz を解凍し /Net/Lib/Net を丸ごと /hom/ドメイン/www/cgi-bin の下にコピー。
  • Net::SMTP も SMTPS の基底クラスなので同様にコピー。
  • Net::CmdNet::Config も SMTPS から引用しているので同様にコピー。
  • 対象.cgiに ローカルlibのパスを以下のように追記。
  • STMPS.pm、 STMP.pm にも ローカルlibのパスを以下のように追記。

これで Net::SMTPS を使用可能になりました。

【課題2】SMTPインスタンス生成エラー

SMTPS内の new() から SMTPの new() をcallしてるので、先に基底クラスの Net::SMTP から順当に試そうとしましたが、new時点でインスタンスが空になりました。STMP.pm もローカルに置いたのでいじりやすくなってるので、print文を入れて追ってみましたが分からず。諦めて Net::SMTPS から直接やってみると上手くいきました。 不思議です。以下コードです。

【課題3】auth()メソッドでログインエラー

SMTPSの インスタンス生成後、auth() メソッドでfalseが返ります。これもSTMPS.pm、 STMP.pm にprint文を入れて追ってみました。基底クラスのSMTP auth() メソッドにて パスワードをメールサーバに送ったところで、応答コード 535 でが返ってます。ユーザ名にドメイン名を付与すると通りました。メールサーバはユーザ名だけで通っていた記憶があったのですが、、、コードは以下のとおりです。

応答コードがSMTPS パッケージから見えにくいので状況判断しにくいです。STMP.pm の内部にて一通りチェックしてみると以下のとおりでした。

応答コード状態
220通常コマンド受付
221接続断
250通常コマンド受付
334ユーザ名受付、認証方式受付
535 ユーザ名 もしくは パスワード 不一致

あとはすんなり突破しました。以下コードです。Perlの文字連結は + は効かないんすね。

下図のようにgmailの受信もOKでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です