프로그램

PERL 을 이용하여 아주깔끔하게 메일을 보내자

mulderu 2011. 6. 9. 20:03

이 포스트에서는 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;