WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Perlでメール送信。(SMTP.pm)

0:[投稿] あやの [2002/11/21 18:03 ][環境:WIN+IE UNIX系+Perl]

perlからメールを送信したいのですが、サーバ上でsendmailが使えないため、Net::SMTPで行おうと思っています。

libnet-1.0701.tar.gzをサーバに落とし、以下の手順でモジュールインストールを行いました。
% tar xvfz libnet-1.0701.tar.gz
% cd libnet-1.0701
% perl Makefile.PL
% make
% make install

モジュールは/usr/local/lib/perl5/site_perl配下にインストールされたようなので、以下の簡単なperlスクリプトで動作確認を行いました。

#!/usr/local/bin/perl
use Net::SMTP;
$smtp = Net::SMTP->new('SMTPサーバ',Hello=>"ドメイン名");
$smtp->mail('aaa@aa.co.jp');
$smtp->to('bbb@bb.co.jp');
$smtp->data();
$smtp->datasend("From:\n");
$smtp->datasend("To:kawai\n");
$smtp->datasend("Subject:テスト\n");
$smtp->datasend("テスト\n");
$smtp->datasend("TEST\n");
$smtp->dataend();
$smtp->quit;

これを実行すると、
「Can't call method "mail" on an undefined value at test.pl」
というエラーが出力されてしまいました。
モジュール内のメソッドが呼び出せてないようなのですが、
find `perl -e 'print "@INC"'` -name '*.pm' -print
を実行すると、ちゃんと
/usr/local/lib/perl5/site_perl/Net/SMTP.pm
と表示されるのです。

何が原因なのかがまったく分かりません。
perlのバージョンは5.004_05です。関係ないですかね?

どうぞよろしくおねがいします。


1:[回答] やじうま1号 [2002/11/21 18:05 ]

mailメソッドが使えないと言うエラーメッセージですが。


2:[質問] あやの [2002/11/21 18:09 ]

早いお返事ありがとうございます。

mailメソッドが使えないのはなぜなんでしょう?
Perlのバージョンが良くないのでしょうか?

すいません。もしかしたら簡単なことなのかもしれませんが。


3:[回答] ふじ [URL] [2002/11/21 21:16 ]

SMTPサーバへの接続に失敗しているのでしょう。
下記のようにしてチェックしましょう。

$smtp = Net::SMTP->new('SMTPサーバ',Hello => "ドメイン名) or die;


4:[回答] ふじ [URL] [2002/11/21 21:17 ]

" が抜けてました。

$smtp = Net::SMTP->new('SMTPサーバ',Hello => "ドメイン名") or die;


5:[完了] あやの [2002/11/22 10:16 ]

お返事ありがとうございます。

$smtp = Net::SMTP->new('SMTPサーバ',Hello => "ドメイン名") or die;
で試してみました。
その結果、見事に死んでました。
サーバを調べてところ、SMTPは使えないことが判明しました。。

sendmailも使えないので、なんとか他の手段を探したいと思います。
何か良い方法をご存知のでしたらよろしくお願いします。


6:[完了] ふじ [URL] [2002/11/22 16:32 ]

> サーバを調べてところ、SMTPは使えないことが判明しました。。
自分のサーバに SMTP でつないで MTA に配送してもらうのではなく、
自分で DNS の MX を引いて、そこに SMTP でつないでメールを送ればいいのでは。

MX は Net::DNS を使えば引けます。


use Net::DNS;
use Net::SMTP;
use strict;

my $addr = 'hoge@foo.bar';
my @mx = mx('foo.bar'); # foo.bar の MX を引く
@mx = sort { $a->preference <=> $b->preference } @mx; # preference の低い順にソート

foreach my $rr(@mx){
   my $smtp = Net::SMTP->new($rr->exchange) or next;
   # メール送信処理
   last; # 正常に送信が完了したらループから抜ける。
}

とか。
# この手のプログラムは不用意に実験するといろいろと危ないので注意。


7:[質問] あやの [2002/11/25 11:46 ]

SMTPのポート(25番)が閉じられているようなんですが、その場合でもDNSのMXを使えばメール送信できるのでしょうか?

注意書きがあったのでまだ試してないですが、よろしくお願いします。


8:[回答] ふじ [URL] [2002/11/25 16:05 ]

とりあえず、SMTPでメールが配送される仕組みを勉強してみてください。
たとえば
http://www.atmarkit.co.jp/fnetwork/rensai/netpro05/netpro01.html
とかで。

上のサンプルは、普段 sendmail (とか qmail とか Postfix) が
メールを配送している仕組み(のごく一部)を Perl で実装しているものですので。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World