이 포스트에서는 PERL 의 MAIL Library를 이용하지 않고
TCP Socket 만 이용하여 메일을 보내는 기능을 구현하고자 하는경우에 해당 됩니다...
(메일로 보낼 MIME Message 이미 작성 되어 있어야 합니다)
#!/usr/bin/perl -w
use IO::Socket;
# TCP Socket Connect , 대충 127.0.0.1 서버에 25번포트에 접속 시도 한다.
$socket = IO::Socket::INET->new(PeerAddr => "127.0.0.1",
PeerPort => 25,
Proto => 'tcp',
Type => SOCK_STREAM)
or die "Cannot open socket!\n";
$SIG{PIPE} = 'handler';
# Trap terminal signals so that we can send a quit packet to the server.
$SIG{INT} = 'handler';
$SIG{QUIT} = 'handler';
# 여기부터 SMTP Client 를 구현 합니다.
# SMTP Client 는 아주 간단한 구조 입니다...
# HELO > MAIL > RCPT > DATA > \n.\n > QUIT
# SMTP Server's Welcome Message Read
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# 예의있게 인사하기
print $socket "HELO mulder\n";
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# 보내는 친구
print $socket "MAIL FROM: <user01\@mulderyu.com>\n";
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# 밭는친구
print $socket "RCPT TO: <user05\@mulderyu.com>\n";
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# 메시지보내기 시작
print $socket "DATA\n";
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# MIME Message-Id 를 간단히 만든다.
my ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime time;
$message00 = readFile ("./sendMailContents.eml");
# MIME Message 를 보낸다.
print $socket "Message-Id: <mulder\@msg$sec$min$hour$mday$mon$year>\n";
print $socket $message00;
print $socket "\n.\n";
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
# Send that quit packet!!
print $socket "QUIT\n"; ####### Send QUIT packet to server.
$inbuf = <$socket>;
chomp $inbuf;
print "S> \"$inbuf\"\n";
close($socket);
# Kill Handler
sub handler
{
my ($signo) = shift;
if ($signo eq "INT" || $signo eq "QUIT")
{
# Send the quit packet on a terminal interrupt!
print $socket "QUIT\n";
close($socket);
exit(1);
}
else ############ SIGPIPE!!
{
print "Server died\n";
exit(2);
}
}
# File을 읽기...
sub readFile
{
my ($filename) = @_;
my $buf;
my $record;
open (CHECKBOOK, $filename) || die "couldn't open the file!";
while ($record = <CHECKBOOK>) {
$buf .= $record;
}
close(CHECKBOOK);
return $buf;
}