[Edit][Create New]
[ IndexPage / ネットとプログラミング / CGI / クライアントプログラムサンプル / smtp.pl ]

smtp.pl

#!/usr/bin/perl

use Socket; 

# URLを解釈する
$hostname = $ARGV[0] or die; 
$port = 25; # ポート番号
$ipaddr = inet_aton($hostname);

# ソケット作成
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die;

# connectする(bindは省略してある)
connect(SOCK, sockaddr_in($port, $ipaddr)) or die;

# バッファリング無効
select(SOCK); $| = 1; select(STDOUT);

#######################################

# SMTPサーバーから送られてくる挨拶を受け取る
$reply = <SOCK>;
die $reply if $reply !~ /^220/;

print SOCK "HELO kaede.to\r\n";
$reply = <SOCK>;
die $reply if $reply !~ /^250/;

# 差出人を聞く
print "from?\n";
chop($from = <STDIN>);

# 差出人をサーバーに確認を取る
print SOCK "MAIL FROM:$from\r\n";
$reply = <SOCK>;
die $reply if $reply !~ /^250/;

# あて先人を聞く
print "to?\n";
chop($to = <STDIN>);

# あて先人をサーバーに確認を取る
print SOCK "RCPT TO:$to\r\n";
$reply = <SOCK>;
die $reply if $reply !~ /^250/;

# データの送信許可を取る
print SOCK "DATA\r\n";
$reply = <SOCK>;
die $reply if $reply !~ /^354/;

print "write mail message.\n";
# データを送信する
while(<STDIN>){
	chop;
	last if $_ eq '.';
	print SOCK "$_\r\n";
}

# データの終了文字を送信する
print SOCK ".\r\n"; # 終わり

# 送れたかどうか確認
$reply = <SOCK>;
die $reply if $reply !~ /^250/;

print "the mail was sent successfully.\n";