Skip to content

理由などない

私が利用しているサーバはロリポップなのですが、このロリポップの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;