2008年6月14日土曜日

ActivePerlでyahooにメールを送ろうか

Net::SMTPモジュールを使います。ただデフォルトでauthメソッドを使おうとしてもパケットを投げてくれないので、下のモジュールを新たにppmか何かでインストールして下さい。

次にコーディングに入ります。Net::SMTPについての説明はこちらを参照してください。
メールヘッダについてはTo:だけでいいかと思ったらうまく送信できなかったので、Thunderbirdのパケットをキャプチャしたものを丸パクリします。
Dataヘッダについては何でもいいかと思いますが、一応現在時を取得する方が親切設計でしょう。どれが必要なヘッダか不要なヘッダかは面倒なので調べていません。
Message-IDですがこちらを見る限り何でもいいそうです。好きな命名規則で良いでしょう。
*参考
yahooの鯖はSMTPを拡張したESMTPで運用されています。ESMTPではグリーティングの際にEHLOコマンドを用います。(SMTPではHELOコマンド)
EHLOコマンドでは自分のホストを通知します。Thunderbirdでは

EHLO [192.168.0.6]

とグリーティングしますが、Net::SMTPでは

EHLO localhost.localdomain

とグリーティングします。まあどっちでも構いませんが、、、
http://www.atmarkit.co.jp/fnetwork/rensai/netpro06/netpro01.html


#!/usr/local/bin/perl

use Net::SMTP;

$user="??????";
$passwd="?????????????";
$maildata=<<"END";
Message-ID: <1234567890123456@yahoo.co.jp>
Date: Sat, 14 Jun 2008 09:59:39 +0900
From: uesugi
User-Agent: Thunderbird 2.0.0.14 (Windows/20080421)
MIME-Version: 1.0
To: yahoo
Subject: This Mail Make Perl
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
END


$smtp = Net::SMTP->new('smtp.mail.yahoo.co.jp',Timeout=>30,Debug=>1);


$smtp->auth($user, $passwd) or die "Auth Fail\n";
$smtp->mail('????????????????????@yahoo.co.jp');
$smtp->to('????????????????????@yahoo.co.jp');

$smtp->data();
$smtp->datasend("$maildata");
$smtp->datasend("\n");
$smtp->datasend("A simple test message\n");
$smtp->dataend();

$smtp->quit;


print $smtp->domain,"\n";
$smtp->quit;

1 件のコメント:

hrkey さんのコメント...

余所で拾ったスクリプトを使おうとして
$smtp->auth($user, $passwd)
この先にエラーで進めなかったのですが、ご指摘の通りにppmでNet::SMTP_authをインストールした後は、あっさり実行されました。
ありがとうございました!