私が利用しているサーバはロリポップなのですが、このロリポップのSMTPサーバからPerlを利用してメールを送信してみようと思ったのです。
えっ、理由ですか? まぁ、単なる趣味です、ええ。
で、いろいろ調べてみると、Perl 5.7.3以降でコアモジュールに入っているNet::SMTPモジュールを使うのが良いという御神託を得ました。
ただ、ロリポップのSMTPサーバにはSMTP-AUTHという機構を取り入れているようで、送信時にも認証が必要とのこと。Net::SMTPモジュールにはauthメソッドがあるのですが、Net::SMTPモジュールの他に、Authen::SASLという非コアモジュールも必要だとの御神託です。
というわけでできたのが以下のコードです。今のところ、手元のMacからも、ロリポップのサーバからも、どちらも送信はできました。
use strict; use warnings; use utf8; # 件名とか本文とかの文字コード変換用 use Encode; my $mime = find_encoding('MIME-Header'); my $jis = find_encoding('iso-2022-jp'); # 送信元 my $from = 'xxxxx@magiccircuit.com'; # 送信先 my $to = 'yyyyy@magiccircuit.com'; # 件名 my $subject = '件名:テストメールです。'; $subject = $mime->encode($subject); # メール本文 my $message = <<'END_MESSAGE'; これは、テストメールです。 テストテスト。 END_MESSAGE $message = $jis->encode($message); # メールのヘッダ my $header = <<"END_HEADER"; From: $from To: $to Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = "ISO-2022-JP" Content-Transfer-Encoding: 7bit END_HEADER # Authen::SASLモジュールは、自前のライブラリパスに設置 use File::Spec; use lib File::Spec->catfile('.', 'lib'); use Authen::SASL; # ロリポップのSMTPサーバ # ポート番号は587番 use Net::SMTP; my $host = 'smtp.lolipop.jp'; my $smtp = Net::SMTP->new($host, Port => '587'); # メールのIDとパスワード $smtp->auth('login-id', 'login-password'); $smtp->mail($from); $smtp->to($to); $smtp->data(); $smtp->datasend("$header\n"); $smtp->datasend("$message\n"); $smtp->dataend(); $smtp->quit;